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:31 UTC

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

Repository: incubator-trafficcontrol
Updated Branches:
  refs/heads/master 2303ddd40 -> 0bfb2cb73


http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/app/src/common/api/UserService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/app/src/common/api/UserService.js b/traffic_portal/v1/app/src/common/api/UserService.js
new file mode 100755
index 0000000..e393dfa
--- /dev/null
+++ b/traffic_portal/v1/app/src/common/api/UserService.js
@@ -0,0 +1,105 @@
+/*
+
+
+ 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 UserService = function($http, $state, $q, $location, authService, userModel, messageModel, ENV) {
+
+    var service = this;
+
+    this.getCurrentUser = function() {
+        var token = $location.search().token,
+            deferred = $q.defer();
+
+        if (angular.isDefined(token)) {
+            $location.search('token', null); // remove the token query param
+            authService.tokenLogin(token)
+                .then(
+                    function(response) {
+                        service.getCurrentUser();
+                    }
+                );
+        } else {
+            $http.get(ENV.apiEndpoint['1.2'] + "user/current.json")
+                .success(function(result) {
+                    userModel.setUser(result.response);
+                    deferred.resolve(result.response);
+                })
+                .error(function(fault) {
+                    deferred.reject(fault);
+                });
+
+            return deferred.promise;
+        }
+    };
+
+    this.updateCurrentUser = function(userData) {
+        var deferred = $q.defer();
+        var user = _.omit(userData, 'loaded'); // let's pull the loaded key off of there
+        $http.post(ENV.apiEndpoint['1.2'] + "user/current/update", { user: user })
+            .success(function(result) {
+                userModel.setUser(userData);
+                messageModel.setMessages(result.alerts, false);
+                deferred.resolve(result);
+            })
+            .error(function(fault) {
+                if (angular.isDefined(fault.alerts)) {
+                    messageModel.setMessages(fault.alerts, false);
+                }
+                deferred.reject();
+            });
+
+        return deferred.promise;
+    };
+
+    this.resetPassword = function(email) {
+        var deferred = $q.defer();
+        $http.post(
+                ENV.apiEndpoint['1.2'] + "user/reset_password", { email: email })
+            .success(function(result) {
+                messageModel.setMessages(result.alerts, false);
+                deferred.resolve(result);
+            })
+            .error(function(fault) {
+                if (angular.isDefined(fault.alerts)) {
+                    messageModel.setMessages(fault.alerts, false);
+                }
+                deferred.reject();
+            });
+
+        return deferred.promise;
+    };
+
+    this.createUserPurgeJob = function(jobParams) {
+        var deferred = $q.defer();
+        $http.post(ENV.apiEndpoint['1.2'] + "user/current/jobs", jobParams)
+            .success(function(result) {
+                messageModel.setMessages(result.alerts, false);
+                deferred.resolve(result);
+            })
+            .error(function(fault) {
+                if (angular.isDefined(fault.alerts)) {
+                    messageModel.setMessages(fault.alerts, false);
+                }
+                deferred.reject();
+            });
+
+        return deferred.promise;
+    };
+
+};
+
+UserService.$inject = ['$http', '$state', '$q', '$location', 'authService', 'userModel', 'messageModel', 'ENV'];
+module.exports = UserService;
\ No newline at end of file


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html
new file mode 100644
index 0000000..42600b8
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html
@@ -0,0 +1,457 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
+            <li class="active">{{deliveryServiceName}}</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <div class="btn-group" role="group" uib-dropdown is-open="keys.isopen">
+                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    <i class="fa fa-key"></i>&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="manageSslKeys()">Manage SSL Keys</a></li>
+                    <li role="menuitem"><a ng-click="manageUrlSigKeys()">Manage URL Sig Keys</a></li>
+                </ul>
+            </div>
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="viewServers()">View Servers</a></li>
+                    <li role="menuitem"><a ng-click="viewRegexes()">View Regexes</a></li>
+                    <li role="menuitem"><a ng-click="viewJobs()">View Invalidate Content Jobs</a></li>
+                    <li role="menuitem"><a ng-click="viewStaticDnsEntries()">View Static DNS Entries</a></li>
+                </ul>
+            </div>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="deliveryServiceForm" class="form-horizontal form-label-left" novalidate>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.type.id), 'has-feedback': hasError(deliveryServiceForm.type.id)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Content Routing Type *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="type" name="type" class="form-control" ng-model="deliveryService.typeId" ng-options="type.id as type.name for type in types" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.type, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.xmlId), 'has-feedback': hasError(deliveryServiceForm.xmlId)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">XML ID *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="xmlId" name="xmlId" type="text" class="form-control" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">No spaces</small>
+                    <span ng-show="hasError(deliveryServiceForm.xmlId)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.displayName), 'has-feedback': hasError(deliveryServiceForm.displayName)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Display Name *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="displayName" name="displayName" type="text" class="form-control" ng-model="deliveryService.displayName" ng-required="true" ng-maxlength="48" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.displayName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.active), 'has-feedback': hasError(deliveryServiceForm.active)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Active *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="active" name="active" class="form-control" ng-model="deliveryService.active" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.active, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cdn), 'has-feedback': hasError(deliveryServiceForm.cdn)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="cdn" name="cdn" class="form-control" ng-model="deliveryService.cdnId" ng-options="cdn.id as cdn.name for cdn in cdns" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cdn, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.protocol), 'has-feedback': hasError(deliveryServiceForm.protocol)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Protocol *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="protocol" name="protocol" class="form-control" ng-model="deliveryService.protocol" ng-options="protocol.value as protocol.label for protocol in protocols" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.protocol, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dscp), 'has-feedback': hasError(deliveryServiceForm.dscp)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">DSCP Tag *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="dscp" name="dscp" class="form-control" ng-model="deliveryService.dscp" ng-options="dcsp.value as dcsp.label for dcsp in dscps" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dscp, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.signed), 'has-feedback': hasError(deliveryServiceForm.signed)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Signed URLs *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="signed" name="signed" class="form-control" ng-model="deliveryService.signed" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.signed, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.qstringIgnore), 'has-feedback': hasError(deliveryServiceForm.qstringIgnore)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Query String Handling *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="qstringIgnore" name="qstringIgnore" class="form-control" ng-model="deliveryService.qstringIgnore" ng-options="qs.value as qs.label for qs in qStrings" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.qstringIgnore, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimit), 'has-feedback': hasError(deliveryServiceForm.geoLimit)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="geoLimit" name="geoLimit" class="form-control" ng-model="deliveryService.geoLimit" ng-options="gl.value as gl.label for gl in geoLimits" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimit, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimitCountries), 'has-feedback': hasError(deliveryServiceForm.geoLimitCountries)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Countries</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="geoLimitCountries" name="geoLimitCountries" type="text" class="form-control" ng-model="deliveryService.geoLimitCountries" ng-maxlength="255" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimitCountries, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.geoLimitCountries)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoProvider), 'has-feedback': hasError(deliveryServiceForm.geoProvider)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Provider *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="geoProvider" name="geoProvider" class="form-control" ng-model="deliveryService.geoProvider" ng-options="gp.value as gp.label for gp in geoProviders" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoProvider, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geolimitRedirectUrl), 'has-feedback': hasError(deliveryServiceForm.geolimitRedirectUrl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Redirect URL</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="geolimitRedirectUrl" name="geolimitRedirectUrl" type="text" class="form-control" ng-model="deliveryService.geolimitRedirectUrl" ng-maxlength="255" ng-pattern="/^(https?:\/\/)/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geolimitRedirectUrl, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geolimitRedirectUrl, 'pattern')">Must start with http:// or https://</small>
+                    <span ng-show="hasError(deliveryServiceForm.geolimitRedirectUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ipv6RoutingEnabled), 'has-feedback': hasError(deliveryServiceForm.ipv6RoutingEnabled)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">IPv6 Routing Enabled *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="ipv6RoutingEnabled" name="ipv6RoutingEnabled" class="form-control" ng-model="deliveryService.ipv6RoutingEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ipv6RoutingEnabled, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.rangeRequestHandling), 'has-feedback': hasError(deliveryServiceForm.rangeRequestHandling)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Range Request Handling *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="rangeRequestHandling" name="rangeRequestHandling" class="form-control" ng-model="deliveryService.rangeRequestHandling" ng-options="rrh.value as rrh.label for rrh in rrhs" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.rangeRequestHandling, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dnsBypassIp), 'has-feedback': hasError(deliveryServiceForm.dnsBypassIp)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">DNS Bypass IP</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="dnsBypassIp" name="dnsBypassIp" type="text" class="form-control" ng-model="deliveryService.dnsBypassIp" ng-maxlength="45" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dnsBypassIp, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.dnsBypassIp)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dnsBypassIp6), 'has-feedback': hasError(deliveryServiceForm.dnsBypassIp6)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">DNS Bypass IPv6</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="dnsBypassIp6" name="dnsBypassIp6" type="text" class="form-control" ng-model="deliveryService.dnsBypassIp6" ng-maxlength="45" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dnsBypassIp6, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.dnsBypassIp6)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dnsBypassCname), 'has-feedback': hasError(deliveryServiceForm.dnsBypassCname)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">DNS Bypass Cname</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="dnsBypassCname" name="dnsBypassCname" type="text" class="form-control" ng-model="deliveryService.dnsBypassCname" ng-maxlength="255" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dnsBypassCname, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.dnsBypassCname)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dnsBypassTtl), 'has-feedback': hasError(deliveryServiceForm.dnsBypassTtl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">DNS Bypass TTL</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="dnsBypassTtl" name="dnsBypassTtl" type="text" class="form-control" ng-model="deliveryService.dnsBypassTtl" ng-maxlength="11" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dnsBypassTtl, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.dnsBypassTtl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.maxDNSAnswers), 'has-feedback': hasError(deliveryServiceForm.maxDNSAnswers)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Max DNS Answers</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="maxDNSAnswers" name="maxDNSAnswers" type="text" class="form-control" ng-model="deliveryService.maxDNSAnswers" ng-maxlength="11" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.maxDNSAnswers, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.maxDNSAnswers)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ccrDNSTtl), 'has-feedback': hasError(deliveryServiceForm.ccrDNSTtl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service DNS TTL</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="ccrDNSTtl" name="ccrDNSTtl" type="text" class="form-control" ng-model="deliveryService.ccrDNSTtl" ng-maxlength="11" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ccrDNSTtl, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.ccrDNSTtl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.orgServerFqdn), 'has-feedback': hasError(deliveryServiceForm.orgServerFqdn)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Origin Server Base URL *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="orgServerFqdn" name="orgServerFqdn" type="text" class="form-control" ng-model="deliveryService.orgServerFqdn" ng-maxlength="255" ng-pattern="/^(https?:\/\/)/" required autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.orgServerFqdn, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.orgServerFqdn, 'pattern')">Must start with http:// or https://</small>
+                    <span ng-show="hasError(deliveryServiceForm.orgServerFqdn)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.multiSiteOrigin), 'has-feedback': hasError(deliveryServiceForm.multiSiteOrigin)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Use Multi Site Origin Feature *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="multiSiteOrigin" name="multiSiteOrigin" class="form-control" ng-model="deliveryService.multiSiteOrigin" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.multiSiteOrigin, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.profile), 'has-feedback': hasError(deliveryServiceForm.profile)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Profile</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="profile" name="profile" class="form-control" ng-model="deliveryService.profileId" ng-options="profile.id as profile.name for profile in profiles">
+                        <option value="">Select...</option>
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.globalMaxMbps), 'has-feedback': hasError(deliveryServiceForm.globalMaxMbps)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Global Max Mbps</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="globalMaxMbps" name="globalMaxMbps" type="text" class="form-control" ng-model="deliveryService.globalMaxMbps" ng-maxlength="11" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.globalMaxMbps, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.globalMaxMbps)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.globalMaxTps), 'has-feedback': hasError(deliveryServiceForm.globalMaxTps)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Global Max TPS</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="globalMaxTps" name="globalMaxTps" type="text" class="form-control" ng-model="deliveryService.globalMaxTps" ng-maxlength="11" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.globalMaxTps, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.globalMaxTps)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.missLat), 'has-feedback': hasError(deliveryServiceForm.missLat)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Miss Default Latitude</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="missLat" name="missLat" type="text" class="form-control" ng-model="deliveryService.missLat" ng-maxlength="11" ng-pattern="/^[-+]?[0-9]*\.?[0-9]+$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.missLat, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">Invalid coordinate</small>
+                    <span ng-show="hasError(deliveryServiceForm.missLat)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.missLong), 'has-feedback': hasError(deliveryServiceForm.missLong)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Miss Default Longitude</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="missLong" name="missLong" type="text" class="form-control" ng-model="deliveryService.missLong" ng-maxlength="11" ng-pattern="/^[-+]?[0-9]*\.?[0-9]+$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.missLong, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">Invalid coordinate</small>
+                    <span ng-show="hasError(deliveryServiceForm.missLong)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.edgeHeaderRewrite), 'has-feedback': hasError(deliveryServiceForm.edgeHeaderRewrite)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Edge Header Rewrite Rules</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="edgeHeaderRewrite" name="edgeHeaderRewrite" type="text" class="form-control" ng-model="deliveryService.edgeHeaderRewrite" ng-maxlength="2048" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.edgeHeaderRewrite, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.edgeHeaderRewrite)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.midHeaderRewrite), 'has-feedback': hasError(deliveryServiceForm.midHeaderRewrite)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Mid Header Rewrite Rules</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="midHeaderRewrite" name="midHeaderRewrite" type="text" class="form-control" ng-model="deliveryService.midHeaderRewrite" ng-maxlength="2048" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.midHeaderRewrite, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.midHeaderRewrite)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trResponseHeaders), 'has-feedback': hasError(deliveryServiceForm.trResponseHeaders)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Additional Response Headers</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="trResponseHeaders" name="trResponseHeaders" type="text" class="form-control" ng-model="deliveryService.trResponseHeaders" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trResponseHeaders, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.trResponseHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trRequestHeaders), 'has-feedback': hasError(deliveryServiceForm.trRequestHeaders)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Log Request Headers</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="trRequestHeaders" name="trRequestHeaders" type="text" class="form-control" ng-model="deliveryService.trRequestHeaders" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trRequestHeaders, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.trRequestHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.regexRemap), 'has-feedback': hasError(deliveryServiceForm.regexRemap)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Regex remap expression</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="regexRemap" name="regexRemap" type="text" class="form-control" ng-model="deliveryService.regexRemap" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.regexRemap, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.regexRemap)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cacheurl), 'has-feedback': hasError(deliveryServiceForm.cacheurl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Cache URL expression</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="cacheurl" name="cacheurl" type="text" class="form-control" ng-model="deliveryService.cacheurl" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cacheurl, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.cacheurl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.remapText), 'has-feedback': hasError(deliveryServiceForm.remapText)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Raw remap text</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="remapText" name="remapText" type="text" class="form-control" ng-model="deliveryService.remapText" ng-maxlength="2048" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.remapText, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.remapText)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc), 'has-feedback': hasError(deliveryServiceForm.longDesc)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="longDesc" name="longDesc" type="text" class="form-control" ng-model="deliveryService.longDesc" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.longDesc)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc1), 'has-feedback': hasError(deliveryServiceForm.longDesc1)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 1</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="longDesc1" name="longDesc1" type="text" class="form-control" ng-model="deliveryService.longDesc1" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc1, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.longDesc1)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc2), 'has-feedback': hasError(deliveryServiceForm.longDesc2)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 2</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="longDesc2" name="longDesc2" type="text" class="form-control" ng-model="deliveryService.longDesc2" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc2, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.longDesc2)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.infoUrl), 'has-feedback': hasError(deliveryServiceForm.infoUrl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Info URL</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="infoUrl" name="infoUrl" type="text" class="form-control" ng-model="deliveryService.infoUrl" ng-maxlength="255" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.infoUrl, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.infoUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.checkPath), 'has-feedback': hasError(deliveryServiceForm.checkPath)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Check Path</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="checkPath" name="checkPath" type="text" class="form-control" ng-model="deliveryService.checkPath" ng-maxlength="255" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.checkPath, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.checkPath)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.originShield), 'has-feedback': hasError(deliveryServiceForm.originShield)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Origin Shield (Pipe Delimited String)</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="originShield" name="originShield" type="text" class="form-control" ng-model="deliveryService.originShield" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.originShield, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.originShield)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.sslKeyVersion), 'has-feedback': hasError(deliveryServiceForm.sslKeyVersion)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">SSL Key Version</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="sslKeyVersion" name="sslKeyVersion" type="text" class="form-control" ng-model="deliveryService.sslKeyVersion" ng-maxlength="11" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.sslKeyVersion, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.sslKeyVersion)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.regionalGeoBlocking), 'has-feedback': hasError(deliveryServiceForm.regionalGeoBlocking)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Regional Geoblocking *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="regionalGeoBlocking" name="regionalGeoBlocking" class="form-control" ng-model="deliveryService.regionalGeoBlocking" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.regionalGeoBlocking, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.logsEnabled), 'has-feedback': hasError(deliveryServiceForm.logsEnabled)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Logs Enabled *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="logsEnabled" name="logsEnabled" class="form-control" ng-model="deliveryService.logsEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.logsEnabled, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(deliveryService)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html
new file mode 100644
index 0000000..8d26395
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html
@@ -0,0 +1,420 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
+            <li class="active">{{deliveryServiceName}}</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <div class="btn-group" role="group" uib-dropdown is-open="keys.isopen">
+                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    <i class="fa fa-key"></i>&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="manageSslKeys()">Manage SSL Keys</a></li>
+                    <li role="menuitem"><a ng-click="manageUrlSigKeys()">Manage URL Sig Keys</a></li>
+                </ul>
+            </div>
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="viewServers()">View Servers</a></li>
+                    <li role="menuitem"><a ng-click="viewRegexes()">View Regexes</a></li>
+                    <li role="menuitem"><a ng-click="viewJobs()">View Invalidate Content Jobs</a></li>
+                    <li role="menuitem"><a ng-click="viewStaticDnsEntries()">View Static DNS Entries</a></li>
+                </ul>
+            </div>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="deliveryServiceForm" class="form-horizontal form-label-left" novalidate>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.type.id), 'has-feedback': hasError(deliveryServiceForm.type.id)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Content Routing Type *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="type" name="type" class="form-control" ng-model="deliveryService.typeId" ng-options="type.id as type.name for type in types" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.type, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.xmlId), 'has-feedback': hasError(deliveryServiceForm.xmlId)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">XML ID *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="xmlId" name="xmlId" type="text" class="form-control" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">No spaces</small>
+                    <span ng-show="hasError(deliveryServiceForm.xmlId)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.displayName), 'has-feedback': hasError(deliveryServiceForm.displayName)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Display Name *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="displayName" name="displayName" type="text" class="form-control" ng-model="deliveryService.displayName" ng-required="true" ng-maxlength="48" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.displayName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.active), 'has-feedback': hasError(deliveryServiceForm.active)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Active *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="active" name="active" class="form-control" ng-model="deliveryService.active" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.active, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cdn), 'has-feedback': hasError(deliveryServiceForm.cdn)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="cdn" name="cdn" class="form-control" ng-model="deliveryService.cdnId" ng-options="cdn.id as cdn.name for cdn in cdns" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cdn, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.protocol), 'has-feedback': hasError(deliveryServiceForm.protocol)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Protocol *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="protocol" name="protocol" class="form-control" ng-model="deliveryService.protocol" ng-options="protocol.value as protocol.label for protocol in protocols" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.protocol, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dscp), 'has-feedback': hasError(deliveryServiceForm.dscp)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">DSCP Tag *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="dscp" name="dscp" class="form-control" ng-model="deliveryService.dscp" ng-options="dcsp.value as dcsp.label for dcsp in dscps" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dscp, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.signed), 'has-feedback': hasError(deliveryServiceForm.signed)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Signed URLs *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="signed" name="signed" class="form-control" ng-model="deliveryService.signed" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.signed, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.qstringIgnore), 'has-feedback': hasError(deliveryServiceForm.qstringIgnore)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Query String Handling *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="qstringIgnore" name="qstringIgnore" class="form-control" ng-model="deliveryService.qstringIgnore" ng-options="qs.value as qs.label for qs in qStrings" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.qstringIgnore, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimit), 'has-feedback': hasError(deliveryServiceForm.geoLimit)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="geoLimit" name="geoLimit" class="form-control" ng-model="deliveryService.geoLimit" ng-options="gl.value as gl.label for gl in geoLimits" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimit, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimitCountries), 'has-feedback': hasError(deliveryServiceForm.geoLimitCountries)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Countries</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="geoLimitCountries" name="geoLimitCountries" type="text" class="form-control" ng-model="deliveryService.geoLimitCountries" ng-maxlength="255" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimitCountries, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.geoLimitCountries)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoProvider), 'has-feedback': hasError(deliveryServiceForm.geoProvider)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Provider *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="geoProvider" name="geoProvider" class="form-control" ng-model="deliveryService.geoProvider" ng-options="gp.value as gp.label for gp in geoProviders" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoProvider, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geolimitRedirectUrl), 'has-feedback': hasError(deliveryServiceForm.geolimitRedirectUrl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Redirect URL</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="geolimitRedirectUrl" name="geolimitRedirectUrl" type="text" class="form-control" ng-model="deliveryService.geolimitRedirectUrl" ng-maxlength="255" ng-pattern="/^(https?:\/\/)/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geolimitRedirectUrl, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geolimitRedirectUrl, 'pattern')">Must start with http:// or https://</small>
+                    <span ng-show="hasError(deliveryServiceForm.geolimitRedirectUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.httpBypassFqdn), 'has-feedback': hasError(deliveryServiceForm.httpBypassFqdn)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">HTTP Bypass FQDN</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="httpBypassFqdn" name="httpBypassFqdn" type="text" class="form-control" ng-model="deliveryService.httpBypassFqdn" ng-maxlength="255" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.httpBypassFqdn, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.httpBypassFqdn)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.initialDispersion), 'has-feedback': hasError(deliveryServiceForm.initialDispersion)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Initial Dispersion *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="initialDispersion" name="initialDispersion" class="form-control" ng-model="deliveryService.initialDispersion" ng-options="disp.value as disp.label for disp in dispersions" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.initialDispersion, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ipv6RoutingEnabled), 'has-feedback': hasError(deliveryServiceForm.ipv6RoutingEnabled)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">IPv6 Routing Enabled *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="ipv6RoutingEnabled" name="ipv6RoutingEnabled" class="form-control" ng-model="deliveryService.ipv6RoutingEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ipv6RoutingEnabled, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.rangeRequestHandling), 'has-feedback': hasError(deliveryServiceForm.rangeRequestHandling)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Range Request Handling *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="rangeRequestHandling" name="rangeRequestHandling" class="form-control" ng-model="deliveryService.rangeRequestHandling" ng-options="rrh.value as rrh.label for rrh in rrhs" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.rangeRequestHandling, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.orgServerFqdn), 'has-feedback': hasError(deliveryServiceForm.orgServerFqdn)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Origin Server Base URL *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="orgServerFqdn" name="orgServerFqdn" type="text" class="form-control" ng-model="deliveryService.orgServerFqdn" ng-maxlength="255" ng-pattern="/^(https?:\/\/)/" required autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.orgServerFqdn, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.orgServerFqdn, 'pattern')">Must start with http:// or https://</small>
+                    <span ng-show="hasError(deliveryServiceForm.orgServerFqdn)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.multiSiteOrigin), 'has-feedback': hasError(deliveryServiceForm.multiSiteOrigin)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Use Multi Site Origin Feature *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="multiSiteOrigin" name="multiSiteOrigin" class="form-control" ng-model="deliveryService.multiSiteOrigin" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.multiSiteOrigin, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.profile), 'has-feedback': hasError(deliveryServiceForm.profile)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Profile</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="profile" name="profile" class="form-control" ng-model="deliveryService.profileId" ng-options="profile.id as profile.name for profile in profiles">
+                        <option value="">Select...</option>
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.globalMaxMbps), 'has-feedback': hasError(deliveryServiceForm.globalMaxMbps)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Global Max Mbps</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="globalMaxMbps" name="globalMaxMbps" type="text" class="form-control" ng-model="deliveryService.globalMaxMbps" ng-maxlength="11" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.globalMaxMbps, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.globalMaxMbps)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.globalMaxTps), 'has-feedback': hasError(deliveryServiceForm.globalMaxTps)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Global Max TPS</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="globalMaxTps" name="globalMaxTps" type="text" class="form-control" ng-model="deliveryService.globalMaxTps" ng-maxlength="11" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.globalMaxTps, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.globalMaxTps)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.missLat), 'has-feedback': hasError(deliveryServiceForm.missLat)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Miss Default Latitude</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="missLat" name="missLat" type="text" class="form-control" ng-model="deliveryService.missLat" ng-maxlength="11" ng-pattern="/^[-+]?[0-9]*\.?[0-9]+$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.missLat, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">Invalid coordinate</small>
+                    <span ng-show="hasError(deliveryServiceForm.missLat)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.missLong), 'has-feedback': hasError(deliveryServiceForm.missLong)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Miss Default Longitude</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="missLong" name="missLong" type="text" class="form-control" ng-model="deliveryService.missLong" ng-maxlength="11" ng-pattern="/^[-+]?[0-9]*\.?[0-9]+$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.missLong, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">Invalid coordinate</small>
+                    <span ng-show="hasError(deliveryServiceForm.missLong)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.edgeHeaderRewrite), 'has-feedback': hasError(deliveryServiceForm.edgeHeaderRewrite)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Edge Header Rewrite Rules</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="edgeHeaderRewrite" name="edgeHeaderRewrite" type="text" class="form-control" ng-model="deliveryService.edgeHeaderRewrite" ng-maxlength="2048" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.edgeHeaderRewrite, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.edgeHeaderRewrite)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.midHeaderRewrite), 'has-feedback': hasError(deliveryServiceForm.midHeaderRewrite)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Mid Header Rewrite Rules</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="midHeaderRewrite" name="midHeaderRewrite" type="text" class="form-control" ng-model="deliveryService.midHeaderRewrite" ng-maxlength="2048" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.midHeaderRewrite, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.midHeaderRewrite)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trResponseHeaders), 'has-feedback': hasError(deliveryServiceForm.trResponseHeaders)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Additional Response Headers</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="trResponseHeaders" name="trResponseHeaders" type="text" class="form-control" ng-model="deliveryService.trResponseHeaders" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trResponseHeaders, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.trResponseHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trRequestHeaders), 'has-feedback': hasError(deliveryServiceForm.trRequestHeaders)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Log Request Headers</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="trRequestHeaders" name="trRequestHeaders" type="text" class="form-control" ng-model="deliveryService.trRequestHeaders" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trRequestHeaders, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.trRequestHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.regexRemap), 'has-feedback': hasError(deliveryServiceForm.regexRemap)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Regex remap expression</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="regexRemap" name="regexRemap" type="text" class="form-control" ng-model="deliveryService.regexRemap" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.regexRemap, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.regexRemap)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cacheurl), 'has-feedback': hasError(deliveryServiceForm.cacheurl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Cache URL expression</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="cacheurl" name="cacheurl" type="text" class="form-control" ng-model="deliveryService.cacheurl" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cacheurl, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.cacheurl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.remapText), 'has-feedback': hasError(deliveryServiceForm.remapText)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Raw remap text</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="remapText" name="remapText" type="text" class="form-control" ng-model="deliveryService.remapText" ng-maxlength="2048" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.remapText, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.remapText)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc), 'has-feedback': hasError(deliveryServiceForm.longDesc)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="longDesc" name="longDesc" type="text" class="form-control" ng-model="deliveryService.longDesc" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.longDesc)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc1), 'has-feedback': hasError(deliveryServiceForm.longDesc1)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 1</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="longDesc1" name="longDesc1" type="text" class="form-control" ng-model="deliveryService.longDesc1" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc1, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.longDesc1)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc2), 'has-feedback': hasError(deliveryServiceForm.longDesc2)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 2</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="longDesc2" name="longDesc2" type="text" class="form-control" ng-model="deliveryService.longDesc2" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc2, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.longDesc2)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.infoUrl), 'has-feedback': hasError(deliveryServiceForm.infoUrl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Info URL</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="infoUrl" name="infoUrl" type="text" class="form-control" ng-model="deliveryService.infoUrl" ng-maxlength="255" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.infoUrl, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.infoUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.checkPath), 'has-feedback': hasError(deliveryServiceForm.checkPath)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Check Path</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="checkPath" name="checkPath" type="text" class="form-control" ng-model="deliveryService.checkPath" ng-maxlength="255" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.checkPath, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.checkPath)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.originShield), 'has-feedback': hasError(deliveryServiceForm.originShield)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Origin Shield (Pipe Delimited String)</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="originShield" name="originShield" type="text" class="form-control" ng-model="deliveryService.originShield" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.originShield, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.originShield)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.sslKeyVersion), 'has-feedback': hasError(deliveryServiceForm.sslKeyVersion)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">SSL Key Version</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="sslKeyVersion" name="sslKeyVersion" type="text" class="form-control" ng-model="deliveryService.sslKeyVersion" ng-maxlength="11" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.sslKeyVersion, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.sslKeyVersion)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.regionalGeoBlocking), 'has-feedback': hasError(deliveryServiceForm.regionalGeoBlocking)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Regional Geoblocking *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="regionalGeoBlocking" name="regionalGeoBlocking" class="form-control" ng-model="deliveryService.regionalGeoBlocking" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.regionalGeoBlocking, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.logsEnabled), 'has-feedback': hasError(deliveryServiceForm.logsEnabled)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Logs Enabled *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="logsEnabled" name="logsEnabled" class="form-control" ng-model="deliveryService.logsEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.logsEnabled, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(deliveryService)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>


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

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/regions/RegionsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/regions/RegionsController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/regions/RegionsController.js
deleted file mode 100644
index 002d01e..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/regions/RegionsController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var RegionsController = function() {
-};
-
-RegionsController.$inject = [];
-module.exports = RegionsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/regions/_regions.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/regions/_regions.scss b/traffic_ops/experimental/ui/app/src/modules/private/admin/regions/_regions.scss
deleted file mode 100644
index d57b9c6..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/regions/_regions.scss
+++ /dev/null
@@ -1,16 +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_ops/experimental/ui/app/src/modules/private/admin/regions/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/regions/edit/index.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/regions/edit/index.js
deleted file mode 100644
index 2373fd8..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/regions/edit/index.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.private.admin.regions.edit', [])
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.admin.regions.edit', {
-                url: '/{regionId:[0-9]{1,8}}',
-                views: {
-                    regionsContent: {
-                        templateUrl: 'common/modules/form/region/form.region.tpl.html',
-                        controller: 'FormEditRegionController',
-                        resolve: {
-                            region: function($stateParams, regionService) {
-                                return regionService.getRegion($stateParams.regionId);
-                            }
-                        }
-                    }
-                }
-            })
-        ;
-        $urlRouterProvider.otherwise('/');
-    });

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/statuses/StatusesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/statuses/StatusesController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/statuses/StatusesController.js
deleted file mode 100644
index f25aedf..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/statuses/StatusesController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var StatusesController = function() {
-};
-
-StatusesController.$inject = [];
-module.exports = StatusesController;

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

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/tenants/TenantsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/tenants/TenantsController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/tenants/TenantsController.js
deleted file mode 100644
index 0657d69..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/tenants/TenantsController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TenantsController = function() {
-};
-
-TenantsController.$inject = [];
-module.exports = TenantsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/tenants/_tenants.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/tenants/_tenants.scss b/traffic_ops/experimental/ui/app/src/modules/private/admin/tenants/_tenants.scss
deleted file mode 100644
index d57b9c6..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/tenants/_tenants.scss
+++ /dev/null
@@ -1,16 +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_ops/experimental/ui/app/src/modules/private/admin/tenants/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/tenants/edit/index.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/tenants/edit/index.js
deleted file mode 100644
index f066098..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/tenants/edit/index.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.private.admin.tenants.edit', [])
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.admin.tenants.edit', {
-                url: '/{tenantId:[0-9]{1,8}}',
-                views: {
-                    tenantsContent: {
-                        templateUrl: 'common/modules/form/tenant/form.tenant.tpl.html',
-                        controller: 'FormEditTenantController',
-                        resolve: {
-                            tenant: function($stateParams, tenantService) {
-                                return tenantService.getTenant($stateParams.tenantId);
-                            }
-                        }
-                    }
-                }
-            })
-        ;
-        $urlRouterProvider.otherwise('/');
-    });

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/types/TypesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/types/TypesController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/types/TypesController.js
deleted file mode 100644
index 0325631..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/types/TypesController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TypesController = function() {
-};
-
-TypesController.$inject = [];
-module.exports = TypesController;

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

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

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/types/staticDnsEntries/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/types/staticDnsEntries/index.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/types/staticDnsEntries/index.js
deleted file mode 100644
index f0cba95..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/types/staticDnsEntries/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.private.admin.types.staticDnsEntries', [])
-	.config(function($stateProvider, $urlRouterProvider) {
-		$stateProvider
-			.state('trafficPortal.private.admin.types.staticDnsEntries', {
-				url: '/{typeId}/static-dns-entries',
-				views: {
-					typesContent: {
-						templateUrl: 'common/modules/table/typeStaticDnsEntries/table.typeStaticDnsEntries.tpl.html',
-						controller: 'TableTypeStaticDnsEntriesController',
-						resolve: {
-							type: function($stateParams, typeService) {
-								return typeService.getType($stateParams.typeId);
-							},
-							staticDnsEntries: function(type, staticDnsEntryService) {
-								return staticDnsEntryService.getStaticDnsEntries({ type: type.name });
-							}
-						}
-					}
-				}
-			})
-		;
-		$urlRouterProvider.otherwise('/');
-	});

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/users/UsersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/users/UsersController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/users/UsersController.js
deleted file mode 100644
index 5e51dbf..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/users/UsersController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var UsersController = function() {
-};
-
-UsersController.$inject = [];
-module.exports = UsersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/users/_users.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/users/_users.scss b/traffic_ops/experimental/ui/app/src/modules/private/admin/users/_users.scss
deleted file mode 100644
index d57b9c6..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/users/_users.scss
+++ /dev/null
@@ -1,16 +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_ops/experimental/ui/app/src/modules/private/admin/users/deliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/users/deliveryServices/index.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/users/deliveryServices/index.js
deleted file mode 100644
index 7412911..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/users/deliveryServices/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.private.admin.users.deliveryServices', [])
-	.config(function($stateProvider, $urlRouterProvider) {
-		$stateProvider
-			.state('trafficPortal.private.admin.users.deliveryServices', {
-				url: '/{userId}/delivery-services',
-				views: {
-					usersContent: {
-						templateUrl: 'common/modules/table/userDeliveryServices/table.userDeliveryServices.tpl.html',
-						controller: 'TableUserDeliveryServicesController',
-						resolve: {
-							user: function($stateParams, userService) {
-								return userService.getUser($stateParams.userId);
-							},
-							userDeliveryServices: function($stateParams, deliveryServiceService) {
-								return deliveryServiceService.getUserDeliveryServices($stateParams.userId);
-							}
-						}
-					}
-				}
-			})
-		;
-		$urlRouterProvider.otherwise('/');
-	});

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/configure/ConfigureController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/ConfigureController.js b/traffic_ops/experimental/ui/app/src/modules/private/configure/ConfigureController.js
deleted file mode 100644
index 2e1f17c..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/ConfigureController.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ConfigureController = function($scope, $location) {
-
-    $scope.navigateToPath = function(path) {
-        $location.url(path);
-    };
-
-};
-
-ConfigureController.$inject = ['$scope', '$location'];
-module.exports = ConfigureController;



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/capacity/_widget.capacity.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/capacity/_widget.capacity.scss b/traffic_portal/app/src/common/modules/widget/capacity/_widget.capacity.scss
new file mode 100644
index 0000000..a275546
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/capacity/_widget.capacity.scss
@@ -0,0 +1,31 @@
+/*
+
+
+ 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.
+
+*/
+
+#capacityChart {
+  left: 0px;
+  top: 0px;
+  width: 200px;
+  height: 200px;
+}
+.capacityChartTooltip {
+  padding: 3px 5px;
+  background-color: #000;
+  z-index: 100;
+  color: #fff;
+  opacity: .80;
+  filter: alpha(opacity=85);
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/capacity/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/capacity/index.js b/traffic_portal/app/src/common/modules/widget/capacity/index.js
new file mode 100644
index 0000000..9533f6b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/capacity/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.widget.capacity', [])
+	.controller('WidgetCapacityController', require('./WidgetCapacityController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/capacity/widget.capacity.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/capacity/widget.capacity.tpl.html b/traffic_portal/app/src/common/modules/widget/capacity/widget.capacity.tpl.html
new file mode 100644
index 0000000..8dd89e2
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/capacity/widget.capacity.tpl.html
@@ -0,0 +1,64 @@
+<!--
+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="x_title">
+    <h2>Overall Capacity</h2>
+    <ul class="nav navbar-right panel_toolbox">
+        <li><a class="collapse-link"><i class="fa fa-chevron-up"></i></a></li>
+        <li><a class="close-link"><i class="fa fa-close"></i></a></li>
+    </ul>
+    <div class="clearfix"></div>
+</div>
+<div class="x_content">
+    <table class="" style="width:100%">
+        <tr>
+            <td>
+                <div id="capacityChart"></div>
+            </td>
+            <td>
+                <table class="tile_info">
+                    <tr>
+                        <td>
+                            <p><i class="fa fa-square green"></i>Available</p>
+                        </td>
+                        <td>{{availablePercent | number:2}}%</td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <p><i class="fa fa-square blue"></i>Utilized</p>
+                        </td>
+                        <td>{{utilizedPercent | number:2}}%</td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <p><i class="fa fa-square gray"></i>Maintenance</p>
+                        </td>
+                        <td>{{maintenancePercent | number:2}}%</td>
+                    </tr>
+                    <tr>
+                        <td>
+                            <p><i class="fa fa-square red"></i>Down</p>
+                        </td>
+                        <td>{{unavailablePercent | number:2}}%</td>
+                    </tr>
+                </table>
+            </td>
+        </tr>
+    </table>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/cdnChart/WidgetCDNChartController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/cdnChart/WidgetCDNChartController.js b/traffic_portal/app/src/common/modules/widget/cdnChart/WidgetCDNChartController.js
new file mode 100644
index 0000000..286ba4e
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/cdnChart/WidgetCDNChartController.js
@@ -0,0 +1,186 @@
+/*
+ * 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 WidgetCDNChartController = function(cdn, $scope, $timeout, $filter, $q, cdnService, cacheStatsService, dateUtils, locationUtils, numberUtils) {
+
+	var chartSeries,
+		chartOptions;
+
+	var getCDN = function(id) {
+		cdnService.getCDN(id)
+			.then(function(result) {
+				$scope.cdn = result;
+				registerResizeListener();
+				getCurrentStats($scope.cdn.name);
+				getChartData($scope.cdn.name, moment().subtract(1, 'days'), moment().subtract(10, 'seconds'));
+			});
+	};
+
+	var getCurrentStats = function(cdnName) {
+		cdnService.getCurrentStats()
+			.then(function(result) {
+				$scope.currentStats = _.find(result.currentStats, function(item) {
+					return item.cdn == cdnName;
+				});
+			});
+	};
+
+	var getChartData = function(cdnName, start, end) {
+		var promises = [];
+
+		// get cdn bandwidth
+		promises.push(cacheStatsService.getBandwidth(cdnName, start, end));
+
+		// get cdn connections
+		promises.push(cacheStatsService.getConnections(cdnName, start, end));
+
+		$q.all(promises)
+			.then(
+				function(responses) {
+					// set chart data
+					var bandwidthChartData = buildBandwidthChartData(responses[0], start),
+						connectionsChartData = buildConnectionsChartData(responses[1], start);
+
+					$timeout(function () {
+						buildChart(bandwidthChartData, connectionsChartData);
+					}, 100);
+				},
+				function(fault) {
+					buildChart([], []); // build an empty chart
+				});
+
+	};
+
+	var buildBandwidthChartData = function(result, start) {
+		var normalizedChartData = [],
+			series = result.series;
+
+		if (angular.isDefined(series)) {
+			_.each(series.values, function(seriesItem) {
+				if (moment(seriesItem[0]).isSame(start) || moment(seriesItem[0]).isAfter(start)) {
+					normalizedChartData.push([ moment(seriesItem[0]).valueOf(), numberUtils.convertTo(seriesItem[1], $scope.unitSize) ]); // converts data to appropriate unit
+				}
+			});
+		}
+
+		return normalizedChartData;
+	};
+
+	var buildConnectionsChartData = function(result, start) {
+		var normalizedChartData = [],
+			series = result.series;
+
+		if (angular.isDefined(series)) {
+			_.each(series.values, function(seriesItem) {
+				if (moment(seriesItem[0]).isSame(start) || moment(seriesItem[0]).isAfter(start)) {
+					if (_.isNumber(seriesItem[1])) {
+						normalizedChartData.push([ moment(seriesItem[0]).valueOf(), seriesItem[1] ]);
+					}
+				}
+			});
+		}
+
+		return normalizedChartData;
+	};
+
+	var buildChart = function(bandwidthChartData, connectionsChartData) {
+
+		chartOptions = {
+			xaxis: {
+				mode: "time",
+				timezone: "utc",
+				twelveHourClock: false
+			},
+			yaxes: [
+				{
+					position: "left",
+					axisLabel: "Bandwidth (Gbps)",
+					axisLabelUseCanvas: true,
+					axisLabelFontSizePixels: 12,
+					axisLabelFontFamily: 'Verdana, Arial',
+					axisLabelPadding: 3
+				},
+				{
+					position: "right",
+					axisLabel: "Connections",
+					axisLabelUseCanvas: true,
+					axisLabelFontSizePixels: 12,
+					axisLabelFontFamily: 'Verdana, Arial',
+					axisLabelPadding: 3
+				}
+			],
+			legend: {
+				position: "nw"
+			},
+			grid: {
+				hoverable: true,
+				axisMargin: 20
+			},
+			tooltip: {
+				show: true,
+				content: function(label, xval, yval, flotItem){
+					var tooltipString = dateUtils.dateFormat(xval, "UTC: ddd mmm d yyyy H:MM:ss tt (Z)") + '<br>';
+					tooltipString += '<span>' + label + ': ' + $filter('number')(yval, 2) + '</span><br>'
+					return tooltipString;
+				}
+			}
+		};
+
+		chartSeries = [
+			{ label: "Bandwidth", yaxis: 1, color: '#3498DB', data: bandwidthChartData },
+			{ label: "Connections", yaxis: 2, color: '#E74C3C', data: connectionsChartData }
+		];
+
+		plotChart();
+
+	};
+
+	var registerResizeListener = function() {
+		$(window).resize(plotChart);
+	};
+
+	var plotChart = function() {
+		if (chartOptions && chartSeries) {
+			$.plot($("#bps-chart-" + $scope.cdn.id), chartSeries, chartOptions);
+		}
+	};
+
+	$scope.cdn;
+
+	$scope.unitSize = 'Gb';
+
+	$scope.randomId = '_' + Math.random().toString(36).substr(2, 9);
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		var cdnId;
+		if (cdn) {
+			cdnId = cdn.id;
+		} else {
+			// cdn wasn't passed in. we need to figure it out on our own
+			cdnId = $('#' + $scope.randomId).closest('.chartContainer').data('cdnid');
+		}
+		getCDN(cdnId);
+	});
+
+};
+
+WidgetCDNChartController.$inject = ['cdn', '$scope', '$timeout', '$filter', '$q', 'cdnService', 'cacheStatsService', 'dateUtils', 'locationUtils', 'numberUtils'];
+module.exports = WidgetCDNChartController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/cdnChart/_widget.cdnChart.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/cdnChart/_widget.cdnChart.scss b/traffic_portal/app/src/common/modules/widget/cdnChart/_widget.cdnChart.scss
new file mode 100644
index 0000000..68dea14
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/cdnChart/_widget.cdnChart.scss
@@ -0,0 +1,30 @@
+/*
+
+
+ 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.
+
+*/
+
+.bps-chart-container {
+  position: relative;
+  text-align: center;
+  background-color: transparent;
+  padding: 30px 60px;
+
+  .bps-chart {
+    width: 100%;
+    height: 250px;
+  }
+
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/cdnChart/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/cdnChart/index.js b/traffic_portal/app/src/common/modules/widget/cdnChart/index.js
new file mode 100644
index 0000000..58cc63d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/cdnChart/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.widget.cdnChart', [])
+	.controller('WidgetCDNChartController', require('./WidgetCDNChartController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/cdnChart/widget.cdnChart.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/cdnChart/widget.cdnChart.tpl.html b/traffic_portal/app/src/common/modules/widget/cdnChart/widget.cdnChart.tpl.html
new file mode 100644
index 0000000..157f6c2
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/cdnChart/widget.cdnChart.tpl.html
@@ -0,0 +1,59 @@
+<!--
+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="{{::randomId}}" class="dashboard_graph">
+    <div class="x_title">
+        <h2><a ng-click="navigateToPath('/admin/cdns/' + cdn.id)">{{::cdn.name}}</a></h2>
+        <ul class="nav navbar-right panel_toolbox">
+            <li><a class="collapse-link"><i class="fa fa-chevron-up"></i></a></li>
+            <li><a class="close-link"><i class="fa fa-close"></i></a></li>
+        </ul>
+        <div class="clearfix"></div>
+    </div>
+    <div class="col-md-9 col-sm-9 col-xs-12">
+        <div class="bps-chart-container">
+            <div id="bps-chart-{{::cdn.id}}" class="bps-chart"></div>
+        </div>
+    </div>
+    <div class="col-md-3 col-sm-3 col-xs-12 bg-white">
+        <div class="x_title">
+            <h3>Statistics</h3>
+            <div class="clearfix"></div>
+        </div>
+        <div class="col-md-12 col-sm-12 col-xs-6">
+            <table class="countries_list">
+                <tbody>
+                    <tr>
+                        <td>Utilization %</td>
+                        <td class="fs15 fw700 text-right">{{currentStats.bandwidth/currentStats.capacity | percentFilter}} of {{currentStats.capacity | number:0}} Gbps</td>
+                    </tr>
+                    <tr>
+                        <td>Current Bandwidth</td>
+                        <td class="fs15 fw700 text-right">{{currentStats.bandwidth | number:2}} Gbps</td>
+                    </tr>
+                    <tr>
+                        <td>Current Connections</td>
+                        <td class="fs15 fw700 text-right">{{currentStats.connections | number:0}}</td>
+                    </tr>
+                </tbody>
+            </table>
+        </div>
+    </div>
+    <div class="clearfix"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/changeLogs/WidgetChangeLogsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/changeLogs/WidgetChangeLogsController.js b/traffic_portal/app/src/common/modules/widget/changeLogs/WidgetChangeLogsController.js
new file mode 100644
index 0000000..45e46e9
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/changeLogs/WidgetChangeLogsController.js
@@ -0,0 +1,39 @@
+/*
+ * 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 WidgetChangeLogsController = function(changeLogs, $scope, locationUtils) {
+
+	$scope.getRelativeTime = function(date) {
+		return moment(date).fromNow();
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	var init = function() {
+		if (changeLogs) {
+			// only set this if it's passed in
+			$scope.changeLogs = changeLogs;
+		}
+	};
+	init();
+
+};
+
+WidgetChangeLogsController.$inject = ['changeLogs', '$scope', 'locationUtils'];
+module.exports = WidgetChangeLogsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/changeLogs/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/changeLogs/index.js b/traffic_portal/app/src/common/modules/widget/changeLogs/index.js
new file mode 100644
index 0000000..5fa0384
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/changeLogs/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.widget.changeLogs', [])
+	.controller('WidgetChangeLogsController', require('./WidgetChangeLogsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/changeLogs/widget.changeLogs.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/changeLogs/widget.changeLogs.tpl.html b/traffic_portal/app/src/common/modules/widget/changeLogs/widget.changeLogs.tpl.html
new file mode 100644
index 0000000..15c615d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/changeLogs/widget.changeLogs.tpl.html
@@ -0,0 +1,50 @@
+<!--
+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="x_title">
+    <h2>Change Logs</h2>
+    <ul class="nav navbar-right panel_toolbox">
+        <li><a class="collapse-link"><i class="fa fa-chevron-up"></i></a></li>
+        <li><a class="close-link"><i class="fa fa-close"></i></a></li>
+    </ul>
+    <div class="clearfix"></div>
+</div>
+<div class="x_content">
+    <div class="dashboard-widget-content">
+        <ul class="list-unstyled timeline widget">
+            <li ng-repeat="changeLog in ::changeLogs">
+                <div class="block">
+                    <div class="block_content">
+                        <h2 class="title">{{::changeLog.level}}</h2>
+                        <div class="byline">
+                            <span>{{::getRelativeTime(changeLog.lastUpdated)}}</span> by <a>{{::changeLog.user}}</a>
+                        </div>
+                        <p class="excerpt">{{::changeLog.message}}</p>
+                    </div>
+                </div>
+            </li>
+        </ul>
+    </div>
+    <div class="text-center">
+        <a>
+            <strong><a ng-click="navigateToPath('/admin/change-logs')">See All Change Logs</a></strong>
+            <i class="fa fa-angle-right"></i>
+        </a>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/routing/WidgetRoutingController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/routing/WidgetRoutingController.js b/traffic_portal/app/src/common/modules/widget/routing/WidgetRoutingController.js
new file mode 100644
index 0000000..da97948
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/routing/WidgetRoutingController.js
@@ -0,0 +1,45 @@
+/*
+ * 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 WidgetRoutingController = function($scope, cdnService) {
+
+	var getRoutingMethods = function() {
+		cdnService.getRoutingMethods()
+			.then(function(response) {
+				$scope.native = response.cz;
+				$scope.thirdParty = response.geo;
+				$scope.federated = response.fed;
+				$scope.miss = response.miss;
+				$scope.static = response.staticRoute;
+				$scope.dsr = response.dsr;
+				$scope.error = response.err;
+				$scope.regionalAlternate = response.regionalAlternate;
+				$scope.regionalDenied = response.regionalDenied;
+			});
+	};
+
+	var init = function() {
+		getRoutingMethods();
+	};
+	init();
+
+};
+
+WidgetRoutingController.$inject = ['$scope', 'cdnService'];
+module.exports = WidgetRoutingController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/routing/_widget.routing.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/routing/_widget.routing.scss b/traffic_portal/app/src/common/modules/widget/routing/_widget.routing.scss
new file mode 100644
index 0000000..5df3a2b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/routing/_widget.routing.scss
@@ -0,0 +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.
+
+*/
+
+.widget_summary .w_right span {
+  font-size: 16px;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/routing/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/routing/index.js b/traffic_portal/app/src/common/modules/widget/routing/index.js
new file mode 100644
index 0000000..237950c
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/routing/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.widget.routing', [])
+	.controller('WidgetRoutingController', require('./WidgetRoutingController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/routing/widget.routing.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/routing/widget.routing.tpl.html b/traffic_portal/app/src/common/modules/widget/routing/widget.routing.tpl.html
new file mode 100644
index 0000000..6af1369
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/routing/widget.routing.tpl.html
@@ -0,0 +1,157 @@
+<!--
+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="x_title">
+    <h2>Routing Methods</h2>
+    <ul class="nav navbar-right panel_toolbox">
+        <li><a class="collapse-link"><i class="fa fa-chevron-up"></i></a></li>
+        <li><a class="close-link"><i class="fa fa-close"></i></a></li>
+    </ul>
+    <div class="clearfix"></div>
+</div>
+<div class="x_content">
+    <div class="widget_summary">
+        <div class="w_left w_25">
+            <span>Native</span>
+        </div>
+        <div class="w_center w_55">
+            <div class="progress">
+                <div class="progress-bar" role="progressbar" ng-style="{'width': native + '%'}" style="background-color: #357EBD;"></div>
+            </div>
+        </div>
+        <div class="w_right w_20">
+            <span>{{native | number:3}}%</span>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="widget_summary">
+        <div class="w_left w_25">
+            <span>3rd Party</span>
+        </div>
+        <div class="w_center w_55">
+            <div class="progress">
+                <div class="progress-bar" role="progressbar" ng-style="{'width': thirdParty + '%'}" style="background-color: #263C53;"></div>
+            </div>
+        </div>
+        <div class="w_right w_20">
+            <span>{{thirdParty | number:3}}%</span>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="widget_summary">
+        <div class="w_left w_25">
+            <span>Federated</span>
+        </div>
+        <div class="w_center w_55">
+            <div class="progress">
+                <div class="progress-bar" role="progressbar" ng-style="{'width': federated + '%'}" style="background-color: #8a00e6;"></div>
+            </div>
+        </div>
+        <div class="w_right w_20">
+            <span>{{federated | number:3}}%</span>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="widget_summary">
+        <div class="w_left w_25">
+            <span>Miss</span>
+        </div>
+        <div class="w_center w_55">
+            <div class="progress">
+                <div class="progress-bar" role="progressbar" ng-style="{'width': miss + '%'}" style="background-color: #a94442;"></div>
+            </div>
+        </div>
+        <div class="w_right w_20">
+            <span>{{miss | number:3}}%</span>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="widget_summary">
+        <div class="w_left w_25">
+            <span>Static</span>
+        </div>
+        <div class="w_center w_55">
+            <div class="progress">
+                <div class="progress-bar" role="progressbar" ng-style="{'width': static + '%'}" style="background-color: #cccccc;"></div>
+            </div>
+        </div>
+        <div class="w_right w_20">
+            <span>{{static | number:3}}%</span>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="widget_summary">
+        <div class="w_left w_25">
+            <span>DSR</span>
+        </div>
+        <div class="w_center w_55">
+            <div class="progress">
+                <div class="progress-bar" role="progressbar" ng-style="{'width': dsr + '%'}" style="background-color: #3c763d;"></div>
+            </div>
+        </div>
+        <div class="w_right w_20">
+            <span>{{dsr | number:3}}%</span>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="widget_summary">
+        <div class="w_left w_25">
+            <span>Error</span>
+        </div>
+        <div class="w_center w_55">
+            <div class="progress">
+                <div class="progress-bar" role="progressbar" ng-style="{'width': error + '%'}" style="background-color: #E74C3C"></div>
+            </div>
+        </div>
+        <div class="w_right w_20">
+            <span>{{error | number:3}}%</span>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="widget_summary">
+        <div class="w_left w_25">
+            <span>Regional Alternate</span>
+        </div>
+        <div class="w_center w_55">
+            <div class="progress">
+                <div class="progress-bar" role="progressbar" ng-style="{'width': regionalAlternate + '%'}" style="background-color: #666666;"></div>
+            </div>
+        </div>
+        <div class="w_right w_20">
+            <span>{{regionalAlternate | number:3}}%</span>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="widget_summary">
+        <div class="w_left w_25">
+            <span>Regional Denied</span>
+        </div>
+        <div class="w_center w_55">
+            <div class="progress">
+                <div class="progress-bar" role="progressbar" ng-style="{'width': regionalDenied + '%'}" style="background-color: #666666;"></div>
+            </div>
+        </div>
+        <div class="w_right w_20">
+            <span>{{regionalDenied | number:3}}%</span>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/service/application/ApplicationService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/service/application/ApplicationService.js b/traffic_portal/app/src/common/service/application/ApplicationService.js
index b152b63..1fde86d 100644
--- a/traffic_portal/app/src/common/service/application/ApplicationService.js
+++ b/traffic_portal/app/src/common/service/application/ApplicationService.js
@@ -1,42 +1,31 @@
 /*
-
-
- 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 ApplicationService = function($rootScope, $http, $window) {
+var ApplicationService = function($rootScope, $anchorScroll, $http) {
 
-    /**
-     *  Application Startup Process
-     */
     this.startup = function() {
-        registerOnlineListener();
+        // anything you need to do at startup
     };
 
-    var registerOnlineListener = function() {
-        $rootScope.online = $window.navigator.onLine;
-        $window.addEventListener("offline", function () {
-            $rootScope.$apply(function() {
-                $rootScope.online = false;
-            });
-        }, false);
-        $window.addEventListener("online", function () {
-            $rootScope.$apply(function() {
-                $rootScope.online = true;
-            });
-        }, false);
-    };
+    $rootScope.$on("$viewContentLoaded", function() {
+        $anchorScroll(); // scrolls window to top
+    });
 
     var init = function() {
         $http.defaults.withCredentials = true;
@@ -45,5 +34,5 @@ var ApplicationService = function($rootScope, $http, $window) {
 
 };
 
-ApplicationService.$inject = ['$rootScope', '$http', '$window'];
+ApplicationService.$inject = ['$rootScope', '$anchorScroll', '$http'];
 module.exports = ApplicationService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/service/application/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/service/application/index.js b/traffic_portal/app/src/common/service/application/index.js
index 0943e96..fa62619 100644
--- a/traffic_portal/app/src/common/service/application/index.js
+++ b/traffic_portal/app/src/common/service/application/index.js
@@ -1,19 +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.
-
+ * 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.application', [])
-    .service('applicationService', require('./ApplicationService'));
\ No newline at end of file
+    .service('applicationService', require('./ApplicationService'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/service/utils/ChartUtils.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/service/utils/ChartUtils.js b/traffic_portal/app/src/common/service/utils/ChartUtils.js
deleted file mode 100644
index 51ad636..0000000
--- a/traffic_portal/app/src/common/service/utils/ChartUtils.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 ChartUtils = function() {
-
-    this.formatData = function(dataPoints) {
-        if (!angular.isDefined(dataPoints)) { return [] };
-
-        var formattedData = [];
-
-        var dataPointsArray = dataPoints.split(',');
-        for (var i = 0; i < dataPointsArray.length; i++) {
-            dataPointsArray[i] = +dataPointsArray[i];
-        }
-        for (var j = 0; j < dataPointsArray.length; j+=2) {
-            formattedData.push(dataPointsArray.slice(j, j+2))
-        }
-        return formattedData;
-    };
-
-};
-
-ChartUtils.$inject = [];
-module.exports = ChartUtils;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/service/utils/DateUtils.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/service/utils/DateUtils.js b/traffic_portal/app/src/common/service/utils/DateUtils.js
new file mode 100644
index 0000000..e554d02
--- /dev/null
+++ b/traffic_portal/app/src/common/service/utils/DateUtils.js
@@ -0,0 +1,131 @@
+/*
+ * 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 DateUtils = function() {
+
+	this.dateFormat = function () {
+		// source: http://blog.stevenlevithan.com/archives/date-time-format
+		var	token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
+			timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
+			timezoneClip = /[^-+\dA-Z]/g,
+			pad = function (val, len) {
+				val = String(val);
+				len = len || 2;
+				while (val.length < len) val = "0" + val;
+				return val;
+			};
+
+		// Regexes and supporting functions are cached through closure
+		return function (date, mask, utc) {
+			var dF = this.dateFormat;
+
+			// You can't provide utc if you skip other args (use the "UTC:" mask prefix)
+			if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
+				mask = date;
+				date = undefined;
+			}
+
+			// Passing date through Date applies Date.parse, if necessary
+			date = date ? new Date(date) : new Date;
+			if (isNaN(date)) throw SyntaxError("invalid date");
+
+			mask = String(dF.masks[mask] || mask || dF.masks["default"]);
+
+			// Allow setting the utc argument via the mask
+			if (mask.slice(0, 4) == "UTC:") {
+				mask = mask.slice(4);
+				utc = true;
+			}
+
+			var	_ = utc ? "getUTC" : "get",
+				d = date[_ + "Date"](),
+				D = date[_ + "Day"](),
+				m = date[_ + "Month"](),
+				y = date[_ + "FullYear"](),
+				H = date[_ + "Hours"](),
+				M = date[_ + "Minutes"](),
+				s = date[_ + "Seconds"](),
+				L = date[_ + "Milliseconds"](),
+				o = utc ? 0 : date.getTimezoneOffset(),
+				flags = {
+					d:    d,
+					dd:   pad(d),
+					ddd:  dF.i18n.dayNames[D],
+					dddd: dF.i18n.dayNames[D + 7],
+					m:    m + 1,
+					mm:   pad(m + 1),
+					mmm:  dF.i18n.monthNames[m],
+					mmmm: dF.i18n.monthNames[m + 12],
+					yy:   String(y).slice(2),
+					yyyy: y,
+					h:    H % 12 || 12,
+					hh:   pad(H % 12 || 12),
+					H:    H,
+					HH:   pad(H),
+					M:    M,
+					MM:   pad(M),
+					s:    s,
+					ss:   pad(s),
+					l:    pad(L, 3),
+					L:    pad(L > 99 ? Math.round(L / 10) : L),
+					t:    H < 12 ? "a"  : "p",
+					tt:   H < 12 ? "am" : "pm",
+					T:    H < 12 ? "A"  : "P",
+					TT:   H < 12 ? "AM" : "PM",
+					Z:    utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
+					o:    (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
+					S:    ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
+				};
+
+			return mask.replace(token, function ($0) {
+				return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
+			});
+		};
+	}();
+
+	this.dateFormat.masks = {
+		"default":      "ddd mmm dd yyyy HH:MM:ss",
+		shortDate:      "m/d/yy",
+		mediumDate:     "mmm d, yyyy",
+		longDate:       "mmmm d, yyyy",
+		fullDate:       "dddd, mmmm d, yyyy",
+		shortTime:      "h:MM TT",
+		mediumTime:     "h:MM:ss TT",
+		longTime:       "h:MM:ss TT Z",
+		isoDate:        "yyyy-mm-dd",
+		isoTime:        "HH:MM:ss",
+		isoDateTime:    "yyyy-mm-dd'T'HH:MM:ss",
+		isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
+	};
+
+	this.dateFormat.i18n = {
+		dayNames: [
+			"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
+			"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
+		],
+		monthNames: [
+			"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
+			"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
+		]
+	};
+
+};
+
+DateUtils.$inject = [];
+module.exports = DateUtils;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/service/utils/FormUtils.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/service/utils/FormUtils.js b/traffic_portal/app/src/common/service/utils/FormUtils.js
index 7c0e111..e930043 100644
--- a/traffic_portal/app/src/common/service/utils/FormUtils.js
+++ b/traffic_portal/app/src/common/service/utils/FormUtils.js
@@ -1,28 +1,30 @@
 /*
-
-
- 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 FormUtils = function() {
 
     this.hasError = function(input) {
-        return !input.$focused && input.$dirty && input.$invalid;
+        return input && !input.$focused && input.$dirty && input.$invalid;
     };
 
     this.hasPropertyError = function(input, property) {
-        return !input.$focused && input.$dirty && input.$error[property];
+        return input && !input.$focused && input.$dirty && input.$error[property];
     };
 
 };

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/service/utils/JSONUtils.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/service/utils/JSONUtils.js b/traffic_portal/app/src/common/service/utils/JSONUtils.js
deleted file mode 100644
index 792c0d5..0000000
--- a/traffic_portal/app/src/common/service/utils/JSONUtils.js
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var JSONUtils = function() {
-
-    this.convertToCSV = function(JSONData, reportTitle, includedKeys) {
-        // if JSONData is not an object then JSON.parse will parse the JSON string in an Object
-        var arrData = typeof JSONData != 'object' ? JSON.parse(JSONData) : JSONData;
-
-        var CSV = '';
-        // set report title in first row or line
-        CSV += reportTitle + '\r\n\n';
-
-        // this loop will extract the labels from the first hash in the array
-        var keys = [];
-        for (var key in arrData[0]) {
-            if (!includedKeys || _.contains(includedKeys, key)) {
-                keys.push(key);
-            }
-        }
-        keys.sort(); // alphabetically
-
-        var row = "";
-        for (var i = 0; i < keys.length; i++) {
-            //Now convert each value to string and comma-separate
-            row += keys[i] + ',';
-        }
-        row = row.slice(0, -1);
-
-        //append Label row with line break
-        CSV += row + '\r\n';
-
-        // outer loop is to extract each row
-        for (var j = 0; j < arrData.length; j++) {
-            var row = "";
-
-            // inner loop to extract each column by name and convert it to a comma-separated string
-            for (var k = 0; k < keys.length; k++) {
-                row += '"' + arrData[j][keys[k]] + '",';
-            }
-
-            row.slice(0, row.length - 1);
-
-            // add a line break after each row
-            CSV += row + '\r\n';
-        }
-
-        if (CSV == '') {
-            alert("Invalid data");
-            return;
-        }
-
-        // generate a file name
-        var fileName = "";
-        // this will remove the blank-spaces from the title and replace it with an underscore
-        fileName += reportTitle.replace(/ /g,"_");
-
-        // initialize file format to csv
-        var uri = 'data:text/csv;charset=utf-8,' + escape(CSV);
-
-        // Now the little tricky part.
-        // you can use either>> window.open(uri);
-        // but this will not work in some browsers
-        // or you will not get the correct file extension
-
-        // this trick will generate a temp <a /> tag
-        var link = document.createElement("a");
-        link.href = uri;
-
-        // set the visibility hidden so it will not effect on your web-layout
-        link.style = "visibility:hidden";
-        link.download = fileName + ".csv";
-
-        // this part will append the anchor tag and remove it after automatic click
-        document.body.appendChild(link);
-        link.click();
-        document.body.removeChild(link);
-    };
-
-};
-
-JSONUtils.$inject = [];
-module.exports = JSONUtils;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/service/utils/LocationUtils.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/service/utils/LocationUtils.js b/traffic_portal/app/src/common/service/utils/LocationUtils.js
new file mode 100644
index 0000000..8defa68
--- /dev/null
+++ b/traffic_portal/app/src/common/service/utils/LocationUtils.js
@@ -0,0 +1,29 @@
+/*
+ * 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 LocationUtils = function($location) {
+
+    this.navigateToPath = function(path) {
+        $location.url(path);
+    };
+
+};
+
+LocationUtils.$inject = ['$location'];
+module.exports = LocationUtils;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/service/utils/NumberUtils.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/service/utils/NumberUtils.js b/traffic_portal/app/src/common/service/utils/NumberUtils.js
index e3502ef..9a66563 100644
--- a/traffic_portal/app/src/common/service/utils/NumberUtils.js
+++ b/traffic_portal/app/src/common/service/utils/NumberUtils.js
@@ -17,62 +17,62 @@
 
 var NumberUtils = function($filter) {
 
-    var k = 1000,
-        sizes = ['B', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb'];
+	var k = 1000,
+		sizes = ['B', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb'];
 
-    this.addCommas = function(nStr)
-    {
-        nStr += '';
-        x = nStr.split('.');
-        x1 = x[0];
-        x2 = x.length > 1 ? '.' + x[1] : '';
-        var rgx = /(\d+)(\d{3})/;
-        while (rgx.test(x1)) {
-            x1 = x1.replace(rgx, '$1' + ',' + '$2');
-        }
-        return x1 + x2;
-    };
+	this.addCommas = function(nStr)
+	{
+		nStr += '';
+		x = nStr.split('.');
+		x1 = x[0];
+		x2 = x.length > 1 ? '.' + x[1] : '';
+		var rgx = /(\d+)(\d{3})/;
+		while (rgx.test(x1)) {
+			x1 = x1.replace(rgx, '$1' + ',' + '$2');
+		}
+		return x1 + x2;
+	};
 
-    /**
-     * This function takes big scary kilobit numbers and 'shrinks' them to a friendly version
-     * i.e. 10,000 kilobits is easier read as 10 megabits...
-     */
-    this.shrink = function(kilounits) {
-        if (!angular.isNumber(kilounits) || kilounits == 0) return [ 0, 'Kb' ];
-        var units = kilounits * 1000;
-        var i = Math.floor(Math.log(units) / Math.log(k));
-        if (i < 1) { i = 1 } // kilobits is the lowest we will go
-        if (i > 5) { i = 5 } // petabits is the highest we will go
-        return [ Math.round((units / Math.pow(k, i)) * 100) / 100, sizes[i] ];
-    };
+	/**
+	 * This function takes big scary kilobit numbers and 'shrinks' them to a friendly version
+	 * i.e. 10,000 kilobits is easier read as 10 megabits...
+	 */
+	this.shrink = function(kilounits) {
+		if (!angular.isNumber(kilounits) || kilounits == 0) return [ 0, 'Kb' ];
+		var units = kilounits * 1000;
+		var i = Math.floor(Math.log(units) / Math.log(k));
+		if (i < 1) { i = 1 } // kilobits is the lowest we will go
+		if (i > 5) { i = 5 } // petabits is the highest we will go
+		return [ Math.round((units / Math.pow(k, i)) * 100) / 100, sizes[i] ];
+	};
 
-    this.convertTo = function(kilounits, size) {
-        if (!angular.isNumber(kilounits)) return null;
-        if (kilounits == 0) return 0;
-        var units = kilounits * 1000;
-        var i = sizes.indexOf(size);
-        if (i == -1) {
-            return 0;
-        }
-        return Math.round((units / Math.pow(k, i)) * 100) / 100;
-    };
+	this.convertTo = function(kilounits, size) {
+		if (!angular.isNumber(kilounits)) return null;
+		if (kilounits == 0) return 0;
+		var units = kilounits * 1000;
+		var i = sizes.indexOf(size);
+		if (i == -1) {
+			return 0;
+		}
+		return Math.round((units / Math.pow(k, i)) * 100) / 100;
+	};
 
-    this.average = function(arr)
-    {
-        if (!angular.isArray(arr) || arr.length == 0 ) return 0;
-        return _.reduce(arr, function(memo, num) {
-            return memo + num;
-        }, 0) / arr.length;
-    }
+	this.average = function(arr)
+	{
+		if (!angular.isArray(arr) || arr.length == 0 ) return 0;
+		return _.reduce(arr, function(memo, num) {
+				return memo + num;
+			}, 0) / arr.length;
+	}
 
-    this.ratio = function(numerator, denominator)
-    {
-        if (numerator === 0 || denominator === 0) {
-            return 'N/A';
-        } else {
-            return $filter('number')(numerator/denominator, 2) + ':1';
-        }
-    }
+	this.ratio = function(numerator, denominator)
+	{
+		if (numerator === 0 || denominator === 0) {
+			return 'N/A';
+		} else {
+			return $filter('number')(numerator/denominator, 2) + ':1';
+		}
+	}
 
 };
 

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/service/utils/ServerUtils.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/service/utils/ServerUtils.js b/traffic_portal/app/src/common/service/utils/ServerUtils.js
new file mode 100644
index 0000000..a4d2c4c
--- /dev/null
+++ b/traffic_portal/app/src/common/service/utils/ServerUtils.js
@@ -0,0 +1,33 @@
+/*
+ * 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 ServerUtils = function() {
+
+	this.isOffline = function(status) {
+		return (status == 'OFFLINE' || status == 'ADMIN_DOWN');
+	};
+
+	this.offlineReason = function(server) {
+		return (server.offlineReason) ? server.offlineReason : 'None';
+	};
+
+};
+
+ServerUtils.$inject = [];
+module.exports = ServerUtils;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/service/utils/StringUtils.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/service/utils/StringUtils.js b/traffic_portal/app/src/common/service/utils/StringUtils.js
new file mode 100644
index 0000000..2e5bb38
--- /dev/null
+++ b/traffic_portal/app/src/common/service/utils/StringUtils.js
@@ -0,0 +1,29 @@
+/*
+ * 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 FormUtils = function() {
+
+    this.labelize = function(string) {
+        return string.replace(/([A-Z])/g, ' $1').replace(/^./, function(str){ return str.toUpperCase(); });
+    };
+
+};
+
+FormUtils.$inject = [];
+module.exports = FormUtils;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/service/utils/date/DateUtils.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/service/utils/date/DateUtils.js b/traffic_portal/app/src/common/service/utils/date/DateUtils.js
deleted file mode 100644
index 14ad2d3..0000000
--- a/traffic_portal/app/src/common/service/utils/date/DateUtils.js
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var DateUtils = function() {
-
-    this.dateFormat = function () {
-        // source: http://blog.stevenlevithan.com/archives/date-time-format
-        var	token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
-            timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
-            timezoneClip = /[^-+\dA-Z]/g,
-            pad = function (val, len) {
-                val = String(val);
-                len = len || 2;
-                while (val.length < len) val = "0" + val;
-                return val;
-            };
-
-        // Regexes and supporting functions are cached through closure
-        return function (date, mask, utc) {
-            var dF = this.dateFormat;
-
-            // You can't provide utc if you skip other args (use the "UTC:" mask prefix)
-            if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
-                mask = date;
-                date = undefined;
-            }
-
-            // Passing date through Date applies Date.parse, if necessary
-            date = date ? new Date(date) : new Date;
-            if (isNaN(date)) throw SyntaxError("invalid date");
-
-            mask = String(dF.masks[mask] || mask || dF.masks["default"]);
-
-            // Allow setting the utc argument via the mask
-            if (mask.slice(0, 4) == "UTC:") {
-                mask = mask.slice(4);
-                utc = true;
-            }
-
-            var	_ = utc ? "getUTC" : "get",
-                d = date[_ + "Date"](),
-                D = date[_ + "Day"](),
-                m = date[_ + "Month"](),
-                y = date[_ + "FullYear"](),
-                H = date[_ + "Hours"](),
-                M = date[_ + "Minutes"](),
-                s = date[_ + "Seconds"](),
-                L = date[_ + "Milliseconds"](),
-                o = utc ? 0 : date.getTimezoneOffset(),
-                flags = {
-                    d:    d,
-                    dd:   pad(d),
-                    ddd:  dF.i18n.dayNames[D],
-                    dddd: dF.i18n.dayNames[D + 7],
-                    m:    m + 1,
-                    mm:   pad(m + 1),
-                    mmm:  dF.i18n.monthNames[m],
-                    mmmm: dF.i18n.monthNames[m + 12],
-                    yy:   String(y).slice(2),
-                    yyyy: y,
-                    h:    H % 12 || 12,
-                    hh:   pad(H % 12 || 12),
-                    H:    H,
-                    HH:   pad(H),
-                    M:    M,
-                    MM:   pad(M),
-                    s:    s,
-                    ss:   pad(s),
-                    l:    pad(L, 3),
-                    L:    pad(L > 99 ? Math.round(L / 10) : L),
-                    t:    H < 12 ? "a"  : "p",
-                    tt:   H < 12 ? "am" : "pm",
-                    T:    H < 12 ? "A"  : "P",
-                    TT:   H < 12 ? "AM" : "PM",
-                    Z:    utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
-                    o:    (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
-                    S:    ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
-                };
-
-            return mask.replace(token, function ($0) {
-                return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
-            });
-        };
-    }();
-
-    this.dateFormat.masks = {
-        "default":      "ddd mmm dd yyyy HH:MM:ss",
-        shortDate:      "m/d/yy",
-        mediumDate:     "mmm d, yyyy",
-        longDate:       "mmmm d, yyyy",
-        fullDate:       "dddd, mmmm d, yyyy",
-        shortTime:      "h:MM TT",
-        mediumTime:     "h:MM:ss TT",
-        longTime:       "h:MM:ss TT Z",
-        isoDate:        "yyyy-mm-dd",
-        isoTime:        "HH:MM:ss",
-        isoDateTime:    "yyyy-mm-dd'T'HH:MM:ss",
-        isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
-    };
-
-    this.dateFormat.i18n = {
-        dayNames: [
-            "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
-            "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
-        ],
-        monthNames: [
-            "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
-            "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
-        ]
-    };
-
-};
-
-DateUtils.$inject = [];
-module.exports = DateUtils;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/service/utils/date/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/service/utils/date/index.js b/traffic_portal/app/src/common/service/utils/date/index.js
deleted file mode 100644
index b104c3d..0000000
--- a/traffic_portal/app/src/common/service/utils/date/index.js
+++ /dev/null
@@ -1,19 +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.utils.date', [])
-    .service('dateUtils', require('./DateUtils'));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/service/utils/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/service/utils/index.js b/traffic_portal/app/src/common/service/utils/index.js
index 581a3b1..ee06536 100644
--- a/traffic_portal/app/src/common/service/utils/index.js
+++ b/traffic_portal/app/src/common/service/utils/index.js
@@ -1,22 +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.
  */
 
 module.exports = angular.module('trafficPortal.utils', [])
-    .service('chartUtils', require('./ChartUtils'))
+    .service('dateUtils', require('./DateUtils'))
     .service('formUtils', require('./FormUtils'))
-    .service('jsonUtils', require('./JSONUtils'))
-    .service('numberUtils', require('./NumberUtils'));
\ No newline at end of file
+    .service('locationUtils', require('./LocationUtils'))
+    .service('numberUtils', require('./NumberUtils'))
+    .service('serverUtils', require('./ServerUtils'))
+    .service('stringUtils', require('./StringUtils'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/templates/master.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/templates/master.tpl.html b/traffic_portal/app/src/common/templates/master.tpl.html
old mode 100755
new mode 100644
index 668b5e4..a1e5a94
--- a/traffic_portal/app/src/common/templates/master.tpl.html
+++ b/traffic_portal/app/src/common/templates/master.tpl.html
@@ -1,32 +1,40 @@
 <!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
 
+<div class="main_container">
 
-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.
+    <!-- navigation -->
+    <div class="main-nav col-md-3" ui-view="navigation"></div>
 
--->
+    <!-- header -->
+    <div class="top_nav" ui-view="header"></div>
 
-<!-- Header Nav -->
-<nav class="navbar navbar-inverse" ui-view="header"></nav>
+    <!-- page content -->
+    <div class="main-content" role="main">
 
-<div class="container">
+        <!-- messages -->
+        <div ui-view="message"></div>
 
-    <!-- Message -->
-    <div ui-view="message"></div>
+        <!-- the content -->
+        <div ui-view="content"></div>
 
-    <!-- Content -->
-    <div ui-view="content"></div>
+    </div>
 
 </div>
 
-<!-- Footer -->
-<footer id="footer" ui-view="footer"></footer>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/index.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/index.html b/traffic_portal/app/src/index.html
old mode 100755
new mode 100644
index c8c9987..f644df6
--- a/traffic_portal/app/src/index.html
+++ b/traffic_portal/app/src/index.html
@@ -1,63 +1,59 @@
 <!--
-
-
-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.
 -->
 
 <!doctype html>
-<head>
-
-    <title>Traffic Portal</title>
-
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <meta name="description" content="">
-    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
 
-    <link rel="shortcut icon" href="resources/assets/images/favicon.png" type="image/x-icon" />
+    <head>
 
-    <link rel="stylesheet" media="all" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
-    <link rel="stylesheet" media="all" href="//cdnjs.cloudflare.com/ajax/libs/angular-bootstrap-datetimepicker/0.4.0/css/datetimepicker.css">
+        <title>Traffic Portal</title>
 
-    <link rel="stylesheet" media="all" href="resources/styles/loading.css">
-    <link rel="stylesheet" media="all" href="resources/styles/main.css">
-    <link rel="stylesheet" media="all" href="resources/assets/css/custom.css">
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+        <meta charset="utf-8">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge">
+        <meta name="description" content="">
+        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
 
-</head>
+        <link rel="shortcut icon" href="resources/assets/images/favicon.png" type="image/x-icon" />
+        <link rel="stylesheet" media="all" href="resources/styles/theme.css">
+        <link rel="stylesheet" media="all" href="resources/styles/loading.css">
+        <link rel="stylesheet" media="all" href="resources/styles/main.css">
+        <link rel="stylesheet" media="all" href="resources/assets/css/custom.css">
 
-<body ng-app="trafficPortal" ng-controller="AppCtrl" ng-class="{'home': isHome()}">
+        <link rel="stylesheet" media="all" href="resources/assets/css/jquery.dataTables.min.css">
 
-    <div class="app" ui-view></div>
+    </head>
 
-    <script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.js"></script>
-    <script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
+    <body class="nav-md" ng-app="trafficPortal">
 
-    <script src="resources/assets/js/shared-libs.js"></script>
+        <div class="app container body" ui-view></div>
 
-    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-bootstrap-datetimepicker/0.4.0/js/datetimepicker.min.js"></script>
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.js"></script>
+        <script src="https://cdnjs.cloudflare.com/ajax/libs/jsdiff/3.2.0/diff.js"></script>
 
-    <script src="resources/assets/js/config.js"></script>
-    <script src="resources/assets/js/app.js"></script>
+        <script src="resources/assets/js/shared-libs.js"></script>
+        <script src="resources/assets/js/app.js"></script>
+        <script src="resources/assets/js/config.js"></script>
 
-    <script type="text/javascript">
-        function AppCtrl($scope, $state) {
-            $scope.isHome = function() {
-                return $state.current.name == 'trafficPortal.public.home.landing';
-            };
-        }
-    </script>
+        <script src="resources/assets/js/underscore-min_1.8.3.js"></script>
+        <script src="resources/assets/js/jquery.dataTables.min.js"></script>
+        <script src="resources/assets/js/ng-map_1.17.6.min.js"></script>
 
-</body>
+    </body>
 
 </html>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/AdminController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/AdminController.js b/traffic_portal/app/src/modules/private/admin/AdminController.js
new file mode 100644
index 0000000..54d348c
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/AdminController.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 AdminController = function() {};
+
+AdminController.$inject = [];
+module.exports = AdminController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/_admin.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/_admin.scss b/traffic_portal/app/src/modules/private/admin/_admin.scss
new file mode 100644
index 0000000..d57b9c6
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/_admin.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/admin/admin.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/admin.tpl.html b/traffic_portal/app/src/modules/private/admin/admin.tpl.html
new file mode 100644
index 0000000..ea0ece1
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/admin.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="adminContainer">
+    <div ui-view="adminContent"></div>
+</div>

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/asns/asns.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/asns/asns.tpl.html b/traffic_portal/app/src/modules/private/admin/asns/asns.tpl.html
new file mode 100644
index 0000000..6df2eca
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/asns/asns.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="asnsContainer">
+    <div ui-view="asnsContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/asns/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/asns/edit/index.js b/traffic_portal/app/src/modules/private/admin/asns/edit/index.js
new file mode 100644
index 0000000..7d23c9f
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/asns/edit/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.asns.edit', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.asns.edit', {
+                url: '/{asnId:[0-9]{1,8}}',
+                views: {
+                    asnsContent: {
+                        templateUrl: 'common/modules/form/asn/form.asn.tpl.html',
+                        controller: 'FormEditASNController',
+                        resolve: {
+                            asn: function($stateParams, asnService) {
+                                return asnService.getASN($stateParams.asnId);
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/styles/theme.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/styles/theme.scss b/traffic_portal/app/src/styles/theme.scss
new file mode 100644
index 0000000..fc909aa
--- /dev/null
+++ b/traffic_portal/app/src/styles/theme.scss
@@ -0,0 +1,4159 @@
+/*!
+ * gentelella v1.3.0
+ * https://colorlib.com/polygon/gentelella/index.html
+ * Copyright (c) 2016 Aigars Silkalns & Colorlib
+ * License: MIT
+ */
+
+.daterangepicker .ranges li {
+  color: #73879C
+}
+.daterangepicker .ranges li.active,
+.daterangepicker .ranges li:hover {
+  background: #536A7F;
+  border: 1px solid #536A7F;
+  color: #fff
+}
+.daterangepicker .input-mini {
+  background-color: #eee;
+  border: 1px solid #ccc;
+  box-shadow: none !important
+}
+.daterangepicker .input-mini.active {
+  border: 1px solid #ccc
+}
+.daterangepicker select.monthselect,
+.daterangepicker select.yearselect,
+.daterangepicker select.hourselect,
+.daterangepicker select.minuteselect,
+.daterangepicker select.secondselect,
+.daterangepicker select.ampmselect {
+  font-size: 12px;
+  padding: 1px;
+  height: auto;
+  margin: 0;
+  cursor: default;
+  height: 30px;
+  border: 1px solid #ADB2B5;
+  line-height: 30px;
+  border-radius: 0px !important
+}
+.daterangepicker select.monthselect {
+  margin-right: 2%
+}
+.daterangepicker td.in-range {
+  background: #E4E7EA;
+  color: #73879C
+}
+.daterangepicker td.active,
+.daterangepicker td.active:hover {
+  background-color: #536A7F;
+  color: #fff
+}
+.daterangepicker th.available:hover {
+  background: #eee;
+  color: #34495E
+}
+.daterangepicker:before,
+.daterangepicker:after {
+  content: none
+}
+.daterangepicker .calendar.single {
+  margin: 0 0 4px 0
+}
+.daterangepicker .calendar.single .calendar-table {
+  width: 224px;
+  padding: 0 0 4px 0 !important
+}
+.daterangepicker .calendar.single .calendar-table thead tr:first-child th {
+  padding: 8px 5px
+}
+.daterangepicker .calendar.single .calendar-table thead th {
+  border-radius: 0
+}
+.daterangepicker.picker_1 {
+  color: #fff;
+  background: #34495E
+}
+.daterangepicker.picker_1 .calendar-table {
+  background: #34495E
+}
+.daterangepicker.picker_1 .calendar-table thead tr {
+  background: #213345
+}
+.daterangepicker.picker_1 .calendar-table thead tr:first-child {
+  background: #1ABB9C
+}
+.daterangepicker.picker_1 .calendar-table td.off {
+  background: #34495E;
+  color: #999
+}
+.daterangepicker.picker_1 .calendar-table td.available:hover {
+  color: #34495E
+}
+.daterangepicker.picker_2 .calendar-table thead tr {
+  color: #1ABB9C
+}
+.daterangepicker.picker_2 .calendar-table thead tr:first-child {
+  color: #73879C
+}
+.daterangepicker.picker_3 .calendar-table thead tr:first-child {
+  color: #fff;
+  background: #1ABB9C
+}
+.daterangepicker.picker_4 .calendar-table thead tr:first-child {
+  color: #fff;
+  background: #34495E
+}
+.daterangepicker.picker_4 .calendar-table td,
+.daterangepicker.picker_4 .calendar-table td.off {
+  background: #ECF0F1;
+  border: 1px solid #fff;
+  border-radius: 0
+}
+.daterangepicker.picker_4 .calendar-table td.active {
+  background: #34495E
+}
+.calendar-exibit .show-calendar {
+  float: none;
+  display: block;
+  position: relative;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  margin-bottom: 20px;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  overflow: hidden
+}
+.calendar-exibit .show-calendar .calendar {
+  margin: 0 0 4px 0
+}
+.calendar-exibit .show-calendar.picker_1 {
+  background: #34495E
+}
+.calendar-exibit .calendar-table {
+  padding: 0 0 4px 0
+}
+.left_col {
+  background: #2A3F54
+}
+.nav-sm .container.body .col-md-3.left_col {
+  min-height: 100%;
+  width: 70px;
+  padding: 0;
+  z-index: 9999;
+  position: absolute
+}
+.nav-sm .container.body .col-md-3.left_col.menu_fixed {
+  position: fixed;
+  height: 100%
+}
+.nav-sm .container.body .col-md-3.left_col .mCSB_container,
+.nav-sm .container.body .col-md-3.left_col .mCustomScrollBox {
+  overflow: visible
+}
+.nav-sm .hidden-small {
+  visibility: hidden
+}
+.nav-sm .container.body .right_col {
+  padding: 10px 20px;
+  margin-left: 70px;
+  z-index: 2
+}
+.nav-sm .navbar.nav_title {
+  width: 70px
+}
+.nav-sm .navbar.nav_title a span {
+  display: none
+}
+.nav-sm .navbar.nav_title a i {
+  font-size: 27px;
+  margin: 13px 0 0 3px
+}
+.site_title i {
+  border: 1px solid #EAEAEA;
+  padding: 5px 6px;
+  border-radius: 50%
+}
+.nav-sm .main_container .top_nav {
+  display: block;
+  margin-left: 70px;
+  z-index: 2
+}
+.nav-sm .nav.side-menu li a {
+  text-align: center !important;
+  font-weight: 400;
+  font-size: 10px;
+  padding: 10px 5px
+}
+.nav-sm .nav.child_menu li.active,
+.nav-sm .nav.side-menu li.active-sm {
+  border-right: 5px solid #1ABB9C
+}
+.nav-sm ul.nav.child_menu ul,
+.nav-sm .nav.side-menu li.active-sm ul ul {
+  position: static;
+  width: 200px;
+  background: none
+}
+.nav-sm>.nav.side-menu>li.active-sm>a {
+  color: #1ABB9C !important
+}
+.nav-sm .nav.side-menu li a i.toggle-up {
+  display: none !important
+}
+.nav-sm .nav.side-menu li a i {
+  font-size: 25px !important;
+  text-align: center;
+  width: 100% !important;
+  margin-bottom: 5px
+}
+.nav-sm ul.nav.child_menu {
+  left: 100%;
+  position: absolute;
+  top: 0;
+  width: 210px;
+  z-index: 4000;
+  background: #3E5367;
+  display: none
+}
+.nav-sm ul.nav.child_menu li {
+  padding: 0 10px
+}
+.nav-sm ul.nav.child_menu li a {
+  text-align: left !important
+}
+.nav-sm .profile {
+  display: none
+}
+.menu_section {
+  margin-bottom: 35px
+}
+.menu_section h3 {
+  padding-left: 15px;
+  color: #fff;
+  text-transform: uppercase;
+  letter-spacing: .5px;
+  font-weight: bold;
+  font-size: 11px;
+  margin-bottom: 0;
+  margin-top: 0;
+  text-shadow: 1px 1px #000
+}
+.menu_section>ul {
+  margin-top: 10px
+}
+.profile_pic {
+  width: 35%;
+  float: left
+}
+.img-circle.profile_img {
+  width: 70%;
+  background: #fff;
+  margin-left: 15%;
+  z-index: 1000;
+  position: inherit;
+  margin-top: 20px;
+  border: 1px solid rgba(52, 73, 94, 0.44);
+  padding: 4px
+}
+.profile_info {
+  padding: 25px 10px 10px;
+  width: 65%;
+  float: left
+}
+.profile_info span {
+  font-size: 13px;
+  line-height: 30px;
+  color: #BAB8B8
+}
+.profile_info h2 {
+  font-size: 14px;
+  color: #ECF0F1;
+  margin: 0;
+  font-weight: 300
+}
+.profile.img_2 {
+  text-align: center
+}
+.profile.img_2 .profile_pic {
+  width: 100%
+}
+.profile.img_2 .profile_pic .img-circle.profile_img {
+  width: 50%;
+  margin: 10px 0 0
+}
+.profile.img_2 .profile_info {
+  padding: 15px 10px 0;
+  width: 100%;
+  margin-bottom: 10px;
+  float: left
+}
+.main_menu span.fa {
+  float: right;
+  text-align: center;
+  margin-top: 5px;
+  font-size: 10px;
+  min-width: inherit;
+  color: #C4CFDA
+}
+.active a span.fa {
+  text-align: right !important;
+  margin-right: 4px
+}
+.nav-sm .menu_section {
+  margin: 0
+}
+.nav-sm span.fa,
+.nav-sm .menu_section h3 {
+  display: none
+}
+.nav-sm li li span.fa {
+  display: inline-block
+}
+.nav_menu {
+  float: left;
+  background: #EDEDED;
+  border-bottom: 1px solid #D9DEE4;
+  margin-bottom: 10px;
+  width: 100%;
+  position: relative
+}
+@media (min-width: 480px) {
+  .nav_menu {
+    position: static
+  }
+}
+.nav-md .container.body .col-md-3.left_col {
+  min-height: 100%;
+  width: 230px;
+  padding: 0;
+  position: absolute;
+  display: -ms-flexbox;
+  display: flex;
+  z-index: 1
+}
+.nav-md .container.body .col-md-3.left_col.menu_fixed {
+  height: 100%;
+  position: fixed
+}
+body .container.body .right_col {
+  background: #F7F7F7
+}
+.nav-md .container.body .right_col {
+  padding: 10px 20px 0;
+  margin-left: 230px
+}
+.nav_title {
+  width: 230px;
+  float: left;
+  background: #2A3F54;
+  border-radius: 0;
+  height: 57px
+}
+@media (max-width: 991px) {
+  .nav-md .container.body .right_col,
+  .nav-md .container.body .top_nav {
+    width: 100%;
+    margin: 0
+  }
+  .nav-md .container.body .col-md-3.left_col {
+    display: none
+  }
+  .nav-md .container.body .right_col {
+    width: 100%;
+    padding-right: 0
+  }
+  .right_col {
+    padding: 10px !important
+  }
+}
+@media (max-width: 1200px) {
+  .x_title h2 {
+    width: 62%;
+    font-size: 17px
+  }
+  .tile,
+  .graph {
+    zoom: 85%;
+    height: inherit
+  }
+}
+@media (max-width: 1270px) and (min-width: 192px) {
+  .x_title h2 small {
+    display: none
+  }
+}
+.left_col .mCSB_scrollTools {
+  width: 6px
+}
+.left_col .mCSB_dragger {
+  max-height: 400px !important
+}
+.blue {
+  color: #3498DB
+}
+.purple {
+  color: #9B59B6
+}
+.green {
+  color: #1ABB9C
+}
+.aero {
+  color: #9CC2CB
+}
+.red {
+  color: #E74C3C
+}
+.dark {
+  color: #34495E
+}
+.border-blue {
+  border-color: #3498DB !important
+}
+.border-purple {
+  border-color: #9B59B6 !important
+}
+.border-green {
+  border-color: #1ABB9C !important
+}
+.border-aero {
+  border-color: #9CC2CB !important
+}
+.border-red {
+  border-color: #E74C3C !important
+}
+.border-dark {
+  border-color: #34495E !important
+}
+.bg-white {
+  background: #fff !important;
+  border: 1px solid #fff !important;
+  color: #73879C
+}
+.bg-green {
+  background: #1ABB9C !important;
+  border: 1px solid #1ABB9C !important;
+  color: #fff
+}
+.bg-red {
+  background: #E74C3C !important;
+  border: 1px solid #E74C3C !important;
+  color: #fff
+}
+.bg-blue {
+  background: #3498DB !important;
+  border: 1px solid #3498DB !important;
+  color: #fff
+}
+.bg-orange {
+  background: #F39C12 !important;
+  border: 1px solid #F39C12 !important;
+  color: #fff
+}
+.bg-purple {
+  background: #9B59B6 !important;
+  border: 1px solid #9B59B6 !important;
+  color: #fff
+}
+.bg-blue-sky {
+  background: #50C1CF !important;
+  border: 1px solid #50C1CF !important;
+  color: #fff
+}
+.container {
+  width: 100%;
+  padding: 0
+}
+.navbar-nav>li>a,
+.navbar-brand,
+.navbar-nav>li>a {
+  color: #fff !important
+}
+.top_nav .nav>li>a:focus,
+.top_nav .nav>li>a:hover,
+.top_nav .nav .open>a,
+.top_nav .nav .open>a:focus,
+.top_nav .nav .open>a:hover {
+  background: #D9DEE4
+}
+body {
+  color: #73879C;
+  background: #2A3F54;
+  font-family: "Helvetica Neue", Roboto, Arial, "Droid Sans", sans-serif;
+  font-size: 13px;
+  font-weight: 400;
+  line-height: 1.471
+}
+.main_container .top_nav {
+  display: block;
+  margin-left: 230px
+}
+.no-padding {
+  padding: 0 !important
+}
+.page-title {
+  width: 100%;
+  height: 65px;
+  padding: 10px 0
+}
+.page-title .title_left {
+  width: 45%;
+  float: left;
+  display: block
+}
+.page-title .title_left h3 {
+  margin: 9px 0
+}
+.page-title .title_right {
+  width: 55%;
+  float: left;
+  display: block
+}
+.page-title .title_right .pull-right {
+  margin: 10px 0
+}
+.fixed_height_320 {
+  height: 320px
+}
+.fixed_height_390 {
+  height: 390px
+}
+.fixed_height_200 {
+  height: 200px
+}
+.overflow_hidden {
+  overflow: hidden
+}
+.progress-bar-dark {
+  background-color: #34495E !important
+}
+.progress-bar-gray {
+  background-color: #BDC3C7 !important
+}
+table.no-margin .progress {
+  margin-bottom: 0
+}
+.main_content {
+  padding: 10px 20px
+}
+.col-md-55 {
+  width: 50%;
+  margin-bottom: 10px
+}
+@media (min-width: 768px) {
+  .col-md-55 {
+    width: 20%
+  }
+}
+@media (min-width: 992px) {
+  .col-md-55 {
+    width: 20%
+  }
+}
+@media (min-width: 1200px) {
+  .col-md-55 {
+    width: 20%
+  }
+}
+@media (min-width: 192px) and (max-width: 1270px) {
+  table.tile_info span.right {
+    margin-right: 7px;
+    float: left
+  }
+}
+.center-margin {
+  margin: 0 auto;
+  float: none !important
+}
+.col-md-55,
+.col-xs-1,
+.col-sm-1,
+.col-md-1,
+.col-lg-1,
+.col-xs-2,
+.col-sm-2,
+.col-md-2,
+.col-lg-2,
+.col-xs-3,
+.col-sm-3,
+.col-md-3,
+.col-lg-3,
+.col-xs-4,
+.col-sm-4,
+.col-md-4,
+.col-lg-4,
+.col-xs-5,
+.col-sm-5,
+.col-md-5,
+.col-lg-5,
+.col-xs-6,
+.col-sm-6,
+.col-md-6,
+.col-lg-6,
+.col-xs-7,
+.col-sm-7,
+.col-md-7,
+.col-lg-7,
+.col-xs-8,
+.col-sm-8,
+.col-md-8,
+.col-lg-8,
+.col-xs-9,
+.col-sm-9,
+.col-md-9,
+.col-lg-9,
+.col-xs-10,
+.col-sm-10,
+.col-md-10,
+.col-lg-10,
+.col-xs-11,
+.col-sm-11,
+.col-md-11,
+.col-lg-11,
+.col-xs-12,
+.col-sm-12,
+.col-md-12,
+.col-lg-12 {
+  position: relative;
+  min-height: 1px;
+  float: left;
+  padding-right: 10px;
+  padding-left: 10px
+}
+.row {
+  margin-right: -10px;
+  margin-left: -10px
+}
+.grid_slider .col-md-6 {
+  padding: 0 40px
+}
+h1,
+.h1,
+h2,
+.h2,
+h3,
+.h3 {
+  margin-top: 10px;
+  margin-bottom: 10px
+}
+a {
+  color: #5A738E;
+  text-decoration: none
+}
+a,
+a:visited,
+a:focus,
+a:active,
+:visited,
+:focus,
+:active,
+.btn:focus,
+.btn:active:focus,
+.btn.active:focus,
+.btn.focus,
+.btn:active.focus,
+.btn.active.focus {
+  outline: 0
+}
+a:hover,
+a:focus {
+  text-decoration: none
+}
+.navbar {
+  margin-bottom: 0
+}
+.navbar-header {
+  background: #34495E
+}
+.navbar-right {
+  margin-right: 0
+}
+.top_nav .navbar-right {
+  margin: 0;
+  width: 70%;
+  float: right
+}
+.top_nav .navbar-right li {
+  display: inline-block;
+  float: right;
+  position: static
+}
+@media (min-width: 480px) {
+  .top_nav .navbar-right li {
+    position: relative
+  }
+}
+.top_nav .dropdown-menu li {
+  width: 100%
+}
+.top_nav .dropdown-menu li a {
+  width: 100%;
+  padding: 12px 20px
+}
+.top_nav li a i {
+  font-size: 15px
+}
+.navbar-static-top {
+  position: fixed;
+  top: 0;
+  width: 100%
+}
+.sidebar-header {
+  border-bottom: 0;
+  margin-top: 46px
+}
+.sidebar-header:first-of-type {
+  margin-top: 0
+}
+.nav.side-menu>li {
+  position: relative;
+  display: block;
+  cursor: pointer
+}
+.nav.side-menu>li>a {
+  margin-bottom: 6px
+}
+.nav.side-menu>li>a:hover {
+  color: #F2F5F7 !important
+}
+.nav.side-menu>li>a:hover,
+.nav>li>a:focus {
+  text-decoration: none;
+  background: transparent
+}
+.nav.child_menu {
+  display: none
+}
+.nav.child_menu li:hover,
+.nav.child_menu li.active {
+  background-color: rgba(255, 255, 255, 0.06)
+}
+.nav.child_menu li {
+  padding-left: 36px
+}
+.nav-md ul.nav.child_menu li:before {
+  background: #425668;
+  bottom: auto;
+  content: "";
+  height: 8px;
+  left: 23px;
+  margin-top: 15px;
+  position: absolute;
+  right: auto;
+  width: 8px;
+  z-index: 1;
+  border-radius: 50%
+}
+.nav-md ul.nav.child_menu li:after {
+  border-left: 1px solid #425668;
+  bottom: 0;
+  content: "";
+  left: 27px;
+  position: absolute;
+  top: 0
+}
+.nav.side-menu>li>a,
+.nav.child_menu>li>a {
+  color: #E7E7E7;
+  font-weight: 500
+}
+.nav.child_menu li li:hover,
+.nav.child_menu li li.active {
+  background: none
+}
+.nav.child_menu li li a:hover,
+.nav.child_menu li li a.active {
+  color: #fff
+}
+.nav>li>a {
+  position: relative;
+  display: block;
+  padding: 13px 15px 12px
+}
+.nav.side-menu>li.current-page,
+.nav.side-menu>li.active {
+  border-right: 5px solid #1ABB9C
+}
+.nav li.current-page {
+  background: rgba(255, 255, 255, 0.05)
+}
+.nav li li li.current-page {
+  background: none
+}
+.nav li li.current-page a {
+  color: #fff
+}
+.nav.side-menu>li.active>a {
+  text-shadow: rgba(0, 0, 0, 0.25) 0 -1px 0;
+  background: linear-gradient(#334556, #2C4257), #2A3F54;
+  box-shadow: rgba(0, 0, 0, 0.25) 0 1px 0, inset rgba(255, 255, 255, 0.16) 0 1px 0
+}
+.navbar-brand,
+.navbar-nav>li>a {
+  font-weight: 500;
+  color: #ECF0F1 !important;
+  margin-left: 0 !important;
+  line-height: 32px
+}
+.site_title {
+  text-overflow: ellipsis;
+  overflow: hidden;
+  font-weight: 400;
+  font-size: 22px;
+  width: 100%;
+  color: #ECF0F1 !important;
+  margin-left: 0 !important;
+  line-height: 59px;
+  display: block;
+  height: 55px;
+  margin: 0;
+  padding-left: 10px
+}
+.site_title:hover,
+.site_title:focus {
+  text-decoration: none
+}
+.nav.navbar-nav>li>a {
+  color: #515356 !important
+}
+.nav.top_menu>li>a {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  color: #34495E !important
+}
+.nav>li>a:hover,
+.nav>li>a:focus {
+  background-color: transparent
+}
+.top_search {
+  padding: 0
+}
+.top_search .form-control {
+  border-right: 0;
+  box-shadow: inset 0 1px 0px rgba(0, 0, 0, 0.075);
+  border-radius: 25px 0px 0px 25px;
+  padding-left: 20px;
+  border: 1px solid rgba(221, 226, 232, 0.49)
+}
+.top_search .form-control:focus {
+  border: 1px solid rgba(221, 226, 232, 0.49);
+  border-right: 0
+}
+.top_search .input-group-btn button {
+  border-radius: 0px 25px 25px 0px;
+  border: 1px solid rgba(221, 226, 232, 0.49);
+  border-left: 0;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  color: #93A2B2;
+  margin-bottom: 0 !important
+}
+.toggle {
+  float: left;
+  margin: 0;
+  padding-top: 16px;
+  width: 70px
+}
+.toggle a {
+  padding: 15px 15px 0;
+  margin: 0;
+  cursor: pointer
+}
+.toggle a i {
+  font-size: 26px
+}
+.nav.child_menu>li>a {
+  color: rgba(255, 255, 255, 0.75);
+  font-size: 12px;
+  padding: 9px
+}
+.panel_toolbox {
+  float: right;
+  min-width: 70px
+}
+.panel_toolbox>li {
+  float: left;
+  cursor: pointer
+}
+.panel_toolbox>li>a {
+  padding: 5px;
+  color: #C5C7CB;
+  font-size: 14px
+}
+.panel_toolbox>li>a:hover {
+  background: #F5F7FA
+}
+.line_30 {
+  line-height: 30px
+}
+.main_menu_side {
+  padding: 0
+}
+.bs-docs-sidebar .nav>li>a {
+  display: block;
+  padding: 4px 6px
+}
+footer {
+  background: #fff;
+  padding: 15px 20px;
+  display: block
+}
+.nav-sm footer {
+  margin-left: 70px
+}
+.footer_fixed footer {
+  position: fixed;
+  left: 0px;
+  bottom: 0px;
+  width: 100%
+}
+@media (min-width: 768px) {
+  .footer_fixed footer {
+    margin-left: 0
+  }
+}
+@media (min-width: 768px) {
+  .footer_fixed .nav-sm footer {
+    margin-left: 0
+  }
+}
+.tile-stats.sparkline {
+  padding: 10px;
+  text-align: center
+}
+.jqstooltip {
+  background: #34495E !important;
+  width: 30px !important;
+  height: 22px !important;
+  text-decoration: none
+}
+.tooltip {
+  display: block !important
+}
+.tiles {
+  border-top: 1px solid #ccc;
+  margin-top: 15px;
+  padding-top: 5px;
+  margin-bottom: 0
+}
+.tile {
+  overflow: hidden
+}
+.top_tiles {
+  margin-bottom: 0
+}
+.top_tiles .tile h2 {
+  font-size: 30px;
+  line-height: 30px;
+  margin: 3px 0 7px;
+  font-weight: bold
+}
+article.media {
+  width: 100%
+}
+*,
+*:before,
+*:after {
+  box-sizing: border-box
+}
+#integration-list {
+  width: 100%;
+  margin: 0 auto;
+  display: table
+}
+#integration-list ul {
+  padding: 0;
+  margin: 20px 0;
+  color: #555
+}
+#integration-list ul>li {
+  list-style: none;
+  border-top: 1px solid #ddd;
+  display: block;
+  padding: 15px;
+  overflow: hidden
+}
+#integration-list ul:last-child {
+  border-bottom: 1px solid #ddd
+}
+#integration-list ul>li:hover {
+  background: #efefef
+}
+.expand {
+  display: block;
+  text-decoration: none;
+  color: #555;
+  cursor: pointer
+}
+.expand h2 {
+  width: 85%;
+  float: left
+}
+h2 {
+  font-size: 18px;
+  font-weight: 400
+}
+#left,
+#right {
+  display: table
+}
+#sup {
+  display: table-cell;
+  vertical-align: middle;
+  width: 80%
+}
+.detail a {
+  text-decoration: none;
+  color: #C0392B;
+  border: 1px solid #C0392B;
+  padding: 6px 10px 5px;
+  font-size: 13px;
+  margin-right: 7px
+}
+.detail {
+  margin: 10px 0 10px 0px;
+  display: none;
+  line-height: 22px;
+  height: 150px
+}
+.detail span {
+  margin: 0
+}
+.right-arrow {
+  width: 10px;
+  float: right;
+  font-weight: bold;
+  font-size: 20px
+}
+.accordion .panel {
+  margin-bottom: 5px;
+  border-radius: 0;
+  border-bottom: 1px solid #efefef
+}
+.accordion .panel-heading {
+  background: #F2F5F7;
+  padding: 13px;
+  width: 100%;
+  display: block
+}
+.accordion .panel:hover {
+  background: #F2F5F7
+}
+.x_panel {
+  position: relative;
+  width: 100%;
+  margin-bottom: 10px;
+  padding: 10px 17px;
+  display: inline-block;
+  background: #fff;
+  border: 1px solid #E6E9ED;
+  -webkit-column-break-inside: avoid;
+  -moz-column-break-inside: avoid;
+  column-break-inside: avoid;
+  opacity: 1;
+  transition: all .2s ease
+}
+.x_title {
+  border-bottom: 2px solid #E6E9ED;
+  padding: 1px 5px 6px;
+  margin-bottom: 10px
+}
+.x_title .filter {
+  width: 40%;
+  float: right
+}
+.x_title h2 {
+  margin: 5px 0 6px;
+  float: left;
+  display: block;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap
+}
+.x_title h2 small {
+  margin-left: 10px
+}
+.x_title span {
+  color: #BDBDBD
+}
+.x_content {
+  padding: 0 5px 6px;
+  position: relative;
+  width: 100%;
+  float: left;
+  clear: both;
+  margin-top: 5px
+}
+.x_content h4 {
+  font-size: 16px;
+  font-weight: 500
+}
+legend {
+  padding-bottom: 7px
+}
+.demo-placeholder {
+  height: 280px
+}
+.profile_details:nth-child(3n) {
+  clear: both
+}
+.profile_details .profile_view {
+  display: inline-block;
+  padding: 10px 0 0;
+  background: #fff
+}
+.profile_details .profile_view .divider {
+  border-top: 1px solid #e5e5e5;
+  padding-top: 5px;
+  margin-top: 5px
+}
+.profile_details .profile_view .ratings {
+  margin-bottom: 0
+}
+.profile_details .profile_view .bottom {
+  background: #F2F5F7;
+  padding: 9px 0;
+  border-top: 1px solid #E6E9ED
+}
+.profile_details .profile_view .left {
+  margin-top: 20px
+}
+.profile_details .profile_view .left p {
+  margin-bottom: 3px
+}
+.profile_details .profile_view .right {
+  margin-top: 0px;
+  padding: 10px
+}
+.profile_details .profile_view .img-circle {
+  border: 1px solid #E6E9ED;
+  padding: 2px
+}
+.profile_details .profile_view h2 {
+  margin: 5px 0
+}
+.profile_details .profile_view .ratings {
+  text-align: left;
+  font-size: 16px
+}
+.profile_details .profile_view .brief {
+  margin: 0;
+  font-weight: 300
+}
+.profile_details .profile_left {
+  background: white
+}
+.pagination.pagination-split li {
+  display: inline-block;
+  margin-right: 3px
+}
+.pagination.pagination-split li a {
+  border-radius: 4px;
+  color: #768399;
+  -moz-border-radius: 4px;
+  -webkit-border-radius: 4px
+}
+table.tile h3,
+table.tile h4,
+table.tile span {
+  font-weight: bold;
+  vertical-align: middle !important
+}
+table.tile th,
+table.tile td {
+  text-align: center
+}
+table.tile th {
+  border-bottom: 1px solid #E6ECEE
+}
+table.tile td {
+  padding: 5px 0
+}
+table.tile td ul {
+  text-align: left;
+  padding-left: 0
+}
+table.tile td ul li {
+  list-style: none;
+  width: 100%
+}
+table.tile td ul li a {
+  width: 100%
+}
+table.tile td ul li a big {
+  right: 0;
+  float: right;
+  margin-right: 13px
+}
+table.tile_info {
+  width: 100%
+}
+table.tile_info td {
+  text-align: left;
+  padding: 1px;
+  font-size: 15px
+}
+table.tile_info td p {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  margin: 0;
+  line-height: 28px
+}
+table.tile_info td i {
+  margin-right: 8px;
+  font-size: 17px;
+  float: left;
+  width: 18px;
+  line-height: 28px
+}
+table.tile_info td:first-child {
+  width: 83%
+}
+td span {
+  line-height: 28px
+}
+.sidebar-widget {
+  overflow: hidden
+}
+.error-number {
+  font-size: 90px;
+  line-height: 90px;
+  margin: 20px 0
+}
+.col-middle {
+  margin-top: 5%
+}
+.mid_center {
+  width: 370px;
+  margin: 0 auto;
+  text-align: center;
+  padding: 10px 20px
+}
+h3.degrees {
+  font-size: 22px;
+  font-weight: 400;
+  text-align: center
+}
+.degrees:after {
+  content: "o";
+  position: relative;
+  top: -12px;
+  font-size: 13px;
+  font-weight: 300
+}
+.daily-weather .day {
+  font-size: 14px;
+  border-top: 2px solid rgba(115, 135, 156, 0.36);
+  text-align: center;
+  border-bottom: 2px solid rgba(115, 135, 156, 0.36);
+  padding: 5px 0
+}
+.weather-days .col-sm-2 {
+  overflow: hidden;
+  width: 16.66666667%
+}
+.weather .row {
+  margin-bottom: 0
+}
+.bulk-actions {
+  display: none
+}
+table.countries_list {
+  width: 100%
+}
+table.countries_list td {
+  padding: 0 10px;
+  line-height: 30px;
+  border-top: 1px solid #eeeeee
+}
+.dataTables_paginate a {
+  padding: 6px 9px !important;
+  background: #ddd !important;
+  border-color: #ddd !important
+}
+.paging_full_numbers a.paginate_active {
+  background-color: rgba(38, 185, 154, 0.59) !important;
+  border-color: rgba(38, 185, 154, 0.59) !important
+}
+button.DTTT_button,
+div.DTTT_button,
+a.DTTT_button {
+  border: 1px solid #E7E7E7 !important;
+  background: #E7E7E7 !important;
+  box-shadow: none !important
+}
+table.jambo_table {
+  border: 1px solid rgba(221, 221, 221, 0.78)
+}
+table.jambo_table thead {
+  background: rgba(52, 73, 94, 0.94);
+  color: #ECF0F1
+}
+table.jambo_table tbody tr:hover td {
+  background: rgba(38, 185, 154, 0.07);
+  border-top: 1px solid rgba(38, 185, 154, 0.11);
+  border-bottom: 1px solid rgba(38, 185, 154, 0.11)
+}
+table.jambo_table tbody tr.selected {
+  background: rgba(38, 185, 154, 0.16)
+}
+table.jambo_table tbody tr.selected td {
+  border-top: 1px solid rgba(38, 185, 154, 0.4);
+  border-bottom: 1px solid rgba(38, 185, 154, 0.4)
+}
+.dataTables_paginate a {
+  background: #ff0000
+}
+.dataTables_wrapper {
+  position: relative;
+  clear: both;
+  zoom: 1
+}
+.dataTables_processing {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 250px;
+  height: 30px;
+  margin-left: -125px;
+  margin-top: -15px;
+  padding: 14px 0 2px 0;
+  border: 1px solid #ddd;
+  text-align: center;
+  color: #999;
+  font-size: 14px;
+  background-color: white
+}
+.dataTables_length {
+  width: 40%;
+  float: left
+}
+.dataTables_filter {
+  width: 50%;
+  float: right;
+  text-align: right
+}
+.dataTables_info {
+  width: 60%;
+  float: left
+}
+.dataTables_paginate {
+  float: right;
+  text-align: right
+}
+table.dataTable th.focus,
+table.dataTable td.focus {
+  outline: 2px solid #1ABB9C !important;
+  outline-offset: -1px
+}
+table.display {
+  margin: 0 auto;
+  clear: both;
+  width: 100%
+}
+table.display thead th {
+  padding: 8px 18px 8px 10px;
+  border-bottom: 1px solid black;
+  font-weight: bold;
+  cursor: pointer
+}
+table.display tfoot th {
+  padding: 3px 18px 3px 10px;
+  border-top: 1px solid black;
+  font-weight: bold
+}
+table.display tr.heading2 td {
+  border-bottom: 1px solid #aaa
+}
+table.display td {
+  padding: 3px 10px
+}
+table.display td.center {
+  text-align: center
+}
+table.display thead th:active,
+table.display thead td:active {
+  outline: none
+}
+.dataTables_scroll {
+  clear: both
+}
+.dataTables_scrollBody {
+  *margin-top: -1px;
+  -webkit-overflow-scrolling: touch
+}
+.top .dataTables_info {
+  float: none
+}
+.clear {
+  clear: both
+}
+.dataTables_empty {
+  text-align: center
+}
+tfoot input {
+  margin: 0.5em 0;
+  width: 100%;
+  color: #444
+}
+tfoot input.search_init {
+  color: #999
+}
+td.group {
+  background-color: #d1cfd0;
+  border-bottom: 2px solid #A19B9E;
+  border-top: 2px solid #A19B9E
+}
+td.details {
+  background-color: #d1cfd0;
+  border: 2px solid #A19B9E
+}
+.example_alt_pagination div.dataTables_info {
+  width: 40%
+}
+.paging_full_numbers {
+  width: 400px;
+  height: 22px;
+  line-height: 22px
+}
+.paging_full_numbers a:active {
+  outline: none
+}
+.paging_full_numbers a:hover {
+  text-decoration: none
+}
+.paging_full_numbers a.paginate_button,
+.paging_full_numbers a.paginate_active {
+  border: 1px solid #aaa;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  padding: 2px 5px;
+  margin: 0 3px;
+  cursor: pointer
+}
+.paging_full_numbers a.paginate_button {
+  background-color: #ddd
+}
+.paging_full_numbers a.paginate_button:hover {
+  background-color: #ccc;
+  text-decoration: none !important
+}
+.paging_full_numbers a.paginate_active {
+  background-color: #99B3FF
+}
+table.display tr.even.row_selected td {
+  background-color: #B0BED9
+}
+table.display tr.odd.row_selected td {
+  background-color: #9FAFD1
+}
+div.box {
+  height: 100px;
+  padding: 10px;
+  overflow: auto;
+  border: 1px solid #8080FF;
+  background-color: #E5E5FF
+}
+ul.msg_list li {
+  background: #f7f7f7;
+  padding: 5px;
+  display: -ms-flexbox;
+  display: flex;
+  margin: 6px 6px 0;
+  width: 96% !important
+}
+ul.msg_list li:last-child {
+  margin-bottom: 6px;
+  padding: 10px
+}
+ul.msg_list li a {
+  padding: 3px 5px !important
+}
+ul.msg_list li a .image img {
+  border-radius: 2px 2px 2px 2px;
+  -webkit-border-radius: 2px 2px 2px 2px;
+  float: left;
+  margin-right: 10px;
+  width: 11%
+}
+ul.msg_list li a .time {
+  font-size: 11px;
+  font-style: italic;
+  font-weight: bold;
+  position: absolute;
+  right: 35px
+}
+ul.msg_list li a .message {
+  display: block !important;
+  font-size: 11px
+}
+.dropdown-menu.msg_list span {
+  white-space: normal
+}
+.dropdown-menu {
+  border: medium none;
+  box-shadow: none;
+  display: none;
+  float: left;
+  font-size: 12px;
+  left: 0;
+  list-style: none outside none;
+  padding: 0;
+  position: absolute;
+  text-shadow: none;
+  top: 100%;
+  z-index: 9998;
+  border: 1px solid #D9DEE4;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0
+}
+.dropdown-menu>li>a {
+  color: #5A738E
+}
+.navbar-nav .open .dropdown-menu {
+  position: absolute;
+  background: #fff;
+  margin-top: 0;
+  border: 1px solid #D9DEE4;
+  -webkit-box-shadow: none;
+  right: 0;
+  left: auto;
+  width: 220px
+}
+.navbar-nav .open .dropdown-menu.msg_list {
+  width: 300px
+}
+.info-number .badge {
+  font-size: 10px;
+  font-weight: normal;
+  line-height: 13px;
+  padding: 2px 6px;
+  position: absolute;
+  right: 2px;
+  top: 8px
+}
+ul.to_do {
+  padding: 0
+}
+ul.to_do li {
+  background: #f3f3f3;
+  border-radius: 3px;
+  position: relative;
+  padding: 7px;
+  margin-bottom: 5px;
+  list-style: none
+}
+ul.to_do p {
+  margin: 0
+}
+.dashboard-widget {
+  background: #f6f6f6;
+  border-top: 5px solid #79C3DF;
+  border-radius: 3px;
+  padding: 5px 10px 10px
+}
+.dashboard-widget .dashboard-widget-title {
+  font-weight: normal;
+  border-bottom: 1px solid #c1cdcd;
+  margin: 0 0 10px 0;
+  padding-bottom: 5px;
+  padding-left: 40px;
+  line-height: 30px
+}
+.dashboard-widget .dashboard-widget-title i {
+  font-size: 100%;
+  margin-left: -35px;
+  margin-right: 10px;
+  color: #33a1c9;
+  padding: 3px 6px;
+  border: 1px solid #abd9ea;
+  border-radius: 5px;
+  background: #fff
+}
+ul.quick-list {
+  width: 45%;
+  padding-left: 0;
+  display: inline-block
+}
+ul.quick-list li {
+  padding-left: 10px;
+  list-style: none;
+  margin: 0;
+  padding-bottom: 6px;
+  padding-top: 4px;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden
+}
+ul.quick-list li i {
+  padding-right: 10px;
+  color: #757679
+}
+.dashboard-widget-content {
+  padding-top: 9px
+}
+.dashboard-widget-content .sidebar-widget {
+  width: 50%;
+  display: inline-block;
+  vertical-align: top;
+  background: #fff;
+  border: 1px solid #abd9ea;
+  border-radius: 5px;
+  text-align: center;
+  float: right;
+  padding: 2px;
+  margin-top: 10px
+}
+.widget_summary {
+  width: 100%;
+  display: -ms-inline-flexbox;
+  display: inline-flex
+}
+.widget_summary .w_left {
+  float: left;
+  text-align: left
+}
+.widget_summary .w_center {
+  float: left
+}
+.widget_summary .w_right {
+  float: left;
+  text-align: right
+}
+.widget_summary .w_right span {
+  font-size: 20px
+}
+.w_20 {
+  width: 20%
+}
+.w_25 {
+  width: 25%
+}
+.w_55 {
+  width: 55%
+}
+h5.graph_title {
+  text-align: left;
+  margin-left: 10px
+}
+h5.graph_title i {
+  margin-right: 10px;
+  font-size: 17px
+}
+span.right {
+  float: right;
+  font-size: 14px !important
+}
+.tile_info a {
+  text-overflow: ellipsis
+}
+.sidebar-footer {
+  bottom: 0px;
+  clear: both;
+  display: block;
+  padding: 5px 0 0 0;
+  position: fixed;
+  width: 230px;
+  background: #2A3F54;
+  z-index:999;
+}
+.sidebar-footer a {
+  padding: 7px 0 3px;
+  text-align: center;
+  width: 25%;
+  font-size: 17px;
+  display: block;
+  float: left;
+  background: #172D44;
+  cursor: pointer;
+}
+.sidebar-footer a:hover {
+  background: #425567
+}
+.tile_count {
+  margin-bottom: 20px;
+  margin-top: 20px
+}
+.tile_count .tile_stats_count {
+  border-bottom: 1px solid #D9DEE4;
+  padding: 0 10px 0 20px;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  position: relative
+}
+@media (min-width: 992px) {
+  footer {
+    margin-left: 230px
+  }
+}
+@media (min-width: 992px) {
+  .tile_count .tile_stats_count {
+    margin-bottom: 10px;
+    border-bottom: 0;
+    padding-bottom: 10px
+  }
+}
+.tile_count .tile_stats_count:before {
+  content: "";
+  position: absolute;
+  left: 0;
+  height: 65px;
+  border-left: 2px solid #ADB2B5;
+  margin-top: 10px
+}
+.tile_count .tile_stats_count .count {
+  font-size: 25px;
+  line-height: 47px;
+  font-weight: 600
+}
+.tile_count .tile_stats_count span {
+  font-size: 12px
+}
+@media (min-width: 768px) {
+  .tile_count .tile_stats_count span {
+    font-size: 13px
+  }
+}
+.tile_count .tile_stats_count .count_bottom i {
+  width: 12px
+}
+.dashboard_graph {
+  background: #fff;
+  padding: 7px 10px
+}
+.dashboard_graph .col-md-9,
+.dashboard_graph .col-md-3 {
+  padding: 0
+}
+a.user-profile {
+  color: #5E6974 !important
+}
+.user-profile img {
+  width: 29px;
+  height: 29px;
+  border-radius: 50%;
+  margin-right: 10px
+}
+ul.top_profiles {
+  height: 330px;
+  width: 100%
+}
+ul.top_profiles li {
+  margin: 0;
+  padding: 3px 5px
+}
+ul.top_profiles li:nth-child(odd) {
+  background-color: #eee
+}
+.media .profile_thumb {
+  border: 1px solid;
+  width: 50px;
+  height: 50px;
+  margin: 5px 10px 5px 0;
+  border-radius: 50%;
+  padding: 9px 12px
+}
+.media .profile_thumb i {
+  font-size: 30px
+}
+.media .date {
+  background: #ccc;
+  width: 52px;
+  margin-right: 10px;
+  border-radius: 10px;
+  padding: 5px
+}
+.media .date .month {
+  margin: 0;
+  text-align: center;
+  color: #fff
+}
+.media .date .day {
+  text-align: center;
+  color: #fff;
+  font-size: 27px;
+  margin: 0;
+  line-height: 27px;
+  font-weight: bold
+}
+.event .media-body a.title {
+  font-weight: bold
+}
+.event .media-body p {
+  margin-bottom: 0
+}
+h4.graph_title {
+  margin: 7px;
+  text-align: center
+}
+.fontawesome-icon-list .fa-hover a:hover {
+  background-color: #ddd;
+  color: #fff;
+  text-decoration: none
+}
+.fontawesome-icon-list .fa-hover a {
+  display: block;
+  line-height: 32px;
+  height: 32px;
+  padding-left: 10px;
+  border-radius: 4px
+}
+.fontawesome-icon-list .fa-hover a:hover .fa {
+  font-size: 28px;
+  vertical-align: -6px
+}
+.fontawesome-icon-list .fa-hover a .fa {
+  width: 32px;
+  font-size: 16px;
+  display: inline-block;
+  text-align: right;
+  margin-right: 10px
+}
+.main_menu .fa {
+  width: 26px;
+  opacity: .99;
+  display: inline-block;
+  font-family: FontAwesome;
+  font-style: normal;
+  font-weight: normal;
+  font-size: 18px;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale
+}
+.tile-stats {
+  position: relative;
+  display: block;
+  margin-bottom: 12px;
+  border: 1px solid #E4E4E4;
+  -webkit-border-radius: 5px;
+  overflow: hidden;
+  padding-bottom: 5px;
+  -webkit-background-clip: padding-box;
+  -moz-border-radius: 5px;
+  -moz-background-clip: padding;
+  border-radius: 5px;
+  background-clip: padding-box;
+  background: #FFF;
+  transition: all 300ms ease-in-out
+}
+.tile-stats:hover .icon i {
+  animation-name: tansformAnimation;
+  animation-duration: .5s;
+  animation-iteration-count: 1;
+  color: rgba(58, 58, 58, 0.41);
+  animation-timing-function: ease;
+  animation-fill-mode: forwards;
+  -webkit-animation-name: tansformAnimation;
+  -webkit-animation-duration: .5s;
+  -webkit-animation-iteration-count: 1;
+  -webkit-animation-timing-function: ease;
+  -webkit-animation-fill-mode: forwards;
+  -moz-animation-name: tansformAnimation;
+  -moz-animation-duration: .5s;
+  -moz-animation-iteration-count: 1;
+  -moz-animation-timing-function: ease;
+  -moz-animation-fill-mode: forwards
+}
+.tile-stats .icon {
+  width: 20px;
+  height: 20px;
+  color: #BAB8B8;
+  position: absolute;
+  right: 53px;
+  top: 22px;
+  z-index: 1
+}
+.tile-stats .icon i {
+  margin: 0;
+  font-size: 60px;
+  line-height: 0;
+  vertical-align: bottom;
+  padding: 0
+}
+.tile-stats .count {
+  font-size: 38px;
+  font-weight: bold;
+  line-height: 1.65857
+}
+.tile-stats .count,
+.tile-stats h3,
+.tile-stats p {
+  position: relative;
+  margin: 0;
+  margin-left: 10px;
+  z-index: 5;
+  padding: 0
+}
+.tile-stats h3 {
+  color: #BAB8B8
+}
+.tile-stats p {
+  margin-top: 5px;
+  font-size: 12px
+}
+.tile-stats>.dash-box-footer {
+  position: relative;
+  text-align: center;
+  margin-top: 5px;
+  padding: 3px 0;
+  color: #fff;
+  color: rgba(255, 255, 255, 0.8);
+  display: block;
+  z-index: 10;
+  background: rgba(0, 0, 0, 0.1);
+  text-decoration: none
+}
+.tile-stats>.dash-box-footer:hover {
+  color: #fff;
+  background: rgba(0, 0, 0, 0.15)
+}
+.tile-stats>.dash-box-footer:hover {
+  color: #fff;
+  background: rgba(0, 0, 0, 0.15)
+}
+table.tile_info {
+  padding: 10px 15px
+}
+table.tile_info span.right {
+  margin-right: 0;
+  float: right;
+  position: absolute;
+  right: 4%
+}
+.tile:hover {
+  text-decoration: none
+}
+.tile_header {
+  border-bottom: transparent;
+  padding: 7px 15px;
+  margin-bottom: 15px;
+  background: #E7E7E7
+}
+.tile_head h4 {
+  margin-top: 0;
+  margin-bottom: 5px
+}
+.tiles-bottom {
+  padding: 5px 10px;
+  margin-top: 10px;
+  background: rgba(194, 194, 194, 0.3);
+  text-align: left
+}
+a.star {
+  color: #428bca !important
+}
+.mail_content {
+  background: none repeat scroll 0 0 #FFFFFF;
+  border-radius: 4px;
+  margin-top: 20px;
+  min-height: 500px;
+  padding: 10px 11px;
+  width: 100%
+}
+.list-btn-mail {
+  margin-bottom: 15px
+}
+.list-btn-mail.active {
+  border-bottom: 1px solid #39B3D7;
+  padding: 0 0 14px
+}
+.list-btn-mail>i {
+  float: left;
+  font-size: 18px;
+  font-style: normal;
+  width: 33px
+}
+.list-btn-mail>.cn {
+  background: none repeat scroll 0 0 #39B3D7;
+  border-radius: 12px;
+  color: #FFFFFF;
+  float: right;
+  font-style: normal;
+  padding: 0 5px
+}
+.button-mail {
+  margin: 0 0 15px !important;
+  text-align: left;
+  width: 100%
+}
+button,
+.buttons,
+.btn,
+.modal-footer .btn+.btn {
+  margin-bottom: 5px;
+  margin-right: 5px
+}
+.btn-group-vertical .btn,
+.btn-group .btn {
+  margin-bottom: 0;
+  margin-right: 0
+}
+.mail_list_column {
+  border-left: 1px solid #DBDBDB
+}
+.mail_view {
+  border-left: 1px solid #DBDBDB
+}
+.mail_list {
+  width: 100%;
+  border-bottom: 1px solid #DBDBDB;
+  margin-bottom: 2px;
+  display: inline-block
+}
+.mail_list .left {
+  width: 5%;
+  float: left;
+  margin-right: 3%
+}
+.mail_list .right {
+  width: 90%;
+  float: left
+}
+.mail_list h3 {
+  font-size: 15px;
+  font-weight: bold;
+  margin: 0px 0 6px
+}
+.mail_list h3 small {
+  float: right;
+  color: #ADABAB;
+  font-size: 11px;
+  line-height: 20px
+}
+.mail_list .badge {
+  padding: 3px 6px;
+  font-size: 8px;
+  background: #BAB7B7
+}
+@media (max-width: 767px) {
+  .mail_list {
+    margin-bottom: 5px;
+    display: inline-block
+  }
+}
+.mail_heading h4 {
+  font-size: 18px;
+  border-bottom: 1px solid #ddd;
+  padding-bottom: 10px;
+  margin-top: 20px
+}
+.attachment {
+  margin-top: 30px
+}
+.attachment ul {
+  width: 100%;
+  list-style: none;
+  padding-left: 0;
+  display: inline-block;
+  margin-bottom: 30px
+}
+.attachment ul li {
+  float: left;
+  width: 150px;
+  margin-right: 10px;
+  margin-bottom: 10px
+}
+.attachment ul li img {
+  height: 150px;
+  border: 1px solid #ddd;
+  padding: 5px;
+  margin-bottom: 10px
+}
+.attachment ul li span {
+  float: right
+}
+.attachment .file-name {
+  float: left
+}
+.attachment .links {
+  width: 100%;
+  display: inline-block
+}
+.compose {
+  padding: 0;
+  position: fixed;
+  bottom: 0;
+  right: 0;
+  background: #fff;
+  border: 1px solid #D9DEE4;
+  border-right: 0;
+  border-bottom: 0;
+  border-top-left-radius: 5px;
+  z-index: 9999;
+  display: none
+}
+.compose .compose-header {
+  padding: 5px;
+  background: #169F85;
+  color: #fff;
+  border-top-left-radius: 5px
+}
+.compose .compose-header .close {
+  text-shadow: 0 1px 0 #ffffff;
+  line-height: .8
+}
+.compose .compose-body .editor.btn-toolbar {
+  margin: 0
+}
+.compose .compose-body .editor-wrapper {
+  height: 100%;
+  min-height: 50px;
+  max-height: 180px;
+  border-radius: 0;
+  border-left: none;
+  border-right: none;
+  overflow: auto
+}
+.compose .compose-footer {
+  padding: 10px
+}
+.editor.btn-toolbar {
+  zoom: 1;
+  background: #F7F7F7;
+  margin: 5px 2px;
+  padding: 3px 0;
+  border: 1px solid #EFEFEF
+}
+.input-group {
+  margin-bottom: 10px
+}
+.ln_solid {
+  border-top: 1px solid #e5e5e5;
+  color: #ffffff;
+  background-color: #ffffff;
+  height: 1px;
+  margin: 20px 0
+}
+span.section {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: inherit;
+  color: #333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5
+}
+.form-control {
+  border-radius: 0;
+  width: 100%
+}
+.form-horizontal .control-label {
+  padding-top: 8px
+}
+.form-control:focus {
+  border-color: #CCD0D7;
+  box-shadow: none !important
+}
+legend {
+  font-size: 18px;
+  color: inherit
+}
+.form-horizontal .form-group {
+  margin-right: 0;
+  margin-left: 0
+}
+.form-control-feedback {
+  margin-top: 8px;
+  height: 23px;
+  color: #bbb;
+  line-height: 24px;
+  font-size: 15px
+}
+.form-control-feedback.left {
+  border-right: 1px solid #ccc;
+  left: 13px
+}
+.form-control-feedback.right {
+  border-left: 1px solid #ccc;
+  right: 13px
+}
+.form-control.has-feedback-left {
+  padding-left: 45px
+}
+.form-control.has-feedback-right {
+  padding-right: 45px
+}
+.form-group {
+  margin-bottom: 10px
+}
+.validate {
+  margin-top: 10px
+}
+.invalid-form-error-message {
+  margin-top: 10px;
+  padding: 5px
+}
+.invalid-form-error-message.filled {
+  border-left: 2px solid #E74C3C
+}
+p.parsley-success {
+  color: #468847;
+  background-color: #DFF0D8;
+  border: 1px solid #D6E9C6
+}
+p.parsley-error {
+  color: #B94A48;
+  background-color: #F2DEDE;
+  border: 1px solid #EED3D7
+}
+ul.parsley-errors-list {
+  list-style: none;
+  color: #E74C3C;
+  padding-left: 0
+}
+input.parsley-error,
+textarea.parsley-error,
+select.parsley-error {
+  background: #FAEDEC;
+  border: 1px solid #E85445
+}
+.btn-group .parsley-errors-list {
+  display: none
+}
+.bad input,
+.bad select,
+.bad textarea {
+  border: 1px solid #CE5454;
+  box-shadow: 0 0 4px -2px #CE5454;
+  position: relative;
+  left: 0;
+  -moz-animation: .7s 1 shake linear;
+  -webkit-animation: 0.7s 1 shake linear
+}
+.item input,
+.item textarea {
+  transition: 0.42s
+}
+.item .alert {
+  float: left;
+  margin: 0 0 0 20px;
+  padding: 3px 10px;
+  color: #FFF;
+  border-radius: 3px 4px 4px 3px;
+  background-color: #CE5454;
+  max-width: 170px;
+  white-space: pre;
+  position: relative;
+  left: -15px;
+  opacity: 0;
+  z-index: 1;
+  transition: 0.15s ease-out
+}
+.item .alert::after {
+  content: '';
+  display: block;
+  height: 0;
+  width: 0;
+  border-color: transparent #CE5454 transparent transparent;
+  border-style: solid;
+  border-width: 11px 7px;
+  position: absolute;
+  left: -13px;
+  top: 1px
+}
+.item.bad .alert {
+  left: 0;
+  opacity: 1
+}
+.inl-bl {
+  display: inline-block
+}
+.well .markup {
+  background: #fff;
+  color: #777;
+  position: relative;
+  padding: 45px 15px 15px;
+  margin: 15px 0 0 0;
+  background-color: #fff;
+  border-radius: 0 0 4px 4px;
+  box-shadow: none
+}
+.well .markup::after {
+  content: "Example";
+  position: absolute;
+  top: 15px;
+  left: 15px;
+  font-size: 12px;
+  font-weight: bold;
+  color: #bbb;
+  text-transform: uppercase;
+  letter-spacing: 1px
+}
+.autocomplete-suggestions {
+  border: 1px solid #e4e4e4;
+  background: #F4F4F4;
+  cursor: default;
+  overflow: auto
+}
+.autocomplete-suggestion {
+  padding: 2px 5px;
+  font-size: 1.2em;
+  white-space: nowrap;
+  overflow: hidden
+}
+.autocomplete-selected {
+  background: #f0f0f0
+}
+.autocomplete-suggestions strong {
+  font-weight: normal;
+  color: #3399ff;
+  font-weight: bolder
+}
+.btn {
+  border-radius: 3px
+}
+a.btn-success,
+a.btn-primary,
+a.btn-warning,
+a.btn-danger {
+  color: #fff
+}
+.btn-success {
+  background: #26B99A;
+  border: 1px solid #169F85
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+  background: #169F85
+}
+.btn-dark {
+  color: #E9EDEF;
+  background-color: #4B5F71;
+  border-color: #364B5F
+}
+.btn-dark:hover,
+.btn-dark:focus,
+.btn-dark:active,
+.btn-dark.active,
+.open .dropdown-toggle.btn-dark {
+  color: #FFFFFF;
+  background-color: #394D5F;
+  border-color: #394D5F
+}
+.btn-round {
+  border-radius: 30px
+}
+.btn.btn-app {
+  position: relative;
+  padding: 15px 5px;
+  margin: 0 0 10px 10px;
+  min-width: 80px;
+  height: 60px;
+  box-shadow: none;
+  border-radius: 0;
+  text-align: center;
+  color: #666;
+  border: 1px solid #ddd;
+  background-color: #fafafa;
+  font-size: 12px
+}
+.btn.btn-app>.fa,
+.btn.btn-app>.glyphicon,
+.btn.btn-app>.ion {
+  font-size: 20px;
+  display: block
+}
+.btn.btn-app:hover {
+  background: #f4f4f4;
+  color: #444;
+  border-color: #aaa
+}
+.btn.btn-app:active,
+.btn.btn-app:focus {
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125)
+}
+.btn.btn-app>.badge {
+  position: absolute;
+  top: -3px;
+  right: -10px;
+  font-size: 10px;
+  font-weight: 400
+}
+textarea {
+  padding: 10px;
+  vertical-align: top;
+  width: 200px
+}
+textarea:focus {
+  outline-style: solid;
+  outline-width: 2px
+}
+.btn_ {
+  display: inline-block;
+  padding: 3px 9px;
+  margin-bottom: 0;
+  font-size: 14px;
+  line-height: 20px;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  color: #333333;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+  background-color: #f5f5f5;
+  background-image: linear-gradient(to bottom, #fff, #e6e6e6);
+  background-repeat: repeat-x;
+  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  border: 1px solid #cccccc;
+  border-bottom-color: #b3b3b3;
+  border-radius: 4px;
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05)
+}
+.bs-glyphicons {
+  margin: 0 -10px 20px;
+  overflow: hidden
+}
+.bs-glyphicons-list {
+  padding-left: 0;
+  list-style: none
+}
+.bs-glyphicons li {
+  float: left;
+  width: 25%;
+  height: 115px;
+  padding: 10px;
+  font-size: 10px;
+  line-height: 1.4;
+  text-align: center;
+  background-color: #f9f9f9;
+  border: 1px solid #fff
+}
+.bs-glyphicons .glyphicon {
+  margin-top: 5px;
+  margin-bottom: 10px;
+  font-size: 24px
+}
+.bs-glyphicons .glyphicon-class {
+  display: block;
+  text-align: center;
+  word-wrap: break-word
+}
+.bs-glyphicons li:hover {
+  color: #fff;
+  background-color: #1ABB9C
+}
+@media (min-width: 768px) {
+  .bs-glyphicons {
+    margin-right: 0;
+    margin-left: 0
+  }
+  .bs-glyphicons li {
+    width: 12.5%;
+    font-size: 12px
+  }
+}
+.tagsinput {
+  border: 1px solid #CCC;
+  background: #FFF;
+  padding: 6px 6px 0;
+  width: 300px;
+  overflow-y: auto
+}
+span.tag {
+  -moz-border-radius: 2px;
+  -webkit-border-radius: 2px;
+  display: block;
+  float: left;
+  padding: 5px 9px;
+  text-decoration: none;
+  background: #1ABB9C;
+  color: #F1F6F7;
+  margin-right: 5px;
+  font-weight: 500;
+  margin-bottom: 5px;
+  font-family: helvetica
+}
+span.tag a {
+  color: #F1F6F7 !important
+}
+.tagsinput span.tag a {
+  font-weight: bold;
+  color: #82ad2b;
+  text-decoration: none;
+  font-size: 11px
+}
+.tagsinput input {
+  width: 80px;
+  margin: 0px;
+  font-family: helvetica;
+  font-size: 13px;
+  border: 1px solid transparent;
+  padding: 3px;
+  background: transparent;
+  color: #000;
+  outline: 0px
+}
+.tagsinput div {
+  display: block;
+  float: left
+}
+.tags_clear {
+  clear: both;
+  width: 100%;
+  height: 0px
+}
+.not_valid {
+  background: #FBD8DB !important;
+  color: #90111A !important
+}
+ul.bar_tabs {
+  overflow: visible;
+  background: #F5F7FA;
+  height: 25px;
+  margin: 21px 0 14px;
+  padding-left: 14px;
+  position: relative;
+  z-index: 1;
+  width: 100%;
+  border-bottom: 1px solid #E6E9ED
+}
+ul.bar_tabs>li {
+  border: 1px solid #E6E9ED;
+  color: #333 !important;
+  margin-top: -17px;
+  margin-left: 8px;
+  background: #fff;
+  border-bottom: none;
+  border-radius: 4px 4px 0 0
+}
+ul.bar_tabs>li.active {
+  border-right: 6px solid #D3D6DA;
+  border-top: 0;
+  margin-top: -15px
+}
+ul.bar_tabs>li a {
+  padding: 10px 17px;
+  background: #F5F7FA;
+  margin: 0;
+  border-top-right-radius: 0
+}
+ul.bar_tabs>li a:hover {
+  border: 1px solid transparent
+}
+ul.bar_tabs>li.active a {
+  border-bottom: none
+}
+ul.bar_tabs.right {
+  padding-right: 14px
+}
+ul.bar_tabs.right li {
+  float: right
+}
+a:focus {
+  outline: none
+}
+ul.timeline li {
+  position: relative;
+  border-bottom: 1px solid #e8e8e8;
+  clear: both
+}
+.timeline .block {
+  margin: 0;
+  border-left: 3px solid #e8e8e8;
+  overflow: visible;
+  padding: 10px 15px;
+  margin-left: 105px
+}
+.timeline.widget {
+  min-width: 0;
+  max-width: inherit
+}
+.timeline.widget .block {
+  margin-left: 5px
+}
+.timeline .tags {
+  position: absolute;
+  top: 15px;
+  left: 0;
+  width: 84px
+}
+.timeline .tag {
+  display: block;
+  height: 30px;
+  font-size: 13px;
+  padding: 8px
+}
+.timeline .tag span {
+  display: block;
+  overflow: hidden;
+  width: 100%;
+  white-space: nowrap;
+  text-overflow: ellipsis
+}
+.tag {
+  line-height: 1;
+  background: #1ABB9C;
+  color: #fff !important
+}
+.tag:after {
+  content: " ";
+  height: 30px;
+  width: 0;
+  position: absolute;
+  left: 100%;
+  top: 0;
+  margin: 0;
+  pointer-events: none;
+  border-top: 14px solid transparent;
+  border-bottom: 14px solid transparent;
+  border-left: 11px solid #1ABB9C
+}
+.timeline h2.title {
+  position: relative;
+  font-size: 16px;
+  margin: 0
+}
+.timeline h2.title:before {
+  content: "";
+  position: absolute;
+  left: -23px;
+  top: 3px;
+  display: block;
+  width: 14px;
+  height: 14px;
+  border: 3px solid #d2d3d2;
+  border-radius: 14px;
+  background: #f9f9f9
+}
+.timeline .byline {
+  padding: .25em 0
+}
+.byline {
+  -webkit-font-smoothing: antialiased;
+  font-style: italic;
+  font-size: .9375em;
+  line-height: 1.3;
+  color: #aab6aa
+}
+ul.social li {
+  border: 0
+}
+.social-sidebar,
+.social-body {
+  float: right
+}
+.social-sidebar {
+  background: #EDEDED;
+  width: 22%
+}
+.social-body {
+  border: 1px solid #ccc;
+  width: 78%
+}
+.thumb img {
+  width: 50px;
+  height: 50px;
+  border-radius: 50%
+}
+.chat .thumb img {
+  width: 27px;
+  height: 27px;
+  border-radius: 50%
+}
+.chat .status {
+  float: left;
+  margin: 16px 0 0 -16px;
+  font-size: 14px;
+  font-weight: bold;
+  width: 12px;
+  height: 12px;
+  display: block;
+  border: 2px solid #FFF;
+  z-index: 12312;
+  border-radius: 50%
+}
+.chat .status.online {
+  background: #1ABB9C
+}
+.chat .status.away {
+  background: #F39C12
+}
+.chat .status.offline {
+  background: #ccc
+}
+.chat .media-body {
+  padding-top: 5px
+}
+.dashboard_graph .x_title {
+  padding: 5px 5px 7px
+}
+.dashboard_graph .x_title h3 {
+  margin: 0;
+  font-weight: normal
+}
+.chart {
+  position: relative;
+  display: inline-block;
+  width: 110px;
+  height: 110px;
+  margin-top: 5px;
+  margin-bottom: 5px;
+  text-align: center
+}
+.chart canvas {
+  position: absolute;
+  top: 0;
+  left: 0
+}
+.percent {
+  display: inline-block;
+  line-height: 110px;
+  z-index: 2;
+  font-size: 18px
+}
+.percent:after {
+  content: '%';
+  margin-left: 0.1em;
+  font-size: .8em
+}
+.angular {
+  margin-top: 100px
+}
+.angular .chart {
+  margin-top: 0
+}
+.widget {
+  min-width: 250px;
+  max-width: 310px
+}
+.widget_tally_box .btn-group button {
+  text-align: center
+}
+.widget_tally_box .btn-group button {
+  color: inherit;
+  font-weight: 500;
+  background-color: #f5f5f5;
+  border: 1px solid #e7e7e7
+}
+ul.widget_tally,
+ul.widget_tally li {
+  width: 100%
+}
+ul.widget_tally li {
+  padding: 2px 10px;
+  border-bottom: 1px solid #ECECEC;
+  padding-bottom: 4px
+}
+ul.widget_tally .month {
+  width: 70%;
+  float: left
+}
+ul.widget_tally .count {
+  width: 30%;
+  float: left;
+  text-align: right
+}
+.pie_bg {
+  border-bottom: 1px solid rgba(101, 204, 182, 0.16);
+  padding-bottom: 15px;
+  border-radius: 4px;
+  padding-bottom: 10px;
+  box-shadow: 0 4px 6px -6px #222
+}
+.widget_tally_box .flex {
+  display: -ms-flexbox;
+  display: flex
+}
+ul.widget_profile_box {
+  width: 100%;
+  height: 42px;
+  padding: 3px;
+  background: #ececec;
+  margin-top: 40px;
+  margin-left: 1px
+}
+ul.widget_profile_box li:first-child {
+  width: 25%;
+  float: left
+}
+ul.widget_profile_box li:first-child a {
+  float: left
+}
+ul.widget_profile_box li:last-child {
+  width: 25%;
+  float: right
+}
+ul.widget_profile_box li:last-child a {
+  float: right
+}
+ul.widget_profile_box li a {
+  font-size: 22px;
+  text-align: center;
+  width: 35px;
+  height: 35px;
+  border: 1px solid rgba(52, 73, 94, 0.44);
+  display: block;
+  border-radius: 50%;
+  padding: 0px
+}
+ul.widget_profile_box li a:hover {
+  color: #1ABB9C !important;
+  border: 1px solid #26b99a
+}
+ul.widget_profile_box li .profile_img {
+  width: 85px;
+  height: 85px;
+  margin: 0;
+  margin-top: -28px
+}
+.widget_tally_box p,
+.widget_tally_box span {
+  text-align: center
+}
+.widget_tally_box .name {
+  text-align: center;
+  margin: 25px
+}
+.widget_tally_box .name_title {
+  text-align: center;
+  margin: 5px
+}
+.widget_tally_box ul.legend {
+  margin: 0
+}
+.widget_tally_box ul.legend p,
+.widget_tally_box ul.legend span {
+  text-align: left
+}
+.widget_tally_box ul.legend li .icon {
+  font-size: 20px;
+  float: left;
+  width: 14px
+}
+.widget_tally_box ul.legend li .name {
+  font-size: 14px;
+  margin: 5px 0 0 14px;
+  text-overflow: ellipsis;
+  float: left
+}
+.widget_tally_box ul.legend p {
+  display: inline-block;
+  margin: 0
+}
+.widget_tally_box ul.verticle_bars li {
+  height: 140px;
+  width: 23%
+}
+.widget .verticle_bars li .progress.vertical.progress_wide {
+  width: 65%
+}
+ul.count2 {
+  width: 100%;
+  margin-left: 1px;
+  border: 1px solid #ddd;
+  border-left: 0;
+  border-right: 0;
+  padding: 10px 0
+}
+ul.count2 li {
+  width: 30%;
+  text-align: center
+}
+ul.count2 li h3 {
+  font-weight: 400;
+  margin: 0
+}
+ul.count2 li span {
+  font-weight: 300
+}
+.divider {
+  border-bottom: 1px solid #ddd;
+  margin: 10px
+}
+.divider-dashed {
+  border-top: 1px dashed #e7eaec;
+  background-color: #ffffff;
+  height: 1px;
+  margin: 10px 0
+}
+ul.messages {
+  padding: 0;
+  list-style: none
+}
+ul.messages li,
+.tasks li {
+  border-bottom: 1px dotted #e6e6e6;
+  padding: 8px 0
+}
+ul.messages li img.avatar,
+img.avatar {
+  height: 32px;
+  width: 32px;
+  float: left;
+  display: inline-block;
+  border-radius: 2px;
+  padding: 2px;
+  background: #f7f7f7;
+  border: 1px solid #e6e6e6
+}
+ul.messages li .message_date {
+  float: right;
+  text-align: right
+}
+ul.messages li .message_wrapper {
+  margin-left: 50px;
+  margin-right: 40px
+}
+ul.messages li .message_wrapper h4.heading {
+  font-weight: 600;
+  margin: 0;
+  cursor: pointer;
+  margin-bottom: 10px;
+  line-height: 100%
+}
+ul.messages li .message_wrapper blockquote {
+  padding: 0px 10px;
+  margin: 0;
+  border-left: 5px solid #eee
+}
+ul.user_data li {
+  margin-bottom: 6px
+}
+ul.user_data li p {
+  margin-bottom: 0
+}
+ul.user_data li .progress {
+  width: 90%
+}
+.project_progress .progress {
+  margin-bottom: 3px !important;
+  margin-top: 5px
+}
+.projects .list-inline {
+  margin: 0
+}
+.profile_title {
+  background: #F5F7FA;
+  border: 0;
+  padding: 7px 0;
+  display: -ms-flexbox;
+  display: flex
+}
+ul.stats-overview {
+  border-bottom: 1px solid #e8e8e8;
+  padding-bottom: 10px;
+  margin-bottom: 10px
+}
+ul.stats-overview li {
+  display: inline-block;
+  text-align: center;
+  padding: 0 15px;
+  width: 30%;
+  font-size: 14px;
+  border-right: 1px solid #e8e8e8
+}
+ul.stats-overview li:last-child {
+  border-right: 0
+}
+ul.stats-overview li .name {
+  font-size: 12px
+}
+ul.stats-overview li .value {
+  font-size: 14px;
+  font-weight: bold;
+  display: block
+}
+ul.stats-overview li:first-child {
+  padding-left: 0
+}
+ul.project_files li {
+  margin-bottom: 5px
+}
+ul.project_files li a i {
+  width: 20px
+}
+.project_detail p {
+  margin-bottom: 10px
+}
+.project_detail p.title {
+  font-weight: bold;
+  margin-bottom: 0
+}
+.avatar img {
+  border-radius: 50%;
+  max-width: 45px
+}
+.pricing {
+  background: #fff
+}
+.pricing .title {
+  background: #1ABB9C;
+  height: 110px;
+  color: #fff;
+  padding: 15px 0 0;
+  text-align: center
+}
+.pricing .title h2 {
+  text-transform: capitalize;
+  font-size: 18px;
+  border-radius: 5px 5px 0 0;
+  margin: 0;
+  font-weight: 400
+}
+.pricing .title h1 {
+  font-size: 30px;
+  margin: 12px
+}
+.pricing .title span {
+  background: rgba(51, 51, 51, 0.28);
+  padding: 2px 5px
+}
+.pricing_features {
+  background: #FAFAFA;
+  padding: 20px 15px;
+  min-height: 230px;
+  font-size: 13.5px
+}
+.pricing_features ul li {
+  margin-top: 10px
+}
+.pricing_footer {
+  padding: 10px 15px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  text-align: center;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px
+}
+.pricing_footer p {
+  font-size: 13px;
+  padding: 10px 0 2px;
+  display: block
+}
+.ui-ribbon-container {
+  position: relative
+}
+.ui-ribbon-container .ui-ribbon-wrapper {
+  position: absolute;
+  overflow: hidden;
+  width: 85px;
+  height: 88px;
+  top: -3px;
+  right: -3px
+}
+.ui-ribbon-container.ui-ribbon-primary .ui-ribbon {
+  background-color: #5b90bf
+}
+.ui-ribbon-container .ui-ribbon {
+  position: relative;
+  display: block;
+  text-align: center;
+  font-size: 15px;
+  font-weight: 700;
+  color: #fff;
+  transform: rotate(45deg);
+  padding: 7px 0;
+  left: -5px;
+  top: 15px;
+  width: 120px;
+  line-height: 20px;
+  background-color: #555;
+  box-shadow: 0 0 3px rgba(0, 0, 0, 0.3)
+}
+.ui-ribbon-container.ui-ribbon-primary .ui-ribbon:after,
+.ui-ribbon-container.ui-ribbon-primary .ui-ribbon:before {
+  border-top: 2px solid #5b90bf
+}
+.ui-ribbon-container .ui-ribbon:before {
+  left: 0;
+  bottom: -1px
+}
+.ui-ribbon-container .ui-ribbon:before {
+  right: 0
+}
+.ui-ribbon-container .ui-ribbon:after,
+.ui-ribbon-container .ui-ribbon:before {
+  position: absolute;
+  content: " ";
+  line-height: 0;
+  border-top: 2px solid #555;
+  border-left: 2px solid transparent;
+  border-right: 2px solid transparent
+}
+.thumbnail .image {
+  height: 120px;
+  overflow: hidden
+}
+.caption {
+  padding: 9px 5px;
+  background: #F7F7F7
+}
+.caption p {
+  margin-bottom: 5px
+}
+.thumbnail {
+  height: 190px;
+  overflow: hidden
+}
+.view {
+  overflow: hidden;
+  position: relative;
+  text-align: center;
+  box-shadow: 1px 1px 2px #e6e6e6;
+  cursor: default
+}
+.view .mask,
+.view .content {
+  position: absolute;
+  width: 100%;
+  overflow: hidden;
+  top: 0;
+  left: 0
+}
+.view img {
+  display: block;
+  position: relative
+}
+.view .tools {
+  text-transform: uppercase;
+  color: #fff;
+  text-align: center;
+  position: relative;
+  font-size: 17px;
+  padding: 3px;
+  background: rgba(0, 0, 0, 0.35);
+  margin: 43px 0 0 0
+}
+.mask.no-caption .tools {
+  margin: 90px 0 0 0
+}
+.view .tools a {
+  display: inline-block;
+  color: #FFF;
+  font-size: 18px;
+  font-weight: 400;
+  padding: 0 4px
+}
+.view p {
+  font-family: Georgia, serif;
+  font-style: italic;
+  font-size: 12px;
+  position: relative;
+  color: #fff;
+  padding: 10px 20px 20px;
+  text-align: center
+}
+.view a.info {
+  display: inline-block;
+  text-decoration: none;
+  padding: 7px 14px;
+  background: #000;
+  color: #fff;
+  text-transform: uppercase;
+  box-shadow: 0 0 1px #000
+}
+.view-first img {
+  transition: all 0.2s linear
+}
+.view-first .mask {
+  opacity: 0;
+  background-color: rgba(0, 0, 0, 0.5);
+  transition: all 0.4s ease-in-out
+}
+.view-first .tools {
+  transform: translateY(-100px);
+  opacity: 0;
+  transition: all 0.2s ease-in-out
+}
+.view-first p {
+  transform: translateY(100px);
+  opacity: 0;
+  transition: all 0.2s linear
+}
+.view-first:hover img {
+  transform: scale(1.1)
+}
+.view-first:hover .mask {
+  opacity: 1
+}
+.view-first:hover .tools,
+.view-first:hover p {
+  opacity: 1;
+  transform: translateY(0px)
+}
+.view-first:hover p {
+  transition-delay: 0.1s
+}
+.form-group.has-feedback span {
+  display: block !important;
+}
+.form-group .btn {
+  margin-bottom: -6px;
+}
+
+.input-group-btn .btn { margin-bottom:0; }
+
+/*!
+ * bootstrap-vertical-tabs - v1.2.1
+ * https://dbtek.github.io/bootstrap-vertical-tabs
+ * 2014-11-07
+ * Copyright (c) 2014 Ismail Demirbilek
+ * License: MIT
+ */
+
+.tabs-left,
+.tabs-right {
+  border-bottom: none;
+  padding-top: 2px
+}
+.tabs-left {
+  border-right: 1px solid #F7F7F7
+}
+.tabs-right {
+  border-left: 1px solid #F7F7F7
+}
+.tabs-left>li,
+.tabs-right>li {
+  float: none;
+  margin-bottom: 2px
+}
+.tabs-left>li {
+  margin-right: -1px
+}
+.tabs-right>li {
+  margin-left: -1px
+}
+.tabs-left>li.active>a,
+.tabs-left>li.active>a:hover,
+.tabs-left>li.active>a:focus {
+  border-bottom-color: #F7F7F7;
+  border-right-color: transparent
+}
+.tabs-right>li.active>a,
+.tabs-right>li.active>a:hover,
+.tabs-right>li.active>a:focus {
+  border-bottom: 1px solid #F7F7F7;
+  border-left-color: transparent
+}
+.tabs-left>li>a {
+  border-radius: 4px 0 0 4px;
+  margin-right: 0;
+  display: block;
+  background: #F7F7F7;
+  text-overflow: ellipsis;
+  overflow: hidden
+}
+.tabs-right>li>a {
+  border-radius: 0 4px 4px 0;
+  margin-right: 0;
+  background: #F7F7F7;
+  text-overflow: ellipsis;
+  overflow: hidden
+}
+.sideways {
+  margin-top: 50px;
+  border: none;
+  position: relative
+}
+.sideways>li {
+  height: 20px;
+  width: 120px;
+  margin-bottom: 100px
+}
+.sideways>li>a {
+  border-bottom: 1px solid #ddd;
+  border-right-color: transparent;
+  text-align: center;
+  border-radius: 4px 4px 0px 0px
+}
+.sideways>li.active>a,
+.sideways>li.active>a:hover,
+.sideways>li.active>a:focus {
+  border-bottom-color: transparent;
+  border-right-color: #ddd;
+  border-left-color: #ddd
+}
+.sideways.tabs-left {
+  left: -50px
+}
+.sideways.tabs-right {
+  right: -50px
+}
+.sideways.tabs-right>li {
+  transform: rotate(90deg)
+}
+.sideways.tabs-left>li {
+  transform: rotate(-90deg)
+}
+.morris-hover {
+  position: absolute;
+  z-index: 1000
+}
+.morris-hover.morris-default-style {
+  padding: 6px;
+  color: #666;
+  background: rgba(243, 242, 243, 0.8);
+  border: solid 2px rgba(195, 194, 196, 0.8);
+  font-family: sans-serif;
+  font-size: 12px;
+  text-align: center
+}
+.morris-hover.morris-default-style .morris-hover-row-label {
+  font-weight: bold;
+  margin: 0.25em 0
+}
+.morris-hover.morris-default-style .morris-hover-point {
+  white-space: nowrap;
+  margin: 0.1em 0
+}
+.price {
+  font-size: 40px;
+  font-weight: 400;
+  color: #26B99A;
+  margin: 0
+}
+.prod_title {
+  border-bottom: 1px solid #DFDFDF;
+  padding-bottom: 5px;
+  margin: 30px 0;
+  font-size: 20px;
+  font-weight: 400
+}
+.product-image img {
+  width: 90%
+}
+.prod_color li {
+  margin: 0 10px
+}
+.prod_color li p {
+  margin-bottom: 0
+}
+.prod_size li {
+  padding: 0
+}
+.prod_color .color {
+  width: 25px;
+  height: 25px;
+  border: 2px solid rgba(51, 51, 51, 0.28) !important;
+  padding: 2px;
+  border-radius: 50px
+}
+.product_gallery a {
+  width: 100px;
+  height: 100px;
+  float: left;
+  margin: 10px;
+  border: 1px solid #e5e5e5
+}
+.product_gallery a img {
+  width: 100%;
+  margin-top: 15px
+}
+.product_price {
+  margin: 20px 0;
+  padding: 5px 10px;
+  background-color: #FFFFFF;
+  text-align: left;
+  border: 2px dashed #E0E0E0
+}
+.price-tax {
+  font-size: 18px
+}
+.product_social {
+  margin: 20px 0
+}
+.product_social ul li a i {
+  font-size: 35px
+}
+.login {
+  background: #F7F7F7
+}
+.login .fa-paw {
+  font-size: 26px
+}
+a.hiddenanchor {
+  display: none
+}
+.login_wrapper {
+  right: 0px;
+  margin: 0px auto;
+  margin-top: 5%;
+  max-width: 350px;
+  position: relative
+}
+.registration_form,
+.login_form {
+  position: absolute;
+  top: 0px;
+  width: 100%
+}
+.registration_form {
+  z-index: 21;
+  opacity: 0;
+  width: 100%
+}
+.login_form {
+  z-index: 22
+}
+#signup:target ~ .login_wrapper .registration_form,
+#signin:target ~ .login_wrapper .login_form {
+  z-index: 22;
+  animation-name: fadeInLeft;
+  animation-delay: .1s
+}
+#signup:target ~ .login_wrapper .login_form,
+#signin:target ~ .login_wrapper .registration_form {
+  animation-name: fadeOutLeft
+}
+.animate {
+  -webkit-animation-duration: 0.5s;
+  -webkit-animation-timing-function: ease;
+  -webkit-animation-fill-mode: both;
+  -moz-animation-duration: 0.5s;
+  -moz-animation-timing-function: ease;
+  -moz-animation-fill-mode: both;
+  -o-animation-duration: 0.5s;
+  -o-animation-timing-function: ease;
+  -o-animation-fill-mode: both;
+  -ms-animation-duration: 0.5s;
+  -ms-animation-timing-function: ease;
+  -ms-animation-fill-mode: both;
+  animation-duration: 0.5s;
+  animation-timing-function: ease;
+  animation-fill-mode: both
+}
+.login_box {
+  padding: 20px;
+  margin: auto
+}
+.left {
+  float: left
+}
+.alignleft {
+  float: left;
+  margin-right: 15px
+}
+.alignright {
+  float: right;
+  margin-left: 15px
+}
+.clearfix:after,
+form:after {
+  content: ".";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden
+}
+.login_content {
+  margin: 0 auto;
+  padding: 25px 0 0;
+  position: relative;
+  text-align: center;
+  text-shadow: 0 1px 0 #fff;
+  min-width: 280px
+}
+.login_content a,
+.login_content .btn-default:hover {
+  text-decoration: none
+}
+.login_content a:hover {
+  text-decoration: underline
+}
+.login_content h1 {
+  font: normal 25px Helvetica, Arial, sans-serif;
+  letter-spacing: -0.05em;
+  line-height: 20px;
+  margin: 10px 0 30px
+}
+.login_content h1:before,
+.login_content h1:after {
+  content: "";
+  height: 1px;
+  position: absolute;
+  top: 10px;
+  width: 27%
+}
+.login_content h1:after {
+  background: #7e7e7e;
+  background: linear-gradient(left, #7e7e7e 0%, #fff 100%);
+  right: 0
+}
+.login_content h1:before {
+  background: #7e7e7e;
+  background: linear-gradient(right, #7e7e7e 0%, #fff 100%);
+  left: 0
+}
+.login_content h1:before,
+.login_content h1:after {
+  content: "";
+  height: 1px;
+  position: absolute;
+  top: 10px;
+  width: 20%
+}
+.login_content h1:after {
+  background: #7e7e7e;
+  background: linear-gradient(left, #7e7e7e 0%, #fff 100%);
+  right: 0
+}
+.login_content h1:before {
+  background: #7e7e7e;
+  background: linear-gradient(right, #7e7e7e 0%, #fff 100%);
+  left: 0
+}
+.login_content form {
+  margin: 20px 0;
+  position: relative
+}
+.login_content form input[type="text"],
+.login_content form input[type="email"],
+.login_content form input[type="password"] {
+  border-radius: 3px;
+  -ms-box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset;
+  -o-box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset;
+  box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset;
+  border: 1px solid #c8c8c8;
+  color: #777;
+  margin: 0 0 20px;
+  width: 100%
+}
+.login_content form input[type="text"]:focus,
+.login_content form input[type="email"]:focus,
+.login_content form input[type="password"]:focus {
+  -ms-box-shadow: 0 0 2px #ed1c24 inset;
+  -o-box-shadow: 0 0 2px #ed1c24 inset;
+  box-shadow: 0 0 2px #A97AAD inset;
+  background-color: #fff;
+  border: 1px solid #A878AF;
+  outline: none
+}
+#username {
+  background-position: 10px 10px !important
+}
+#password {
+  background-position: 10px -53px !important
+}
+.login_content form div a {
+  font-size: 12px;
+  margin: 10px 15px 0 0
+}
+.reset_pass {
+  margin-top: 10px !important
+}
+.login_content div .reset_pass {
+  margin-top: 13px !important;
+  margin-right: 39px;
+  float: right
+}
+.separator {
+  border-top: 1px solid #D8D8D8;
+  margin-top: 10px;
+  padding-top: 10px
+}
+.button {
+  background: #f7f9fa;
+  background: linear-gradient(top, #f7f9fa 0%, #f0f0f0 100%);
+  -ms-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset;
+  -o-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset;
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset;
+  border-radius: 0 0 5px 5px;
+  border-top: 1px solid #CFD5D9;
+  padding: 15px 0
+}
+.login_content form input[type="submit"],
+#content form .submit {
+  float: left;
+  margin-left: 38px
+}
+.button a {
+  background: url(http://cssdeck.com/uploads/media/items/8/8bcLQqF.png) 0 -112px no-repeat;
+  color: #7E7E7E;
+  font-size: 17px;
+  padding: 2px 0 2px 40px;
+  text-decoration: none;
+  transition: all 0.3s ease
+}
+.button a:hover {
+  background-position: 0 -135px;
+  color: #00aeef
+}
+header {
+  width: 100%
+}
+#nprogress .bar {
+  background: #1ABB9C
+}
+#nprogress .peg {
+  box-shadow: 0 0 10px #1ABB9C, 0 0 5px #1ABB9C
+}
+#nprogress .spinner-icon {
+  border-top-color: #1ABB9C;
+  border-left-color: #1ABB9C
+}
+.editor-wrapper {
+  min-height: 250px;
+  background-color: white;
+  border-collapse: separate;
+  border: 1px solid #ccc;
+  padding: 4px;
+  box-sizing: content-box;
+  box-shadow: rgba(0, 0, 0, 0.07451) 0px 1px 1px 0px inset;
+  border-top-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+  border-top-left-radius: 3px;
+  overflow: scroll;
+  outline: none
+}
+.voiceBtn {
+  width: 20px;
+  color: transparent;
+  background-color: transparent;
+  transform: scale(2, 2);
+  -webkit-transform: scale(2, 2);
+  -moz-transform: scale(2, 2);
+  border: transparent;
+  cursor: pointer;
+  box-shadow: none;
+  -webkit-box-shadow: none
+}
+div[data-role="editor-toolbar"] {
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none
+}
+.dropdown-menu a {
+  cursor: pointer
+}
+.select2-container--default .select2-selection--single,
+.select2-container--default .select2-selection--multiple {
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border-radius: 0;
+  min-height: 38px
+}
+.select2-container--default .select2-selection--single .select2-selection__rendered {
+  color: #73879C;
+  padding-top: 5px
+}
+.select2-container--default .select2-selection--multiple .select2-selection__rendered {
+  padding-top: 3px
+}
+.select2-container--default .select2-selection--single .select2-selection__arrow {
+  height: 36px
+}
+.select2-container--default .select2-selection--multiple .select2-selection__choice,
+.select2-container--default .select2-selection--multiple .select2-selection__clear {
+  margin-top: 2px;
+  border: none;
+  border-radius: 0;
+  padding: 3px 5px
+}
+.select2-container--default.select2-container--focus .select2-selection--multiple {
+  border: 1px solid #ccc
+}
+.switchery {
+  width: 32px;
+  height: 20px
+}
+.switchery>small {
+  width: 20px;
+  height: 20px
+}
+fieldset {
+  border: none;
+  margin: 0;
+  padding: 0
+}
+.cropper .img-container,
+.cropper .img-preview {
+  background-color: #f7f7f7;
+  width: 100%;
+  text-align: center
+}
+.cropper .img-container {
+  min-height: 200px;
+  max-height: 516px;
+  margin-bottom: 20px
+}
+@media (min-width: 768px) {
+  .cropper .img-container {
+    min-height: 516px
+  }
+}
+.cropper .img-container>img {
+  max-width: 100%
+}
+.cropper .docs-preview {
+  margin-right: -15px
+}
+.cropper .img-preview {
+  float: left;
+  margin-right: 10px;
+  margin-bottom: 10px;
+  overflow: hidden
+}
+.cropper .img-preview>img {
+  max-width: 100%
+}
+.cropper .preview-lg {
+  width: 263px;
+  height: 148px
+}
+.cropper .preview-md {
+  width: 139px;
+  height: 78px
+}
+.cropper .preview-sm {
+  width: 69px;
+  height: 39px
+}
+.cropper .preview-xs {
+  width: 35px;
+  height: 20px;
+  margin-right: 0
+}
+.cropper .docs-data>.input-group {
+  margin-bottom: 10px
+}
+.cropper .docs-data>.input-group>label {
+  min-width: 80px
+}
+.cropper .docs-data>.input-group>span {
+  min-width: 50px
+}
+.cropper .docs-buttons>.btn,
+.cropper .docs-buttons>.btn-group,
+.cropper .docs-buttons>.form-control {
+  margin-right: 5px;
+  margin-bottom: 10px
+}
+.cropper .docs-toggles>.btn,
+.cropper .docs-toggles>.btn-group,
+.cropper .docs-toggles>.dropdown {
+  margin-bottom: 10px
+}
+.cropper .docs-tooltip {
+  display: block;
+  margin: -6px -12px;
+  padding: 6px 12px
+}
+.cropper .docs-tooltip>.icon {
+  margin: 0 -3px;
+  vertical-align: top
+}
+.cropper .tooltip-inner {
+  white-space: normal
+}
+.cropper .btn-upload .tooltip-inner,
+.cropper .btn-toggle .tooltip-inner {
+  white-space: nowrap
+}
+.cropper .btn-toggle {
+  padding: 6px
+}
+.cropper .btn-toggle>.docs-tooltip {
+  margin: -6px;
+  padding: 6px
+}
+@media (max-width: 400px) {
+  .cropper .btn-group-crop {
+    margin-right: -15px !important
+  }
+  .cropper .btn-group-crop>.btn {
+    padding-left: 5px;
+    padding-right: 5px
+  }
+  .cropper .btn-group-crop .docs-tooltip {
+    margin-left: -5px;
+    margin-right: -5px;
+    padding-left: 5px;
+    padding-right: 5px
+  }
+}
+.cropper .docs-options .dropdown-menu {
+  width: 100%
+}
+.cropper .docs-options .dropdown-menu>li {
+  padding: 3px 20px
+}
+.cropper .docs-options .dropdown-menu>li:hover {
+  background-color: #f7f7f7
+}
+.cropper .docs-options .dropdown-menu>li>label {
+  display: block
+}
+.cropper .docs-cropped .modal-body {
+  text-align: center
+}
+.cropper .docs-cropped .modal-body>img,
+.cropper .docs-cropped .modal-body>canvas {
+  max-width: 100%
+}
+.cropper .docs-diagram .modal-dialog {
+  max-width: 352px
+}
+.cropper .docs-cropped canvas {
+  max-width: 100%
+}
+.form_wizard .stepContainer {
+  display: block;
+  position: relative;
+  margin: 0;
+  padding: 0;
+  border: 0 solid #CCC;
+  overflow-x: hidden
+}
+.wizard_horizontal ul.wizard_steps {
+  display: table;
+  list-style: none;
+  position: relative;
+  width: 100%;
+  margin: 0 0 20px
+}
+.wizard_horizontal ul.wizard_steps li {
+  display: table-cell;
+  text-align: center
+}
+.wizard_horizontal ul.wizard_steps li a,
+.wizard_horizontal ul.wizard_steps li:hover {
+  display: block;
+  position: relative;
+  -moz-opacity: 1;
+  filter: alpha(opacity=100);
+  opacity: 1;
+  color: #666
+}
+.wizard_horizontal ul.wizard_steps li a:before {
+  content: "";
+  position: absolute;
+  height: 4px;
+  background: #ccc;
+  top: 20px;
+  width: 100%;
+  z-index: 4;
+  left: 0
+}
+.wizard_horizontal ul.wizard_steps li a.disabled .step_no {
+  background: #ccc
+}
+.wizard_horizontal ul.wizard_steps li a .step_no {
+  width: 40px;
+  height: 40px;
+  line-height: 40px;
+  border-radius: 100px;
+  display: block;
+  margin: 0 auto 5px;
+  font-size: 16px;
+  text-align: center;
+  position: relative;
+  z-index: 5
+}
+.wizard_horizontal ul.wizard_steps li a.selected:before,
+.step_no {
+  background: #34495E;
+  color: #fff
+}
+.wizard_horizontal ul.wizard_steps li a.done:before,
+.wizard_horizontal ul.wizard_steps li a.done .step_no {
+  background: #1ABB9C;
+  color: #fff
+}
+.wizard_horizontal ul.wizard_steps li:first-child a:before {
+  left: 50%
+}
+.wizard_horizontal ul.wizard_steps li:last-child a:before {
+  right: 50%;
+  width: 50%;
+  left: auto
+}
+.wizard_verticle .stepContainer {
+  width: 80%;
+  float: left;
+  padding: 0 10px
+}
+.actionBar {
+  width: 100%;
+  border-top: 1px solid #ddd;
+  padding: 10px 5px;
+  text-align: right;
+  margin-top: 10px
+}
+.actionBar .buttonDisabled {
+  cursor: not-allowed;
+  pointer-events: none;
+  opacity: .65;
+  filter: alpha(opacity=65);
+  box-shadow: none
+}
+.actionBar a {
+  margin: 0 3px
+}
+.wizard_verticle .wizard_content {
+  width: 80%;
+  float: left;
+  padding-left: 20px
+}
+.wizard_verticle ul.wizard_steps {
+  display: table;
+  list-style: none;
+  position: relative;
+  width: 20%;
+  float: left;
+  margin: 0 0 20px
+}
+.wizard_verticle ul.wizard_steps li {
+  display: list-item;
+  text-align: center
+}
+.wizard_verticle ul.wizard_steps li a {
+  height: 80px
+}
+.wizard_verticle ul.wizard_steps li a:first-child {
+  margin-top: 20px
+}
+.wizard_verticle ul.wizard_steps li a,
+.wizard_verticle ul.wizard_steps li:hover {
+  display: block;
+  position: relative;
+  -moz-opacity: 1;
+  filter: alpha(opacity=100);
+  opacity: 1;
+  color: #666
+}
+.wizard_verticle ul.wizard_steps li a:before {
+  content: "";
+  position: absolute;
+  height: 100%;
+  background: #ccc;
+  top: 20px;
+  width: 4px;
+  z-index: 4;
+  left: 49%
+}
+.wizard_verticle ul.wizard_steps li a.disabled .step_no {
+  background: #ccc
+}
+.wizard_verticle ul.wizard_steps li a .step_no {
+  width: 40px;
+  height: 40px;
+  line-height: 40px;
+  border-radius: 100px;
+  display: block;
+  margin: 0 auto 5px;
+  font-size: 16px;
+  text-align: center;
+  position: relative;
+  z-index: 5
+}
+.wizard_verticle ul.wizard_steps li a.selected:before,
+.step_no {
+  background: #34495E;
+  color: #fff
+}
+.wizard_verticle ul.wizard_steps li a.done:before,
+.wizard_verticle ul.wizard_steps li a.done .step_no {
+  background: #1ABB9C;
+  color: #fff
+}
+.wizard_verticle ul.wizard_steps li:first-child a:before {
+  left: 49%
+}
+.wizard_verticle ul.wizard_steps li:last-child a:before {
+  left: 49%;
+  left: auto;
+  width: 0
+}
+.form_wizard .loader {
+  display: none
+}
+.form_wizard .msgBox {
+  display: none
+}
+.progress {
+  border-radius: 0
+}
+.progress-bar-info {
+  background-color: #3498DB
+}
+.progress-bar-success {
+  background-color: #26B99A
+}
+.progress_summary .progress {
+  margin: 5px 0 12px !important
+}
+.progress_summary .row {
+  margin-bottom: 5px
+}
+.progress_summary .row .col-xs-2 {
+  padding: 0
+}
+.progress_summary .more_info span {
+  text-align: right;
+  float: right
+}
+.progress_summary .data span {
+  text-align: right;
+  float: right
+}
+.progress_summary p {
+  margin-bottom: 3px;
+  width: 100%
+}
+.progress_title .left {
+  float: left;
+  text-align: left
+}
+.progress_title .right {
+  float: right;
+  text-align: right;
+  font-weight: 300
+}
+.progress.progress_sm {
+  border-radius: 0;
+  margin-bottom: 18px;
+  height: 10px !important
+}
+.progress.progress_sm .progress-bar {
+  height: 10px !important
+}
+.dashboard_graph p {
+  margin: 0 0 4px
+}
+ul.verticle_bars {
+  width: 100%
+}
+ul.verticle_bars li {
+  width: 23%;
+  height: 200px;
+  margin: 0
+}
+.progress.vertical.progress_wide {
+  width: 35px
+}
+.alert-success {
+  color: #ffffff;
+  background-color: rgba(38, 185, 154, 0.88);
+  border-color: rgba(38, 185, 154, 0.88)
+}
+.alert-info {
+  color: #E9EDEF;
+  background-color: rgba(52, 152, 219, 0.88);
+  border-color: rgba(52, 152, 219, 0.88)
+}
+.alert-warning {
+  color: #E9EDEF;
+  background-color: rgba(243, 156, 18, 0.88);
+  border-color: rgba(243, 156, 18, 0.88)
+}
+.alert-danger,
+.alert-error {
+  color: #E9EDEF;
+  background-color: rgba(231, 76, 60, 0.88);
+  border-color: rgba(231, 76, 60, 0.88)
+}
+.ui-pnotify.dark .ui-pnotify-container {
+  color: #E9EDEF;
+  background-color: rgba(52, 73, 94, 0.88);
+  border-color: rgba(52, 73, 94, 0.88)
+}
+.custom-notifications {
+  position: fixed;
+  margin: 15px;
+  right: 0;
+  float: right;
+  width: 400px;
+  z-index: 4000;
+  bottom: 0
+}
+ul.notifications {
+  float: right;
+  display: block;
+  margin-bottom: 7px;
+  padding: 0;
+  width: 100%
+}
+.notifications li {
+  float: right;
+  margin: 3px;
+  width: 36px;
+  box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.3)
+}
+.notifications li:last-child {
+  margin-left: 0
+}
+.notifications a {
+  display: block;
+  text-align: center;
+  text-decoration: none;
+  text-transform: uppercase;
+  padding: 9px 8px
+}
+.tabbed_notifications .text {
+  padding: 5px 15px;
+  height: 140px;
+  border-radius: 7px;
+  box-shadow: 6px 6px 6px rgba(0, 0, 0, 0.3)
+}
+.tabbed_notifications div p {
+  display: inline-block
+}
+.tabbed_notifications h2 {
+  font-weight: bold;
+  text-transform: uppercase;
+  width: 80%;
+  float: left;
+  height: 20px;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  display: block
+}
+.tabbed_notifications .close {
+  padding: 5px;
+  color: #E9EDEF;
+  float: right;
+  opacity: 1
+}
+.fc-state-default {
+  background: #f5f5f5;
+  color: #73879C
+}
+.fc-state-down,
+.fc-state-active {
+  color: #333;
+  background: #ccc
+}
+.dropzone {
+  min-height: 300px;
+  border: 1px solid #e5e5e5
+}
+
+/*
+.x_content {
+    direction: rtl;
+}
+*/
+
+.main_menu .label {
+  line-height: 11px;
+  margin-top: 4px;
+}
+@media (max-width: 460px) {
+  .dataTables_wrapper .col-sm-6 {
+    width: 100%;
+    margin-bottom: 5px;
+  }
+  .dataTables_wrapper .col-sm-6 .dataTables_filter {
+    float: none;
+  }
+}
+
+
+@media (max-width: 767px) {
+  .dataTables_length { float:none; }
+}
+
+.daterangepicker.xdisplay { width:228px; }
+
+.dataTables_wrapper > .row{
+  overflow:auto !important; /*prevent datatables overflowing its container*/
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/traffic_portal_properties.json
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/traffic_portal_properties.json b/traffic_portal/app/src/traffic_portal_properties.json
index b45a931..5b0fa1f 100644
--- a/traffic_portal/app/src/traffic_portal_properties.json
+++ b/traffic_portal/app/src/traffic_portal_properties.json
@@ -1,99 +1,10 @@
 {
-    "_comment": "These are the default properties for Traffic Portal. To customize these values, create your own traffic_portal_properties.json and copy to your web root replacing the existing one.",
-    "properties": {
-        "name": "Traffic Portal",
-        "about": {
-            "_comments": "Link to or embed (via iframe) a docs site for the traffic portal. If Iframe, must be the same protocol (http/https) as the traffic portal.",
-            "show": true,
-            "iframe": false,
-            "url": "http://traffic-control-cdn.net/"
-        },
-        "home": {
-            "_comments": "The sections displayed on the home page.",
-            "sections": [
-                {
-                    "header": "1. Configure the Traffic Portal",
-                    "description": "You are seeing the default view of the Traffic Portal. Customize /opt/traffic_portal/public/traffic_portal_properties.json to create a custom experience."
-                },
-                {
-                    "header": "2. Skin the Traffic Portal.",
-                    "description": "If you are not happy with the default bootstrap theme, add your own custom css declarations to /opt/traffic_portal/public/resources/assets/css/custom.css."
-                }
-            ]
-        },
-        "collateral": {
-            "_comments": "The items used on the collateral page (collateral.tpl.html).",
-            "items": [
-                {
-                    "name": "Collateral Item #1",
-                    "description": "Description goes here. Edit collateral items in traffic_portal_properties.json.",
-                    "path": "/resources/assets/other/collateral.txt"
-                }
-            ]
-        },
-        "footer": {
-            "_comments": "The links used in the footer (footer.tpl.html).",
-            "links": [
-                {
-                    "text": "Footer Link #1",
-                    "url": "http://about.example.com"
-                },
-                {
-                    "text": "Footer Link #2",
-                    "url": "http://about.example.com"
-                },
-                {
-                    "text": "Footer Link #3",
-                    "url": "http://about.example.com"
-                },
-                {
-                    "text": "Footer Link #4",
-                    "url": "http://about.example.com"
-                },
-                {
-                    "text": "Footer Link #5",
-                    "url": "http://about.example.com"
-                },
-                {
-                    "text": "Footer Link #6",
-                    "url": "http://about.example.com"
-                },
-                {
-                    "text": "Footer Link #7",
-                    "url": "http://about.example.com"
-                }
-            ]
-        },
-        "charts": {
-            "bandwidthPerSecond": {
-                "_comments": "BPS chart properties",
-                "show": true,
-                "name": "Bandwidth Per Second",
-                "description": "Bandwidth Per Second is the bits per second being sent out by servers for this delivery service at the Edge layer."
-            },
-            "transactionsPerSecond": {
-                "_comments": "TPS chart properties.",
-                "show": true,
-                "name": "Transactions Per Second",
-                "description": "Transactions Per Second are the number of requests being filled by servers for this delivery service at the Edge layer."
-            },
-            "httpStatus": {
-                "_comments": "HTTP chart properties.",
-                "show": true,
-                "name": "HTTP Status By Class",
-                "description": "HTTP Status by Class is a summary of HTTP response codes commonly referred to as \"pssc\" or proxy response status code in server log files. Data is gathered and presented for the Edge layer of the CDN only."
-            }
-        },
-        "deliveryService": {
-            "request": {
-                "_comments": "New delivery service requests are captured in a form and sent via email.",
-                "show": true,
-                "email": "foo@example.com"
-            },
-            "invalidateContent": {
-                "_comments": "Purge / invalidate content requests are available for delivery services.",
-                "show": true
-            }
-        }
+  "_comment": "These are the default properties for Traffic Portal. To customize these values, create your own traffic_portal_properties.json and copy to your web root replacing the existing one.",
+  "properties": {
+    "name": "Traffic Portal",
+    "customMenu": {
+      "_comments": "These are custom items you want to add to the menu. 'items' is an array of hashes where each hash has 'name' (the menu item name), 'embed' (true|false to determine if content is embedded in TP or not), and 'url' (the url of the content)",
+      "items": []
     }
+  }
 }

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/traffic_portal_release.json
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/traffic_portal_release.json b/traffic_portal/app/src/traffic_portal_release.json
index c8a9ff4..78fc5f3 100644
--- a/traffic_portal/app/src/traffic_portal_release.json
+++ b/traffic_portal/app/src/traffic_portal_release.json
@@ -1,5 +1,5 @@
 {
-    "Version":"0.9",
-    "Build Number":"25",
-    "Build Date":"2014-12-15 16:25:27"
+    "Version":"0.1",
+    "Build Number":"1",
+    "Build Date":"2016-01-01 16:25:27"
 }

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/bower.json
----------------------------------------------------------------------
diff --git a/traffic_portal/bower.json b/traffic_portal/bower.json
index 6daa0f7..ec23260 100755
--- a/traffic_portal/bower.json
+++ b/traffic_portal/bower.json
@@ -1,22 +1,23 @@
 {
-  "name": "trafficPortal",
-  "description": "Traffic Portal",
-  "dependencies": {
-    "angular": "1.5.0",
-    "angular-animate": "1.5.0",
-    "angular-resource": "1.5.0",
-    "angular-route": "1.5.0",
-    "angular-sanitize": "1.5.0",
-    "angular-bootstrap": "0.14.3",
-    "angular-loading-bar": "0.8.0",
-    "angular-ui-router": "0.2.18",
-    "bootstrap-sass-official": "3.3.6",
-    "es5-shim": "4.5.6",
-    "flot": "0.8.3",
-    "flot.tooltip": "0.8.7",
-    "flot-axislabels": "release-2.0.1",
-    "jquery": "2.0.0",
-    "jquery-ui": "1.10.0",
-    "json3": "3.3.2"
-  }
+    "name": "traffic_portal",
+    "dependencies": {
+        "angular": "1.6.4",
+        "angular-animate": "1.6.4",
+        "angular-resource": "1.6.4",
+        "angular-route": "1.6.4",
+        "angular-sanitize": "1.6.4",
+        "angular-bootstrap": "0.14.3",
+        "angular-loading-bar": "0.8.0",
+        "angular-ui-router": "0.4.2",
+        "angular-jwt": "0.0.9",
+        "bootstrap-sass-official": "3.3.6",
+        "es5-shim": "4.5.6",
+        "flot": "0.8.3",
+        "flot.tooltip": "0.8.7",
+        "flot-axislabels": "release-2.0.1",
+        "font-awesome": "4.5.0",
+        "jquery": "2.0.0",
+        "json3": "3.3.2",
+        "restangular": "1.5.2"
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/build/README.md
----------------------------------------------------------------------
diff --git a/traffic_portal/build/README.md b/traffic_portal/build/README.md
index e96b135..17abcd4 100644
--- a/traffic_portal/build/README.md
+++ b/traffic_portal/build/README.md
@@ -24,9 +24,7 @@
 * Configure Traffic Portal
 
     ```
-    $ cd /etc/traffic_portal/conf
-    $ sudo cp config-template.js config.js
-    $ sudo vi config.js (read the inline comments)
+    $ sudo vi /etc/traffic_portal/conf/config.js (read the inline comments)
     ```
 
 ### 4. Run



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/physLocationServers/table.physLocationServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/physLocationServers/table.physLocationServers.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/physLocationServers/table.physLocationServers.tpl.html
deleted file mode 100644
index 51dc0f3..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/physLocationServers/table.physLocationServers.tpl.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/phys-locations')">Physical Locations</a></li>
-            <li><a ng-click="navigateToPath('/admin/phys-locations/' + physLocation.id)">{{::physLocation.name}}</a></li>
-            <li class="active">Servers</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="serversTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>Update?</th>
-                <th>hostName</th>
-                <th>domainName</th>
-                <th>cdn</th>
-                <th>cachegroup</th>
-                <th>type</th>
-                <th>location</th>
-                <th>ipAddress</th>
-                <th>ip6Address</th>
-                <th>status</th>
-                <th>profile</th>
-                <th>iloIpAddress</th>
-                <th>iloIpGateway</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editServer(server.id)" ng-repeat="server in ::servers">
-                <td class="update-column">
-                    <i class="fa fa-flag" ng-if="server.updPending"></i>
-                    <i class="fa fa-ban" ng-if="!server.updPending"></i>
-                </td>
-                <td>{{::server.hostName}}</td>
-                <td>{{::server.domainName}}</td>
-                <td>{{::server.cdnName}}</td>
-                <td>{{::server.cachegroup}}</td>
-                <td>{{::server.type}}</td>
-                <td>{{::server.physLocation}}</td>
-                <td>{{::server.ipAddress}}</td>
-                <td>{{::server.ip6Address}}</td>
-                <td>
-                    <span ng-if="!isOffline(server.status)">{{::server.status}}</span>
-                    <span ng-if="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
-                </td>
-                <td>{{::server.profile}}</td>
-                <td>{{::server.iloIpAddress}}</td>
-                <td>{{::server.iloIpGateway}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/physLocations/TablePhysLocationsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/physLocations/TablePhysLocationsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/physLocations/TablePhysLocationsController.js
deleted file mode 100644
index 9d6468b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/physLocations/TablePhysLocationsController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TablePhysLocationsController = function(physLocations, $scope, $state, locationUtils) {
-
-    $scope.physLocations = physLocations;
-
-    $scope.editPhysLocation = function(id) {
-        locationUtils.navigateToPath('/admin/phys-locations/' + id)
-    };
-
-    $scope.createPhysLocation = function() {
-        locationUtils.navigateToPath('/admin/phys-locations/new')
-    };
-
-    $scope.refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-    angular.element(document).ready(function () {
-        $('#physLocationsTable').dataTable({
-            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-            "iDisplayLength": 25,
-            "aaSorting": []
-        });
-    });
-
-};
-
-TablePhysLocationsController.$inject = ['physLocations', '$scope', '$state', 'locationUtils'];
-module.exports = TablePhysLocationsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/physLocations/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/physLocations/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/physLocations/index.js
deleted file mode 100644
index 4b1a925..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/physLocations/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.physLocations', [])
-    .controller('TablePhysLocationsController', require('./TablePhysLocationsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/physLocations/table.physLocations.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/physLocations/table.physLocations.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/physLocations/table.physLocations.tpl.html
deleted file mode 100644
index 8e4b1eb..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/physLocations/table.physLocations.tpl.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">Physical Locations</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Create Phys Location" ng-click="createPhysLocation()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="physLocationsTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>name</th>
-                <th>shortName</th>
-                <th>address</th>
-                <th>city</th>
-                <th>state</th>
-                <th>region</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editPhysLocation(physLocation.id)" ng-repeat="physLocation in ::physLocations">
-                <td>{{::physLocation.name}}</td>
-                <td>{{::physLocation.shortName}}</td>
-                <td>{{::physLocation.address}}</td>
-                <td>{{::physLocation.city}}</td>
-                <td>{{::physLocation.state}}</td>
-                <td>{{::physLocation.region}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/profileDeliveryServices/TableProfileDeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profileDeliveryServices/TableProfileDeliveryServicesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/profileDeliveryServices/TableProfileDeliveryServicesController.js
deleted file mode 100644
index 79020c7..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profileDeliveryServices/TableProfileDeliveryServicesController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableProfileDeliveryServicesController = function(profile, deliveryServices, $scope, $state, locationUtils) {
-
-	$scope.profile = profile;
-
-	$scope.deliveryServices = deliveryServices;
-
-	$scope.editDeliveryService = function(ds) {
-		locationUtils.navigateToPath('/configure/delivery-services/' + ds.id + '?type=' + ds.type);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#deliveryServicesTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableProfileDeliveryServicesController.$inject = ['profile', 'deliveryServices', '$scope', '$state', 'locationUtils'];
-module.exports = TableProfileDeliveryServicesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/profileDeliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profileDeliveryServices/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/profileDeliveryServices/index.js
deleted file mode 100644
index 963a67e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profileDeliveryServices/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.profileDeliveryServices', [])
-	.controller('TableProfileDeliveryServicesController', require('./TableProfileDeliveryServicesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/profileDeliveryServices/table.profileDeliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profileDeliveryServices/table.profileDeliveryServices.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/profileDeliveryServices/table.profileDeliveryServices.tpl.html
deleted file mode 100644
index 8074d08..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profileDeliveryServices/table.profileDeliveryServices.tpl.html
+++ /dev/null
@@ -1,74 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/profiles')">Profiles</a></li>
-            <li><a ng-click="navigateToPath('/admin/profiles/' + profile.id)">{{::profile.name}}</a></li>
-            <li class="active">Delivery Services</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="deliveryServicesTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>xmlId</th>
-                <th>orgServerFqdn</th>
-                <th>cdn</th>
-                <th>profile</th>
-                <th>ccrDnsTtl</th>
-                <th>active</th>
-                <th>type</th>
-                <th>dscp</th>
-                <th>signed</th>
-                <th>qstringIgnore</th>
-                <th>geoLimit</th>
-                <th>protocol</th>
-                <th>ipv6RoutingEnabled</th>
-                <th>rangeRequestHandling</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editDeliveryService(deliveryService)" ng-repeat="deliveryService in ::deliveryServices">
-                <td>{{::deliveryService.xmlId}}</td>
-                <td>{{::deliveryService.orgServerFqdn}}</td>
-                <td>{{::deliveryService.cdnName}}</td>
-                <td>{{::deliveryService.profileName}}</td>
-                <td>{{::deliveryService.ccrDnsTtl}}</td>
-                <td>{{::deliveryService.active}}</td>
-                <td>{{::deliveryService.type}}</td>
-                <td>{{::deliveryService.dscp}}</td>
-                <td>{{::deliveryService.signed}}</td>
-                <td>{{::deliveryService.qstringIgnore}}</td>
-                <td>{{::deliveryService.geoLimit}}</td>
-                <td>{{::deliveryService.protocol}}</td>
-                <td>{{::deliveryService.ipv6RoutingEnabled}}</td>
-                <td>{{::deliveryService.rangeRequestHandling}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/TableProfileParametersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/TableProfileParametersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/TableProfileParametersController.js
deleted file mode 100644
index 8486f7c..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/TableProfileParametersController.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableProfileParametersController = function(profile, profileParameters, $scope, $state, $uibModal, locationUtils, profileParameterService) {
-
-	$scope.profile = profile;
-
-	$scope.profileParameters = profileParameters;
-
-	$scope.removeParameter = function(paramId) {
-		profileParameterService.unlinkProfileParameter(profile.id, paramId)
-			.then(
-				function() {
-					$scope.refresh();
-				}
-			);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.selectParams = function() {
-		var modalInstance = $uibModal.open({
-			templateUrl: 'common/modules/table/profileParameters/table.profileParamsUnassigned.tpl.html',
-			controller: 'TableProfileParamsUnassignedController',
-			size: 'lg',
-			resolve: {
-				profile: function(parameterService) {
-					return profile;
-				},
-				parameters: function(parameterService) {
-					return parameterService.getProfileUnassignedParams(profile.id);
-				}
-			}
-		});
-		modalInstance.result.then(function(selectedParams) {
-			var massagedArray = [];
-			for (i = 0; i < selectedParams.length; i++) {
-				massagedArray.push( { profileId: profile.id, parameterId: selectedParams[i] } );
-			}
-			profileParameterService.linkProfileParameters(massagedArray)
-				.then(
-					function() {
-						$scope.refresh();
-					}
-				);
-		}, function () {
-			// do nothing
-		});
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#profileParametersTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableProfileParametersController.$inject = ['profile', 'profileParameters', '$scope', '$state', '$uibModal', 'locationUtils', 'profileParameterService'];
-module.exports = TableProfileParametersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/TableProfileParamsUnassignedController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/TableProfileParamsUnassignedController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/TableProfileParamsUnassignedController.js
deleted file mode 100644
index 23cefcb..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/TableProfileParamsUnassignedController.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableProfileParamsUnassignedController = function(profile, parameters, $scope, $uibModalInstance) {
-
-	var selectedParams = [];
-
-	$scope.profile = profile;
-
-	$scope.unassignedParams = parameters;
-
-	var addParam = function(paramId) {
-		if (_.indexOf(selectedParams, paramId) == -1) {
-			selectedParams.push(paramId);
-		}
-	};
-
-	var removeParam = function(paramId) {
-		selectedParams = _.without(selectedParams, paramId);
-	};
-
-	$scope.updateParams = function($event, paramId) {
-		var checkbox = $event.target;
-		if (checkbox.checked) {
-			addParam(paramId);
-		} else {
-			removeParam(paramId);
-		}
-	};
-
-	$scope.submit = function() {
-		$uibModalInstance.close(selectedParams);
-	};
-
-	$scope.cancel = function () {
-		$uibModalInstance.dismiss('cancel');
-	};
-
-	angular.element(document).ready(function () {
-		$('#profileParamsUnassignedTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"order": [[ 1, 'asc' ]],
-			"columnDefs": [
-				{ "width": "5%", "targets": 0 }
-			]
-		});
-	});
-
-};
-
-TableProfileParamsUnassignedController.$inject = ['profile', 'parameters', '$scope', '$uibModalInstance'];
-module.exports = TableProfileParamsUnassignedController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/index.js
deleted file mode 100644
index f4fb844..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.profileParameters', [])
-	.controller('TableProfileParametersController', require('./TableProfileParametersController'))
-	.controller('TableProfileParamsUnassignedController', require('./TableProfileParamsUnassignedController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/table.profileParameters.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/table.profileParameters.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/table.profileParameters.tpl.html
deleted file mode 100644
index 24d1693..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/table.profileParameters.tpl.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/profiles')">Profiles</a></li>
-            <li><a ng-click="navigateToPath('/admin/profiles/' + profile.id)">{{::profile.name}}</a></li>
-            <li class="active">Parameters</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Link Parameters to Profile" ng-click="selectParams()"><i class="fa fa-link"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="profileParametersTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>id</th>
-                <th>name</th>
-                <th>configFile</th>
-                <th>value</th>
-                <th></th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-repeat="parameter in ::profileParameters">
-                <td>{{::parameter.id}}</td>
-                <td>{{::parameter.name}}</td>
-                <td>{{::parameter.configFile}}</td>
-                <td>{{::parameter.value}}</td>
-                <td><button type="button" class="btn btn-link" title="Unlink Parameter from Profile" ng-click="removeParameter(parameter.id)"><i class="fa fa-chain-broken"></i></button></td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/table.profileParamsUnassigned.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/table.profileParamsUnassigned.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/table.profileParamsUnassigned.tpl.html
deleted file mode 100644
index 34b2bdf..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profileParameters/table.profileParamsUnassigned.tpl.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-
-
-<div class="modal-header">
-    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-    <h3 class="modal-title">Link Parameters to {{::profile.name}}</h3>
-</div>
-<div class="modal-body">
-    <table id="profileParamsUnassignedTable" class="table responsive-utilities jambo_table" style="table-layout:fixed; width:100%;">
-        <thead>
-        <tr class="headings">
-            <th></th>
-            <th>name</th>
-            <th>configFile</th>
-            <th>value</th>
-        </tr>
-        </thead>
-        <tbody>
-        <tr ng-repeat="parameter in ::unassignedParams">
-            <td><input type="checkbox" ng-click="updateParams($event, parameter.id)"></td>
-            <td>{{::parameter.name}}</td>
-            <td>{{::parameter.configFile}}</td>
-            <td>{{::parameter.value}}</td>
-        </tr>
-        </tbody>
-    </table>
-</div>
-<div class="modal-footer">
-    <button class="btn btn-link" ng-click="cancel()">cancel</button>
-    <button class="btn btn-primary" ng-click="submit()">Submit</button>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/profileServers/TableProfileServersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profileServers/TableProfileServersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/profileServers/TableProfileServersController.js
deleted file mode 100644
index 7d4f5d5..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profileServers/TableProfileServersController.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableProfileServersController = function(profile, servers, $scope, $state, locationUtils, serverUtils) {
-
-	$scope.profile = profile;
-
-	$scope.servers = servers;
-
-	$scope.editServer = function(id) {
-		locationUtils.navigateToPath('/configure/servers/' + id);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.isOffline = serverUtils.isOffline;
-
-	$scope.offlineReason = serverUtils.offlineReason;
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#serversTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableProfileServersController.$inject = ['profile', 'servers', '$scope', '$state', 'locationUtils', 'serverUtils'];
-module.exports = TableProfileServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/profileServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profileServers/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/profileServers/index.js
deleted file mode 100644
index ba238c1..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profileServers/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.profileServers', [])
-	.controller('TableProfileServersController', require('./TableProfileServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/profileServers/table.profileServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profileServers/table.profileServers.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/profileServers/table.profileServers.tpl.html
deleted file mode 100644
index 68d5d68..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profileServers/table.profileServers.tpl.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/profiles')">Profiles</a></li>
-            <li><a ng-click="navigateToPath('/admin/profiles/' + profile.id)">{{::profile.name}}</a></li>
-            <li class="active">Servers</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="serversTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>Update?</th>
-                <th>hostName</th>
-                <th>domainName</th>
-                <th>cdn</th>
-                <th>cachegroup</th>
-                <th>type</th>
-                <th>location</th>
-                <th>ipAddress</th>
-                <th>ip6Address</th>
-                <th>status</th>
-                <th>profile</th>
-                <th>iloIpAddress</th>
-                <th>iloIpGateway</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editServer(server.id)" ng-repeat="server in ::servers" ng-class="::{'active': server.updPending}">
-                <td class="update-column">
-                    <i class="fa fa-flag" ng-if="server.updPending"></i>
-                    <i class="fa fa-ban" ng-if="!server.updPending"></i>
-                </td>
-                <td>{{::server.hostName}}</td>
-                <td>{{::server.domainName}}</td>
-                <td>{{::server.cdnName}}</td>
-                <td>{{::server.cachegroup}}</td>
-                <td>{{::server.type}}</td>
-                <td>{{::server.physLocation}}</td>
-                <td>{{::server.ipAddress}}</td>
-                <td>{{::server.ip6Address}}</td>
-                <td>
-                    <span ng-if="!isOffline(server.status)">{{::server.status}}</span>
-                    <span ng-if="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
-                </td>
-                <td>{{::server.profile}}</td>
-                <td>{{::server.iloIpAddress}}</td>
-                <td>{{::server.iloIpGateway}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/TableProfilesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/TableProfilesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/TableProfilesController.js
deleted file mode 100644
index 5a8383b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/TableProfilesController.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableProfilesController = function(profiles, $scope, $state, locationUtils) {
-
-    $scope.profiles = profiles;
-
-    $scope.editProfile = function(id) {
-        locationUtils.navigateToPath('/admin/profiles/' + id);
-    };
-
-    $scope.createProfile = function() {
-        locationUtils.navigateToPath('/admin/profiles/new');
-    };
-
-    $scope.importProfile = function() {
-        alert('not hooked up yet: importProfile');
-    };
-
-    $scope.compareProfiles = function() {
-        alert('not hooked up yet: compareProfiles');
-    };
-
-    $scope.refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-    angular.element(document).ready(function () {
-        $('#profilesTable').dataTable({
-            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-            "iDisplayLength": 25,
-            "aaSorting": []
-        });
-    });
-
-};
-
-TableProfilesController.$inject = ['profiles', '$scope', '$state', 'locationUtils'];
-module.exports = TableProfilesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/index.js
deleted file mode 100644
index 1761ec7..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.profiles', [])
-    .controller('TableProfilesController', require('./TableProfilesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/table.profiles.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/table.profiles.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/table.profiles.tpl.html
deleted file mode 100644
index 85d66cf..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/profiles/table.profiles.tpl.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">Profiles</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Create Profile" ng-click="createProfile()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
-                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    More
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="importProfile()">Import Profile</a></li>
-                    <li role="menuitem"><a ng-click="compareProfiles()">Compare Profiles</a></li>
-                </ul>
-            </div>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="profilesTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>name</th>
-                <th>type</th>
-                <th>description</th>
-                <th>cdn</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editProfile(profile.id)" ng-repeat="profile in ::profiles">
-                <td>{{::profile.name}}</td>
-                <td>{{::profile.type}}</td>
-                <td>{{::profile.description}}</td>
-                <td>{{::profile.cdnName}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/regionPhysLocations/TableRegionPhysLocationsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/regionPhysLocations/TableRegionPhysLocationsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/regionPhysLocations/TableRegionPhysLocationsController.js
deleted file mode 100644
index aee580a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/regionPhysLocations/TableRegionPhysLocationsController.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableRegionPhysLocationsController = function(region, physLocations, $scope, $state, locationUtils) {
-
-	$scope.region = region;
-
-	$scope.physLocations = physLocations;
-
-	$scope.editPhysLocation = function(id) {
-		locationUtils.navigateToPath('/admin/phys-locations/' + id)
-	};
-
-	$scope.createPhysLocation = function() {
-		locationUtils.navigateToPath('/admin/phys-locations/new')
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#physLocationsTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableRegionPhysLocationsController.$inject = ['region', 'physLocations', '$scope', '$state', 'locationUtils'];
-module.exports = TableRegionPhysLocationsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/regionPhysLocations/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/regionPhysLocations/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/regionPhysLocations/index.js
deleted file mode 100644
index e55b784..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/regionPhysLocations/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.regionPhysLocations', [])
-	.controller('TableRegionPhysLocationsController', require('./TableRegionPhysLocationsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/regionPhysLocations/table.regionPhysLocations.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/regionPhysLocations/table.regionPhysLocations.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/regionPhysLocations/table.regionPhysLocations.tpl.html
deleted file mode 100644
index 5e2d530..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/regionPhysLocations/table.regionPhysLocations.tpl.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/regions')">Regions</a></li>
-            <li><a ng-click="navigateToPath('/admin/regions/' + region.id)">{{::region.name}}</a></li>
-            <li class="active">Physical Locations</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="physLocationsTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>name</th>
-                <th>shortName</th>
-                <th>address</th>
-                <th>city</th>
-                <th>state</th>
-                <th>region</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editPhysLocation(physLocation.id)" ng-repeat="physLocation in ::physLocations">
-                <td>{{::physLocation.name}}</td>
-                <td>{{::physLocation.shortName}}</td>
-                <td>{{::physLocation.address}}</td>
-                <td>{{::physLocation.city}}</td>
-                <td>{{::physLocation.state}}</td>
-                <td>{{::physLocation.region}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/regions/TableRegionsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/regions/TableRegionsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/regions/TableRegionsController.js
deleted file mode 100644
index 3eed487..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/regions/TableRegionsController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableRegionsController = function(regions, $scope, $state, locationUtils) {
-
-    $scope.regions = regions;
-
-    $scope.editRegion = function(id) {
-        locationUtils.navigateToPath('/admin/regions/' + id);
-    };
-
-    $scope.createRegion = function() {
-        locationUtils.navigateToPath('/admin/regions/new');
-    };
-
-    $scope.refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-    angular.element(document).ready(function () {
-        $('#regionsTable').dataTable({
-            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-            "iDisplayLength": 25,
-            "aaSorting": []
-        });
-    });
-
-};
-
-TableRegionsController.$inject = ['regions', '$scope', '$state', 'locationUtils'];
-module.exports = TableRegionsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/regions/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/regions/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/regions/index.js
deleted file mode 100644
index abd62e2..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/regions/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.regions', [])
-    .controller('TableRegionsController', require('./TableRegionsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/regions/table.regions.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/regions/table.regions.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/regions/table.regions.tpl.html
deleted file mode 100644
index 505972f..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/regions/table.regions.tpl.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">Regions</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Create Region" ng-click="createRegion()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="regionsTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>name</th>
-                <th>division</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editRegion(region.id)" ng-repeat="region in ::regions">
-                <td>{{::region.name}}</td>
-                <td>{{::region.divisionName}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/TableServerDeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/TableServerDeliveryServicesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/TableServerDeliveryServicesController.js
deleted file mode 100644
index f418ac6..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/TableServerDeliveryServicesController.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableServerDeliveryServicesController = function(server, serverDeliveryServices, $scope, $state, locationUtils, deliveryServiceService) {
-
-	$scope.server = server;
-
-	$scope.serverDeliveryServices = serverDeliveryServices;
-
-	$scope.cloneDsAssignments = function() {
-		alert('not hooked up yet: cloneDsAssignments');
-	};
-
-	$scope.addDeliveryService = function() {
-		alert('not hooked up yet: addDeliveryService to server');
-	};
-
-	$scope.removeDeliveryService = function(dsId, serverId) {
-		deliveryServiceService.deleteDeliveryServiceServer(dsId, serverId)
-			.then(
-				function() {
-					$scope.refresh();
-				}
-			);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#deliveryServicesTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableServerDeliveryServicesController.$inject = ['server', 'serverDeliveryServices', '$scope', '$state', 'locationUtils', 'deliveryServiceService'];
-module.exports = TableServerDeliveryServicesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/index.js
deleted file mode 100644
index 14a13e2..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.serverDeliveryServices', [])
-	.controller('TableServerDeliveryServicesController', require('./TableServerDeliveryServicesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/table.serverDeliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/table.serverDeliveryServices.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/table.serverDeliveryServices.tpl.html
deleted file mode 100644
index b01962e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/serverDeliveryServices/table.serverDeliveryServices.tpl.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/servers')">Servers</a></li>
-            <li><a ng-click="navigateToPath('/configure/servers/' + server.id)">{{::server.hostName}}</a></li>
-            <li class="active">Delivery Services</li>
-        </ol>
-        <div class="pull-right" role="group">
-            <button class="btn btn-primary" title="Link Delivery Services to Server" ng-click="addDeliveryService()"><i class="fa fa-link"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
-                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    More&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li><a ng-click="cloneDsAssignments()">Clone Delivery Service Assignments</a></li>
-                </ul>
-            </div>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="deliveryServicesTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>xmlId</th>
-                <th>orgServerFqdn</th>
-                <th>active</th>
-                <th>type</th>
-                <th>protocol</th>
-                <th>cdn</th>
-                <th>ipv6RoutingEnabled</th>
-                <th>dscp</th>
-                <th>signed</th>
-                <th>qstringIgnore</th>
-                <th></th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-repeat="deliveryService in ::serverDeliveryServices">
-                <td>{{::deliveryService.xmlId}}</td>
-                <td>{{::deliveryService.orgServerFqdn}}</td>
-                <td>{{::deliveryService.active}}</td>
-                <td>{{::deliveryService.type}}</td>
-                <td>{{::deliveryService.protocol}}</td>
-                <td>{{::deliveryService.cdnName}}</td>
-                <td>{{::deliveryService.ipv6RoutingEnabled}}</td>
-                <td>{{::deliveryService.dscp}}</td>
-                <td>{{::deliveryService.signed}}</td>
-                <td>{{::deliveryService.qstringIgnore}}</td>
-                <td><button type="button" class="btn btn-link" title="Unlink Delivery Service from Server" ng-click="removeDeliveryService(deliveryService.id, server.id)"><i class="fa fa-chain-broken"></i></button></td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/servers/TableServersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/servers/TableServersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/servers/TableServersController.js
deleted file mode 100644
index 93b6503..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/servers/TableServersController.js
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableServersController = function(servers, $scope, $state, $uibModal, locationUtils, serverUtils, cdnService) {
-
-    $scope.servers = servers;
-
-    var queueServerUpdates = function(cdnId) {
-        cdnService.queueServerUpdates(cdnId)
-            .then(
-                function() {
-                    $scope.refresh();
-                }
-            );
-    };
-
-    var clearServerUpdates = function(cdnId) {
-        cdnService.clearServerUpdates(cdnId)
-            .then(
-                function() {
-                    $scope.refresh();
-                }
-            );
-    };
-
-    $scope.editServer = function(id) {
-        locationUtils.navigateToPath('/configure/servers/' + id);
-    };
-
-    $scope.createServer = function() {
-        locationUtils.navigateToPath('/configure/servers/new');
-    };
-
-    $scope.confirmQueueServerUpdates = function() {
-        var params = {
-            title: 'Queue Server Updates',
-            message: "Please select a CDN"
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
-            controller: 'DialogSelectController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                },
-                collection: function(cdnService) {
-                    return cdnService.getCDNs();
-                }
-            }
-        });
-        modalInstance.result.then(function(cdn) {
-            queueServerUpdates(cdn.id);
-        }, function () {
-            // do nothing
-        });
-    };
-
-    $scope.confirmClearServerUpdates = function() {
-        var params = {
-            title: 'Clear Server Updates',
-            message: "Please select a CDN"
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
-            controller: 'DialogSelectController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                },
-                collection: function(cdnService) {
-                    return cdnService.getCDNs();
-                }
-            }
-        });
-        modalInstance.result.then(function(cdn) {
-            clearServerUpdates(cdn.id);
-        }, function () {
-            // do nothing
-        });
-    };
-
-
-    $scope.uploadServerCSV = function() {
-        alert('not hooked up yet: uploadServerCSV');
-    };
-
-    $scope.refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-    $scope.isOffline = serverUtils.isOffline;
-
-    $scope.offlineReason = serverUtils.offlineReason;
-
-    angular.element(document).ready(function () {
-        $('#serversTable').dataTable({
-            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-            "iDisplayLength": 25,
-            "aaSorting": []
-        });
-    });
-
-};
-
-TableServersController.$inject = ['servers', '$scope', '$state', '$uibModal', 'locationUtils', 'serverUtils', 'cdnService'];
-module.exports = TableServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/servers/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/servers/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/servers/index.js
deleted file mode 100644
index f8267cb..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/servers/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.servers', [])
-    .controller('TableServersController', require('./TableServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/servers/table.servers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/servers/table.servers.tpl.html
deleted file mode 100644
index 8dabadb..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/servers/table.servers.tpl.html
+++ /dev/null
@@ -1,86 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">Servers</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Create Server" ng-click="createServer()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
-                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    More&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="confirmQueueServerUpdates()">Queue Server Updates</a></li>
-                    <li role="menuitem"><a ng-click="confirmClearServerUpdates()">Clear Server Updates</a></li>
-                    <li class="divider"></li>
-                    <li role="menuitem"><a ng-click="uploadServerCSV()">Upload Bulk CSV</a></li>
-                </ul>
-            </div>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="serversTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>Update?</th>
-                <th>hostName</th>
-                <th>domainName</th>
-                <th>ipAddress</th>
-                <th>ip6Address</th>
-                <th>status</th>
-                <th>type</th>
-                <th>profile</th>
-                <th>cdn</th>
-                <th>cachegroup</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editServer(server.id)" ng-repeat="server in ::servers" ng-class="::{'active': server.updPending}">
-                <td class="update-column">
-                    <i class="fa fa-flag" ng-if="server.updPending"></i>
-                    <i class="fa fa-ban" ng-if="!server.updPending"></i>
-                </td>
-                <td>{{::server.hostName}}</td>
-                <td>{{::server.domainName}}</td>
-                <td>{{::server.ipAddress}}</td>
-                <td>{{::server.ip6Address}}</td>
-                <td>
-                    <span ng-if="!isOffline(server.status)">{{::server.status}}</span>
-                    <span ng-if="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
-                </td>
-                <td>{{::server.type}}</td>
-                <td>{{::server.profile}}</td>
-                <td>{{::server.cdnName}}</td>
-                <td>{{::server.cachegroup}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/statusServers/TableStatusServersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/statusServers/TableStatusServersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/statusServers/TableStatusServersController.js
deleted file mode 100644
index 4aafa0a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/statusServers/TableStatusServersController.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableStatusServersController = function(status, servers, $scope, $state, locationUtils, serverUtils) {
-
-	$scope.status = status;
-
-	$scope.servers = servers;
-
-	$scope.editServer = function(id) {
-		locationUtils.navigateToPath('/configure/servers/' + id);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.isOffline = serverUtils.isOffline;
-
-	$scope.offlineReason = serverUtils.offlineReason;
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#serversTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableStatusServersController.$inject = ['status', 'servers', '$scope', '$state', 'locationUtils', 'serverUtils'];
-module.exports = TableStatusServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/statusServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/statusServers/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/statusServers/index.js
deleted file mode 100644
index 80ec361..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/statusServers/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.statusServers', [])
-	.controller('TableStatusServersController', require('./TableStatusServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/statusServers/table.statusServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/statusServers/table.statusServers.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/statusServers/table.statusServers.tpl.html
deleted file mode 100644
index bc7f718..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/statusServers/table.statusServers.tpl.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/statuses')">Statuses</a></li>
-            <li><a ng-click="navigateToPath('/admin/statuses/' + status.id)">{{::status.name}}</a></li>
-            <li class="active">Servers</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="serversTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>Update?</th>
-                <th>hostName</th>
-                <th>domainName</th>
-                <th>ipAddress</th>
-                <th>ip6Address</th>
-                <th>status</th>
-                <th>type</th>
-                <th>profile</th>
-                <th>cdn</th>
-                <th>cachegroup</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editServer(server.id)" ng-repeat="server in ::servers" ng-class="::{'active': server.updPending}">
-                <td class="update-column">
-                    <i class="fa fa-flag" ng-if="server.updPending"></i>
-                    <i class="fa fa-ban" ng-if="!server.updPending"></i>
-                </td>
-                <td>{{::server.hostName}}</td>
-                <td>{{::server.domainName}}</td>
-                <td>{{::server.ipAddress}}</td>
-                <td>{{::server.ip6Address}}</td>
-                <td>
-                    <span ng-show="!isOffline(server.status)">{{::server.status}}</span>
-                    <span ng-show="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
-                </td>
-                <td>{{::server.type}}</td>
-                <td>{{::server.profile}}</td>
-                <td>{{::server.cdnName}}</td>
-                <td>{{::server.cachegroup}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/js/ng-map_1.17.6.min.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/js/ng-map_1.17.6.min.js b/traffic_portal/app/src/assets/js/ng-map_1.17.6.min.js
new file mode 100644
index 0000000..d6608ef
--- /dev/null
+++ b/traffic_portal/app/src/assets/js/ng-map_1.17.6.min.js
@@ -0,0 +1,26 @@
+!function(e,t){"object"==typeof exports?module.exports=t(require("angular")):"function"==typeof define&&define.amd?define(["angular"],t):t(e.angular)}(this,function(angular){/**
+ * AngularJS Google Maps Ver. 1.17.3
+ *
+ * The MIT License (MIT)
+ * 
+ * Copyright (c) 2014, 2015, 1016 Allen Kim
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+return angular.module("ngMap",[]),function(){"use strict";var e,t=function(t,n,o,i,a,r,s){e=a;var p=this;p.mapOptions,p.mapEvents,p.eventListeners,p.addObject=function(e,t){if(p.map){p.map[e]=p.map[e]||{};var n=Object.keys(p.map[e]).length;p.map[e][t.id||n]=t,p.map instanceof google.maps.Map&&("infoWindows"!=e&&t.setMap&&t.setMap&&t.setMap(p.map),t.centered&&t.position&&p.map.setCenter(t.position),"markers"==e&&p.objectChanged("markers"),"customMarkers"==e&&p.objectChanged("customMarkers"))}},p.deleteObject=function(e,t){if(t.map){var n=t.map[e];for(var o in n)n[o]===t&&(google.maps.event.clearInstanceListeners(t),delete n[o]);t.map&&t.setMap&&t.setMap(null),"markers"==e&&p.objectChanged("markers"),"customMarkers"==e&&p.objectChanged("customMarkers")}},p.observeAttrSetObj=function(t,n,o){if(n.noWatcher)return!1;for(var i=e.getAttrsToObserve(t),a=0;a<i.length;a++){var s=i[a];n.$observe(s,r.observeAndSet(s,o))}},p.zoomToIncludeMarkers=function(){if(null!=p.map.markers&&Object.keys(p.m
 ap.markers).length>0||null!=p.map.customMarkers&&Object.keys(p.map.customMarkers).length>0){var e=new google.maps.LatLngBounds;for(var t in p.map.markers)e.extend(p.map.markers[t].getPosition());for(var n in p.map.customMarkers)e.extend(p.map.customMarkers[n].getPosition());p.mapOptions.maximumZoom&&(p.enableMaximumZoomCheck=!0),p.map.fitBounds(e)}},p.objectChanged=function(e){!p.map||"markers"!=e&&"customMarkers"!=e||"auto"!=p.map.zoomToIncludeMarkers||p.zoomToIncludeMarkers()},p.initializeMap=function(){var a=p.mapOptions,u=p.mapEvents,l=p.map;if(p.map=s.getMapInstance(n[0]),r.setStyle(n[0]),l){var g=e.filter(o),d=e.getOptions(g),m=e.getControlOptions(g);a=angular.extend(d,m);for(var f in l){var v=l[f];if("object"==typeof v)for(var y in v)p.addObject(f,v[y])}p.map.showInfoWindow=p.showInfoWindow,p.map.hideInfoWindow=p.hideInfoWindow}a.zoom=a.zoom||15;var h=a.center;if(!a.center||"string"==typeof h&&h.match(/\{\{.*\}\}/))a.center=new google.maps.LatLng(0,0);else if(!(h instanceof g
 oogle.maps.LatLng)){var M=a.center;delete a.center,r.getGeoLocation(M,a.geoLocationOptions).then(function(e){p.map.setCenter(e);var n=a.geoCallback;n&&i(n)(t)},function(){a.geoFallbackCenter&&p.map.setCenter(a.geoFallbackCenter)})}p.map.setOptions(a);for(var b in u){var O=u[b],w=google.maps.event.addListener(p.map,b,O);p.eventListeners[b]=w}p.observeAttrSetObj(c,o,p.map),p.singleInfoWindow=a.singleInfoWindow,google.maps.event.trigger(p.map,"resize"),google.maps.event.addListenerOnce(p.map,"idle",function(){r.addMap(p),a.zoomToIncludeMarkers&&p.zoomToIncludeMarkers(),t.map=p.map,t.$emit("mapInitialized",p.map),o.mapInitialized&&i(o.mapInitialized)(t,{map:p.map})}),a.zoomToIncludeMarkers&&a.maximumZoom&&google.maps.event.addListener(p.map,"zoom_changed",function(){1==p.enableMaximumZoomCheck&&(p.enableMaximumZoomCheck=!1,google.maps.event.addListenerOnce(p.map,"bounds_changed",function(){p.map.setZoom(Math.min(a.maximumZoom,p.map.getZoom()))}))})},t.google=google;var c=e.orgAttributes
 (n),u=e.filter(o),l=e.getOptions(u,{scope:t}),g=e.getControlOptions(u),d=angular.extend(l,g),m=e.getEvents(t,u);if(Object.keys(m).length&&void 0,p.mapOptions=d,p.mapEvents=m,p.eventListeners={},l.lazyInit){if(o.id&&0===o.id.indexOf("{{",0)&&-1!==o.id.indexOf("}}",o.id.length-"}}".length))var f=o.id.slice(2,-2),v=i(f)(t);else var v=o.id;p.map={id:v},r.addMap(p)}else p.initializeMap();l.triggerResize&&google.maps.event.trigger(p.map,"resize"),n.bind("$destroy",function(){s.returnMapInstance(p.map),r.deleteMap(p)})};t.$inject=["$scope","$element","$attrs","$parse","Attr2MapOptions","NgMap","NgMapPool"],angular.module("ngMap").controller("__MapController",t)}(),function(){"use strict";var e,t=function(t,o,i,a){a=a[0]||a[1];var r=e.orgAttributes(o),s=e.filter(i),p=e.getOptions(s,{scope:t}),c=e.getEvents(t,s),u=n(p,c);a.addObject("bicyclingLayers",u),a.observeAttrSetObj(r,i,u),o.bind("$destroy",function(){a.deleteObject("bicyclingLayers",u)})},n=function(e,t){var n=new google.maps.Bicycli
 ngLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n},o=function(n){return e=n,{restrict:"E",require:["?^map","?^ngMap"],link:t}};o.$inject=["Attr2MapOptions"],angular.module("ngMap").directive("bicyclingLayer",o)}(),function(){"use strict";var e,t,n,o=function(n,o,i,a){a=a[0]||a[1];var r=e.filter(i),s=e.getOptions(r,{scope:n}),p=e.getEvents(n,r),c=o[0].parentElement.removeChild(o[0]);t(c.innerHTML.trim())(n);for(var u in p)google.maps.event.addDomListener(c,u,p[u]);a.addObject("customControls",c);var l=s.position;a.map.controls[google.maps.ControlPosition[l]].push(c),o.bind("$destroy",function(){a.deleteObject("customControls",c)})},i=function(i,a,r){return e=i,t=a,n=r,{restrict:"E",require:["?^map","?^ngMap"],link:o}};i.$inject=["Attr2MapOptions","$compile","NgMap"],angular.module("ngMap").directive("customControl",i)}(),function(){"use strict";var e,t,n,o,i=function(e){e=e||{},this.el=document.createElement("div"),this.el.style.display="inline-block",this.el
 .style.visibility="hidden",this.visible=!0;for(var t in e)this[t]=e[t]},a=function(){i.prototype=new google.maps.OverlayView,i.prototype.setContent=function(e,t){this.el.innerHTML=e,this.el.style.position="absolute",t&&n(angular.element(this.el).contents())(t)},i.prototype.getDraggable=function(){return this.draggable},i.prototype.setDraggable=function(e){this.draggable=e},i.prototype.getPosition=function(){return this.position},i.prototype.setPosition=function(e){if(e&&(this.position=e),this.getProjection()&&"function"==typeof this.position.lng){var n=this.getProjection().fromLatLngToDivPixel(this.position),o=this,i=function(){var e=Math.round(n.x-o.el.offsetWidth/2),t=Math.round(n.y-o.el.offsetHeight-10);o.el.style.left=e+"px",o.el.style.top=t+"px",o.el.style.visibility="visible"};o.el.offsetWidth&&o.el.offsetHeight?i():t(i,300)}},i.prototype.setZIndex=function(e){e&&(this.zIndex=e),this.el.style.zIndex=this.zIndex},i.prototype.getVisible=function(){return this.visible},i.prototyp
 e.setVisible=function(e){this.el.style.display=e?"inline-block":"none",this.visible=e},i.prototype.addClass=function(e){var t=this.el.className.trim().split(" ");-1==t.indexOf(e)&&t.push(e),this.el.className=t.join(" ")},i.prototype.removeClass=function(e){var t=this.el.className.split(" "),n=t.indexOf(e);n>-1&&t.splice(n,1),this.el.className=t.join(" ")},i.prototype.onAdd=function(){this.getPanes().overlayMouseTarget.appendChild(this.el)},i.prototype.draw=function(){this.setPosition(),this.setZIndex(this.zIndex),this.setVisible(this.visible)},i.prototype.onRemove=function(){this.el.parentNode.removeChild(this.el)}},r=function(n,a){return function(r,s,p,c){c=c[0]||c[1];var u=e.orgAttributes(s),l=e.filter(p),g=e.getOptions(l,{scope:r}),d=e.getEvents(r,l);s[0].style.display="none";var m=new i(g);t(function(){r.$watch("["+a.join(",")+"]",function(){m.setContent(n,r)},!0),m.setContent(s[0].innerHTML,r);var e=s[0].firstElementChild.className;m.addClass("custom-marker"),m.addClass(e),g.po
 sition instanceof google.maps.LatLng||o.getGeoLocation(g.position).then(function(e){m.setPosition(e)})});for(var f in d)google.maps.event.addDomListener(m.el,f,d[f]);c.addObject("customMarkers",m),c.observeAttrSetObj(u,p,m),s.bind("$destroy",function(){c.deleteObject("customMarkers",m)})}},s=function(i,s,p,c){return e=p,t=i,n=s,o=c,{restrict:"E",require:["?^map","?^ngMap"],compile:function(e){a(),e[0].style.display="none";var t=e.html(),n=t.match(/{{([^}]+)}}/g),o=[];return(n||[]).forEach(function(e){var t=e.replace("{{","").replace("}}","");-1==e.indexOf("::")&&-1==e.indexOf("this.")&&-1==o.indexOf(t)&&o.push(e.replace("{{","").replace("}}",""))}),r(t,o)}}};s.$inject=["$timeout","$compile","Attr2MapOptions","NgMap"],angular.module("ngMap").directive("customMarker",s)}(),function(){"use strict";var e,t,n,o=function(e,t){e.panel&&(e.panel=document.getElementById(e.panel)||document.querySelector(e.panel));var n=new google.maps.DirectionsRenderer(e);for(var o in t)google.maps.event.add
 Listener(n,o,t[o]);return n},i=function(e,o){var i=new google.maps.DirectionsService,a=o;a.travelMode=a.travelMode||"DRIVING";var r=["origin","destination","travelMode","transitOptions","unitSystem","durationInTraffic","waypoints","optimizeWaypoints","provideRouteAlternatives","avoidHighways","avoidTolls","region"];for(var s in a)-1===r.indexOf(s)&&delete a[s];a.waypoints&&("[]"==a.waypoints||""===a.waypoints)&&delete a.waypoints;var p=function(n){i.route(n,function(n,o){o==google.maps.DirectionsStatus.OK&&t(function(){e.setDirections(n)})})};a.origin&&a.destination&&("current-location"==a.origin?n.getCurrentPosition().then(function(e){a.origin=new google.maps.LatLng(e.coords.latitude,e.coords.longitude),p(a)}):"current-location"==a.destination?n.getCurrentPosition().then(function(e){a.destination=new google.maps.LatLng(e.coords.latitude,e.coords.longitude),p(a)}):p(a))},a=function(a,r,s,p){var c=a;e=p,t=r,n=s;var u=function(n,a,r,s){s=s[0]||s[1];var p=c.orgAttributes(a),u=c.filter(
 r),l=c.getOptions(u,{scope:n}),g=c.getEvents(n,u),d=c.getAttrsToObserve(p),m=o(l,g);s.addObject("directionsRenderers",m),d.forEach(function(e){!function(e){r.$observe(e,function(n){if("panel"==e)t(function(){var e=document.getElementById(n)||document.querySelector(n);e&&m.setPanel(e)});else if(l[e]!==n){var o=c.toOptionValue(n,{key:e});l[e]=o,i(m,l)}})}(e)}),e.getMap().then(function(){i(m,l)}),a.bind("$destroy",function(){s.deleteObject("directionsRenderers",m)})};return{restrict:"E",require:["?^map","?^ngMap"],link:u}};a.$inject=["Attr2MapOptions","$timeout","NavigatorGeolocation","NgMap"],angular.module("ngMap").directive("directions",a)}(),function(){"use strict";angular.module("ngMap").directive("drawingManager",["Attr2MapOptions",function(e){var t=e;return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,n,o,i){i=i[0]||i[1];var a=t.filter(o),r=t.getOptions(a,{scope:e}),s=t.getControlOptions(a),p=t.getEvents(e,a),c=new google.maps.drawing.DrawingManager({drawingMode:r.dr
 awingmode,drawingControl:r.drawingcontrol,drawingControlOptions:s.drawingControlOptions,circleOptions:r.circleoptions,markerOptions:r.markeroptions,polygonOptions:r.polygonoptions,polylineOptions:r.polylineoptions,rectangleOptions:r.rectangleoptions});o.$observe("drawingControlOptions",function(e){c.drawingControlOptions=t.getControlOptions({drawingControlOptions:e}).drawingControlOptions,c.setDrawingMode(null),c.setMap(i.map)});for(var u in p)google.maps.event.addListener(c,u,p[u]);i.addObject("mapDrawingManager",c),n.bind("$destroy",function(){i.deleteObject("mapDrawingManager",c)})}}}])}(),function(){"use strict";angular.module("ngMap").directive("dynamicMapsEngineLayer",["Attr2MapOptions",function(e){var t=e,n=function(e,t){var n=new google.maps.visualization.DynamicMapsEngineLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n};return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,o,i,a){a=a[0]||a[1];var r=t.filter(i),s=t.getOptions(r,{scope:e}),p=
 t.getEvents(e,r,p),c=n(s,p);a.addObject("mapsEngineLayers",c)}}}])}(),function(){"use strict";angular.module("ngMap").directive("fusionTablesLayer",["Attr2MapOptions",function(e){var t=e,n=function(e,t){var n=new google.maps.FusionTablesLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n};return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,o,i,a){a=a[0]||a[1];var r=t.filter(i),s=t.getOptions(r,{scope:e}),p=t.getEvents(e,r,p),c=n(s,p);a.addObject("fusionTablesLayers",c)}}}])}(),function(){"use strict";angular.module("ngMap").directive("heatmapLayer",["Attr2MapOptions","$window",function(e,t){var n=e;return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,o,i,a){a=a[0]||a[1];var r=n.filter(i),s=n.getOptions(r,{scope:e});if(s.data=t[i.data]||e[i.data],!(s.data instanceof Array))throw"invalid heatmap data";s.data=new google.maps.MVCArray(s.data);{var p=new google.maps.visualization.HeatmapLayer(s);n.getEvents(e,r)}a.addObject("heatmapLayers",p)}}
 }])}(),function(){"use strict";var e=function(e,t,n,o,i,a,r){var s=e,p=function(e,a,r){var s;!e.position||e.position instanceof google.maps.LatLng||delete e.position,s=new google.maps.InfoWindow(e);for(var p in a)p&&google.maps.event.addListener(s,p,a[p]);var c=n(function(e){angular.isString(r)?o(r).then(function(t){e(angular.element(t).wrap("<div>").parent())},function(e){throw"info-window template request failed: "+e}):e(r)}).then(function(e){var t=e.html().trim();if(1!=angular.element(t).length)throw"info-window working as a template must have a container";s.__template=t.replace(/\s?ng-non-bindable[='"]+/,"")});return s.__open=function(e,n,o){c.then(function(){i(function(){o&&(n.anchor=o);var i=t(s.__template)(n);s.setContent(i[0]),n.$apply(),o&&o.getPosition?s.open(e,o):o&&o instanceof google.maps.LatLng?(s.open(e),s.setPosition(o)):s.open(e);var a=s.content.parentElement.parentElement.parentElement;a.className="ng-map-info-window"})})},s},c=function(e,t,n,o){o=o[0]||o[1],t.css(
 "display","none");var i,c=s.orgAttributes(t),u=s.filter(n),l=s.getOptions(u,{scope:e}),g=s.getEvents(e,u),d=p(l,g,l.template||t);!l.position||l.position instanceof google.maps.LatLng||(i=l.position),i&&r.getGeoLocation(i).then(function(t){d.setPosition(t),d.__open(o.map,e,t);var i=n.geoCallback;i&&a(i)(e)}),o.addObject("infoWindows",d),o.observeAttrSetObj(c,n,d),o.showInfoWindow=o.map.showInfoWindow=o.showInfoWindow||function(t,n,i){var a="string"==typeof t?t:n,r="string"==typeof t?n:i;if("string"==typeof r)if("undefined"!=typeof o.map.markers&&"undefined"!=typeof o.map.markers[r])r=o.map.markers[r];else{if("undefined"==typeof o.map.customMarkers[r])throw new Error("Cant open info window for id "+r+". Marker or CustomMarker is not defined");r=o.map.customMarkers[r]}var s=o.map.infoWindows[a],p=r?r:this.getPosition?this:null;s.__open(o.map,e,p),o.singleInfoWindow&&(o.lastInfoWindow&&e.hideInfoWindow(o.lastInfoWindow),o.lastInfoWindow=a)},o.hideInfoWindow=o.map.hideInfoWindow=o.hideIn
 foWindow||function(e,t){var n="string"==typeof e?e:t,i=o.map.infoWindows[n];i.close()},e.showInfoWindow=o.map.showInfoWindow,e.hideInfoWindow=o.map.hideInfoWindow;var m=d.mapId?{id:d.mapId}:0;r.getMap(m).then(function(t){if(d.visible&&d.__open(t,e),d.visibleOnMarker){var n=d.visibleOnMarker;d.__open(t,e,t.markers[n])}})};return{restrict:"E",require:["?^map","?^ngMap"],link:c}};e.$inject=["Attr2MapOptions","$compile","$q","$templateRequest","$timeout","$parse","NgMap"],angular.module("ngMap").directive("infoWindow",e)}(),function(){"use strict";angular.module("ngMap").directive("kmlLayer",["Attr2MapOptions",function(e){var t=e,n=function(e,t){var n=new google.maps.KmlLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n};return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,o,i,a){a=a[0]||a[1];var r=t.orgAttributes(o),s=t.filter(i),p=t.getOptions(s,{scope:e}),c=t.getEvents(e,s),u=n(p,c);a.addObject("kmlLayers",u),a.observeAttrSetObj(r,i,u),o.bind("$destro
 y",function(){a.deleteObject("kmlLayers",u)})}}}])}(),function(){"use strict";angular.module("ngMap").directive("mapData",["Attr2MapOptions","NgMap",function(e,t){var n=e;return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,o,i){var a=n.filter(i),r=n.getOptions(a,{scope:e}),s=n.getEvents(e,a,s);t.getMap().then(function(t){for(var n in r){var o=r[n];"function"==typeof e[o]?t.data[n](e[o]):t.data[n](o)}for(var i in s)t.data.addListener(i,s[i])})}}}])}(),function(){"use strict";var e,t,n,o=[],i=[],a=function(n,a,r){var s=r.mapLazyLoadParams||r.mapLazyLoad;if(void 0===window.google||void 0===window.google.maps){i.push({scope:n,element:a,savedHtml:o[i.length]}),window.lazyLoadCallback=function(){e(function(){i.forEach(function(e){e.element.html(e.savedHtml),t(e.element.contents())(e.scope)})},100)};var p=document.createElement("script");p.src=s+(s.indexOf("?")>-1?"&":"?")+"callback=lazyLoadCallback",document.querySelector('script[src="'+p.src+'"]')||document.body.appendChild(p
 )}else a.html(o),t(a.contents())(n)},r=function(e,t){return!t.mapLazyLoad&&void 0,o.push(e.html()),n=t.mapLazyLoad,void 0!==window.google&&void 0!==window.google.maps?!1:(e.html(""),{pre:a})},s=function(n,o){return t=n,e=o,{compile:r}};s.$inject=["$compile","$timeout"],angular.module("ngMap").directive("mapLazyLoad",s)}(),function(){"use strict";angular.module("ngMap").directive("mapType",["$parse","NgMap",function(e,t){return{restrict:"E",require:["?^map","?^ngMap"],link:function(n,o,i,a){a=a[0]||a[1];var r,s=i.name;if(!s)throw"invalid map-type name";if(r=e(i.object)(n),!r)throw"invalid map-type object";t.getMap().then(function(e){e.mapTypes.set(s,r)}),a.addObject("mapTypes",r)}}}])}(),function(){"use strict";var e=function(){return{restrict:"AE",controller:"__MapController",controllerAs:"ngmap"}};angular.module("ngMap").directive("map",[e]),angular.module("ngMap").directive("ngMap",[e])}(),function(){"use strict";angular.module("ngMap").directive("mapsEngineLayer",["Attr2MapOption
 s",function(e){var t=e,n=function(e,t){var n=new google.maps.visualization.MapsEngineLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n};return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,o,i,a){a=a[0]||a[1];var r=t.filter(i),s=t.getOptions(r,{scope:e}),p=t.getEvents(e,r,p),c=n(s,p);a.addObject("mapsEngineLayers",c)}}}])}(),function(){"use strict";var e,t,n,o=function(e,t){var o;if(n.defaultOptions.marker)for(var i in n.defaultOptions.marker)"undefined"==typeof e[i]&&(e[i]=n.defaultOptions.marker[i]);e.position instanceof google.maps.LatLng||(e.position=new google.maps.LatLng(0,0)),o=new google.maps.Marker(e),Object.keys(t).length>0;for(var a in t)a&&google.maps.event.addListener(o,a,t[a]);return o},i=function(i,a,r,s){s=s[0]||s[1];var p,c=e.orgAttributes(a),u=e.filter(r),l=e.getOptions(u,i,{scope:i}),g=e.getEvents(i,u);l.position instanceof google.maps.LatLng||(p=l.position);var d=o(l,g);s.addObject("markers",d),p&&n.getGeoLocation(p).then(functio
 n(e){d.setPosition(e),l.centered&&d.map.setCenter(e);var n=r.geoCallback;n&&t(n)(i)}),s.observeAttrSetObj(c,r,d),a.bind("$destroy",function(){s.deleteObject("markers",d)})},a=function(o,a,r){return e=o,t=a,n=r,{restrict:"E",require:["^?map","?^ngMap"],link:i}};a.$inject=["Attr2MapOptions","$parse","NgMap"],angular.module("ngMap").directive("marker",a)}(),function(){"use strict";angular.module("ngMap").directive("overlayMapType",["NgMap",function(e){return{restrict:"E",require:["?^map","?^ngMap"],link:function(t,n,o,i){i=i[0]||i[1];var a=o.initMethod||"insertAt",r=t[o.object];e.getMap().then(function(e){if("insertAt"==a){var t=parseInt(o.index,10);e.overlayMapTypes.insertAt(t,r)}else"push"==a&&e.overlayMapTypes.push(r)}),i.addObject("overlayMapTypes",r)}}}])}(),function(){"use strict";var e=function(e,t){var n=e,o=function(e,o,i,a){if("false"===i.placesAutoComplete)return!1;var r=n.filter(i),s=n.getOptions(r,{scope:e}),p=n.getEvents(e,r),c=new google.maps.places.Autocomplete(o[0],s);
 for(var u in p)google.maps.event.addListener(c,u,p[u]);var l=function(){t(function(){a&&a.$setViewValue(o.val())},100)};google.maps.event.addListener(c,"place_changed",l),o[0].addEventListener("change",l),i.$observe("types",function(e){if(e){var t=n.toOptionValue(e,{key:"types"});c.setTypes(t)}}),i.$observe("componentRestrictions",function(t){t&&c.setComponentRestrictions(e.$eval(t))})};return{restrict:"A",require:"?ngModel",link:o}};e.$inject=["Attr2MapOptions","$timeout"],angular.module("ngMap").directive("placesAutoComplete",e)}(),function(){"use strict";var e=function(e,t){var n,o=e.name;switch(delete e.name,o){case"circle":e.center instanceof google.maps.LatLng||(e.center=new google.maps.LatLng(0,0)),n=new google.maps.Circle(e);break;case"polygon":n=new google.maps.Polygon(e);break;case"polyline":n=new google.maps.Polyline(e);break;case"rectangle":n=new google.maps.Rectangle(e);break;case"groundOverlay":case"image":var i=e.url,a={opacity:e.opacity,clickable:e.clickable,id:e.id}
 ;n=new google.maps.GroundOverlay(i,e.bounds,a)}for(var r in t)t[r]&&google.maps.event.addListener(n,r,t[r]);return n},t=function(t,n,o){var i=t,a=function(t,a,r,s){s=s[0]||s[1];var p,c,u=i.orgAttributes(a),l=i.filter(r),g=i.getOptions(l,{scope:t}),d=i.getEvents(t,l);c=g.name,g.center instanceof google.maps.LatLng||(p=g.center);var m=e(g,d);s.addObject("shapes",m),p&&"circle"==c&&o.getGeoLocation(p).then(function(e){m.setCenter(e),m.centered&&m.map.setCenter(e);var o=r.geoCallback;o&&n(o)(t)}),s.observeAttrSetObj(u,r,m),a.bind("$destroy",function(){s.deleteObject("shapes",m)})};return{restrict:"E",require:["?^map","?^ngMap"],link:a}};t.$inject=["Attr2MapOptions","$parse","NgMap"],angular.module("ngMap").directive("shape",t)}(),function(){"use strict";var e=function(e,t){var n=e,o=function(e,t,n){var o,i;t.container&&(i=document.getElementById(t.container),i=i||document.querySelector(t.container)),i?o=new google.maps.StreetViewPanorama(i,t):(o=e.getStreetView(),o.setOptions(t));for(va
 r a in n)a&&google.maps.event.addListener(o,a,n[a]);return o},i=function(e,i,a){var r=n.filter(a),s=n.getOptions(r,{scope:e}),p=n.getControlOptions(r),c=angular.extend(s,p),u=n.getEvents(e,r);t.getMap().then(function(e){var t=o(e,c,u);e.setStreetView(t),!t.getPosition()&&t.setPosition(e.getCenter()),google.maps.event.addListener(t,"position_changed",function(){t.getPosition()!==e.getCenter()&&e.setCenter(t.getPosition())});var n=google.maps.event.addListener(e,"center_changed",function(){t.setPosition(e.getCenter()),google.maps.event.removeListener(n)})})};return{restrict:"E",require:["?^map","?^ngMap"],link:i}};e.$inject=["Attr2MapOptions","NgMap"],angular.module("ngMap").directive("streetViewPanorama",e)}(),function(){"use strict";angular.module("ngMap").directive("trafficLayer",["Attr2MapOptions",function(e){var t=e,n=function(e,t){var n=new google.maps.TrafficLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n};return{restrict:"E",require:["?^map","?^ngMap"]
 ,link:function(e,o,i,a){a=a[0]||a[1];var r=t.orgAttributes(o),s=t.filter(i),p=t.getOptions(s,{scope:e}),c=t.getEvents(e,s),u=n(p,c);a.addObject("trafficLayers",u),a.observeAttrSetObj(r,i,u),o.bind("$destroy",function(){a.deleteObject("trafficLayers",u)})}}}])}(),function(){"use strict";angular.module("ngMap").directive("transitLayer",["Attr2MapOptions",function(e){var t=e,n=function(e,t){var n=new google.maps.TransitLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n};return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,o,i,a){a=a[0]||a[1];var r=t.orgAttributes(o),s=t.filter(i),p=t.getOptions(s,{scope:e}),c=t.getEvents(e,s),u=n(p,c);a.addObject("transitLayers",u),a.observeAttrSetObj(r,i,u),o.bind("$destroy",function(){a.deleteObject("transitLayers",u)})}}}])}(),function(){"use strict";var e=/([\:\-\_]+(.))/g,t=/^moz([A-Z])/,n=function(){return function(n){return n.replace(e,function(e,t,n,o){return o?n.toUpperCase():n}).replace(t,"Moz$1")}};angular.mo
 dule("ngMap").filter("camelCase",n)}(),function(){"use strict";var e=function(){return function(e){try{return JSON.parse(e),e}catch(t){return e.replace(/([\$\w]+)\s*:/g,function(e,t){return'"'+t+'":'}).replace(/'([^']+)'/g,function(e,t){return'"'+t+'"'})}}};angular.module("ngMap").filter("jsonize",e)}(),function(){"use strict";var isoDateRE=/^(\d{4}\-\d\d\-\d\d([tT][\d:\.]*)?)([zZ]|([+\-])(\d\d):?(\d\d))?$/,Attr2MapOptions=function($parse,$timeout,$log,NavigatorGeolocation,GeoCoder,camelCaseFilter,jsonizeFilter){var orgAttributes=function(e){e.length>0&&(e=e[0]);for(var t={},n=0;n<e.attributes.length;n++){var o=e.attributes[n];t[o.name]=o.value}return t},getJSON=function(e){var t=/^[\+\-]?[0-9\.]+,[ ]*\ ?[\+\-]?[0-9\.]+$/;return e.match(t)&&(e="["+e+"]"),JSON.parse(jsonizeFilter(e))},getLatLng=function(e){var t=e;return e[0].constructor==Array?t=e.map(function(e){return new google.maps.LatLng(e[0],e[1])}):!isNaN(parseFloat(e[0]))&&isFinite(e[0])&&(t=new google.maps.LatLng(t[0],t[1])
 ),t},toOptionValue=function(input,options){var output;try{output=getNumber(input)}catch(err){try{var output=getJSON(input);if(output instanceof Array)output=output[0].constructor==Object?output:getLatLng(output);else if(output===Object(output)){var newOptions=options;newOptions.doNotConverStringToNumber=!0,output=getOptions(output,newOptions)}}catch(err2){if(input.match(/^[A-Z][a-zA-Z0-9]+\(.*\)$/))try{var exp="new google.maps."+input;output=eval(exp)}catch(e){output=input}else if(input.match(/^([A-Z][a-zA-Z0-9]+)\.([A-Z]+)$/))try{var matches=input.match(/^([A-Z][a-zA-Z0-9]+)\.([A-Z]+)$/);output=google.maps[matches[1]][matches[2]]}catch(e){output=input}else if(input.match(/^[A-Z]+$/))try{var capitalizedKey=options.key.charAt(0).toUpperCase()+options.key.slice(1);options.key.match(/temperatureUnit|windSpeedUnit|labelColor/)?(capitalizedKey=capitalizedKey.replace(/s$/,""),output=google.maps.weather[capitalizedKey][input]):output=google.maps[capitalizedKey][input]}catch(e){output=input
 }else if(input.match(isoDateRE))try{output=new Date(input)}catch(e){output=input}else if(input.match(/^{/)&&options.scope)try{var expr=input.replace(/{{/,"").replace(/}}/g,"");output=options.scope.$eval(expr)}catch(err){output=input}else output=input}}if(("center"==options.key||"center"==options.key)&&output instanceof Array&&(output=new google.maps.LatLng(output[0],output[1])),"bounds"==options.key&&output instanceof Array&&(output=new google.maps.LatLngBounds(output[0],output[1])),"icons"==options.key&&output instanceof Array)for(var i=0;i<output.length;i++){var el=output[i];el.icon.path.match(/^[A-Z_]+$/)&&(el.icon.path=google.maps.SymbolPath[el.icon.path])}if("icon"==options.key&&output instanceof Object){(""+output.path).match(/^[A-Z_]+$/)&&(output.path=google.maps.SymbolPath[output.path]);for(var key in output){var arr=output[key];"anchor"==key||"origin"==key||"labelOrigin"==key?output[key]=new google.maps.Point(arr[0],arr[1]):("size"==key||"scaledSize"==key)&&(output[key]=new
  google.maps.Size(arr[0],arr[1]))}}return output},getAttrsToObserve=function(e){var t=[];if(!e.noWatcher)for(var n in e){var o=e[n];o&&o.match(/\{\{.*\}\}/)&&t.push(camelCaseFilter(n))}return t},filter=function(e){var t={};for(var n in e)n.match(/^\$/)||n.match(/^ng[A-Z]/)||(t[n]=e[n]);return t},getOptions=function(e,t){t=t||{};var n={};for(var o in e)if(e[o]||0===e[o]){if(o.match(/^on[A-Z]/))continue;if(o.match(/ControlOptions$/))continue;n[o]="string"!=typeof e[o]?e[o]:t.doNotConverStringToNumber&&e[o].match(/^[0-9]+$/)?e[o]:toOptionValue(e[o],{key:o,scope:t.scope})}return n},getEvents=function(e,t){var n={},o=function(e){return"_"+e.toLowerCase()},i=function(t){var n=t.match(/([^\(]+)\(([^\)]*)\)/),o=n[1],i=n[2].replace(/event[ ,]*/,""),a=$parse("["+i+"]");return function(t){function n(e,t){return e[t]}var i=a(e),r=o.split(".").reduce(n,e);r&&r.apply(this,[t].concat(i)),$timeout(function(){e.$apply()})}};for(var a in t)if(t[a]){if(!a.match(/^on[A-Z]/))continue;var r=a.replace(/^o
 n/,"");r=r.charAt(0).toLowerCase()+r.slice(1),r=r.replace(/([A-Z])/g,o);var s=t[a];n[r]=new i(s)}return n},getControlOptions=function(e){var t={};if("object"!=typeof e)return!1;for(var n in e)if(e[n]){if(!n.match(/(.*)ControlOptions$/))continue;var o=e[n],i=o.replace(/'/g,'"');i=i.replace(/([^"]+)|("[^"]+")/g,function(e,t,n){return t?t.replace(/([a-zA-Z0-9]+?):/g,'"$1":'):n});try{var a=JSON.parse(i);for(var r in a)if(a[r]){var s=a[r];if("string"==typeof s?s=s.toUpperCase():"mapTypeIds"===r&&(s=s.map(function(e){return e.match(/^[A-Z]+$/)?google.maps.MapTypeId[e.toUpperCase()]:e})),"style"===r){var p=n.charAt(0).toUpperCase()+n.slice(1),c=p.replace(/Options$/,"")+"Style";a[r]=google.maps[c][s]}else a[r]="position"===r?google.maps.ControlPosition[s]:s}t[n]=a}catch(u){}}return t};return{filter:filter,getOptions:getOptions,getEvents:getEvents,getControlOptions:getControlOptions,toOptionValue:toOptionValue,getAttrsToObserve:getAttrsToObserve,orgAttributes:orgAttributes}};Attr2MapOptions.
 $inject=["$parse","$timeout","$log","NavigatorGeolocation","GeoCoder","camelCaseFilter","jsonizeFilter"],angular.module("ngMap").service("Attr2MapOptions",Attr2MapOptions)}(),function(){"use strict";var e,t=function(t){var n=e.defer(),o=new google.maps.Geocoder;return o.geocode(t,function(e,t){t==google.maps.GeocoderStatus.OK?n.resolve(e):n.reject(t)}),n.promise},n=function(n){return e=n,{geocode:t}};n.$inject=["$q"],angular.module("ngMap").service("GeoCoder",n)}(),function(){"use strict";var e,t=function(t){var n=e.defer();return navigator.geolocation?(void 0===t?t={timeout:5e3}:void 0===t.timeout&&(t.timeout=5e3),navigator.geolocation.getCurrentPosition(function(e){n.resolve(e)},function(e){n.reject(e)},t)):n.reject("Browser Geolocation service failed."),n.promise},n=function(n){return e=n,{getCurrentPosition:t}};n.$inject=["$q"],angular.module("ngMap").service("NavigatorGeolocation",n)}(),function(){"use strict";var e,t,n,o=[],i=function(n){var i=t.createElement("div");i.style.wi
 dth="100%",i.style.height="100%",n.appendChild(i);var a=new e.google.maps.Map(i,{});return o.push(a),a},a=function(e,t){for(var n,i=0;i<o.length;i++){var a=o[i];if(a.id==t&&!a.inUse){var r=a.getDiv();e.appendChild(r),n=a;break}}return n},r=function(e){for(var t,n=0;n<o.length;n++){var i=o[n];if(!i.id&&!i.inUse){var a=i.getDiv();e.appendChild(a),t=i;break}}return t},s=function(e){var t=a(e,e.id)||r(e);return t?n(function(){google.maps.event.trigger(t,"idle")},100):t=i(e),t.inUse=!0,t},p=function(e){e.inUse=!1},c=function(){for(var e=0;e<o.length;e++)o[e]=null;o=[]},u=function(i,a,r){return t=i[0],e=a,n=r,{mapInstances:o,resetMapInstances:c,getMapInstance:s,returnMapInstance:p}};u.$inject=["$document","$window","$timeout"],angular.module("ngMap").factory("NgMapPool",u)}(),function(){"use strict";var e,t,n,o,i,a,r,s={},p=function(n,o){var i;return n.currentStyle?i=n.currentStyle[o]:e.getComputedStyle&&(i=t.defaultView.getComputedStyle(n,null).getPropertyValue(o)),i},c=function(e){var t
 =s[e||0];return t.map instanceof google.maps.Map?void 0:(t.initializeMap(),t.map)},u=function(t){function o(n){s[t]?i.resolve(s[t].map):n>a?i.reject("could not find map"):e.setTimeout(function(){o(n+100)},100)}t="object"==typeof t?t.id:t,t=t||0;var i=n.defer(),a=2e3;return o(0),i.promise},l=function(e){if(e.map){var t=Object.keys(s).length;s[e.map.id||t]=e}},g=function(e){var t=Object.keys(s).length-1,n=e.map.id||t;if(e.map){for(var o in e.eventListeners){var i=e.eventListeners[o];google.maps.event.removeListener(i)}e.map.controls&&e.map.controls.forEach(function(e){e.clear()})}e.map.heatmapLayers&&Object.keys(e.map.heatmapLayers).forEach(function(t){e.deleteObject("heatmapLayers",e.map.heatmapLayers[t])}),delete s[n]},d=function(e,t){var i=n.defer();return!e||e.match(/^current/i)?o.getCurrentPosition(t).then(function(e){var t=e.coords.latitude,n=e.coords.longitude,o=new google.maps.LatLng(t,n);i.resolve(o)},function(e){i.reject(e)}):a.geocode({address:e}).then(function(e){i.resolve
 (e[0].geometry.location)},function(e){i.reject(e)}),i.promise},m=function(e,t){return function(n){if(n){var o=r("set-"+e),a=i.toOptionValue(n,{key:e});t[o]&&(e.match(/center|position/)&&"string"==typeof a?d(a).then(function(e){t[o](e)}):t[o](a))}}},f=function(e){var t=e.getAttribute("default-style");"true"==t?(e.style.display="block",e.style.height="300px"):("block"!=p(e,"display")&&(e.style.display="block"),p(e,"height").match(/^(0|auto)/)&&(e.style.height="300px"))};angular.module("ngMap").provider("NgMap",function(){var s={};this.setDefaultOptions=function(e){s=e};var p=function(p,v,y,h,M,b,O){return e=p,t=v[0],n=y,o=h,i=M,a=b,r=O,{defaultOptions:s,addMap:l,deleteMap:g,getMap:u,initMap:c,setStyle:f,getGeoLocation:d,observeAndSet:m}};p.$inject=["$window","$document","$q","NavigatorGeolocation","Attr2MapOptions","GeoCoder","camelCaseFilter"],this.$get=p})}(),function(){"use strict";var e,t=function(t,n){n=n||t.getCenter();var o=e.defer(),i=new google.maps.StreetViewService;return i
 .getPanoramaByLocation(n||t.getCenter,100,function(e,t){t===google.maps.StreetViewStatus.OK?o.resolve(e.location.pano):o.resolve(!1)
+}),o.promise},n=function(e,t){var n=new google.maps.StreetViewPanorama(e.getDiv(),{enableCloseButton:!0});n.setPano(t)},o=function(o){return e=o,{getPanorama:t,setPanorama:n}};o.$inject=["$q"],angular.module("ngMap").service("StreetView",o)}(),"ngMap"});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/js/underscore-min_1.8.3.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/js/underscore-min_1.8.3.js b/traffic_portal/app/src/assets/js/underscore-min_1.8.3.js
new file mode 100644
index 0000000..f01025b
--- /dev/null
+++ b/traffic_portal/app/src/assets/js/underscore-min_1.8.3.js
@@ -0,0 +1,6 @@
+//     Underscore.js 1.8.3
+//     http://underscorejs.org
+//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+//     Underscore may be freely distributed under the MIT license.
+(function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if("number"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.h
 asOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):u._=m,m.VERSION="1.8.3";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}}
 ,j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w("length"),k=function(n){var t=O(n);return"number"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)
 &&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),("number"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var
  a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.c
 all(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,
 r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])<u?i=a+1:o=a}return i},m.i
 ndexOf=r(1,m.findIndex,m.sortedIndex),m.lastIndexOf=r(-1,m.findLastIndex),m.range=function(n,t,r){null==t&&(t=n||0,n=0),r=r||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=Array(e),i=0;e>i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e<arguments.length;)i.push(arguments[e++]);return E(n,r,this,this,i)};return r},m.bindAll=function(n){var t,r,e=arguments.length;if(1>=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.
 memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return func
 tion(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e
 ,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=
 function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t)
 ,i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return"[object Array]"===s.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return s.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))}
 ,m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n)
 .join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var K=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,L=function(n){return"\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i
 ="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||"obj";return c.source="function("+f+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each(["concat","join","slice"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=f
 unction(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this);
+//# sourceMappingURL=underscore-min.map
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/other/collateral.txt
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/other/collateral.txt b/traffic_portal/app/src/assets/other/collateral.txt
deleted file mode 100644
index f402ca7..0000000
--- a/traffic_portal/app/src/assets/other/collateral.txt
+++ /dev/null
@@ -1 +0,0 @@
-This is a document you want to share with your traffic portal users.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/ASNService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/ASNService.js b/traffic_portal/app/src/common/api/ASNService.js
new file mode 100644
index 0000000..9cc604a
--- /dev/null
+++ b/traffic_portal/app/src/common/api/ASNService.js
@@ -0,0 +1,70 @@
+/*
+ * 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 ASNService = function(Restangular, locationUtils, messageModel) {
+
+    this.getASNs = function(queryParams) {
+        return Restangular.all('asns').getList(queryParams);
+    };
+
+    this.getASN = function(id) {
+        return Restangular.one("asns", id).get();
+    };
+
+    this.createASN = function(asn) {
+        return Restangular.service('asns').post(asn)
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'ASN created' } ], true);
+                    locationUtils.navigateToPath('/admin/asns');
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.updateASN = function(asn) {
+        return asn.put()
+            .then(
+            function() {
+                messageModel.setMessages([ { level: 'success', text: 'ASN updated' } ], false);
+            },
+            function(fault) {
+                messageModel.setMessages(fault.data.alerts, false);
+            }
+        );
+    };
+
+    this.deleteASN = function(id) {
+        return Restangular.one("asns", id).remove()
+            .then(
+            function() {
+                messageModel.setMessages([ { level: 'success', text: 'ASN deleted' } ], true);
+            },
+            function(fault) {
+                messageModel.setMessages(fault.data.alerts, true);
+            }
+        );
+    };
+
+};
+
+ASNService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
+module.exports = ASNService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/AuthService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/AuthService.js b/traffic_portal/app/src/common/api/AuthService.js
index c3fea82..aa8536e 100644
--- a/traffic_portal/app/src/common/api/AuthService.js
+++ b/traffic_portal/app/src/common/api/AuthService.js
@@ -1,82 +1,71 @@
 /*
-
-
- 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 AuthService = function($http, $state, $location, $q, userModel, deliveryServicesModel, messageModel, ENV) {
+var AuthService = function($rootScope, $http, $state, $location, $q, $state, httpService, userModel, messageModel, ENV) {
 
     this.login = function(username, password) {
         userModel.resetUser();
-        deliveryServicesModel.resetDeliveryServices();
-        var promise = $http.post(
-                ENV.apiEndpoint['1.2'] + "user/login", { u: username, p: password })
-            .success(function(result) {
-                var redirect = decodeURIComponent($location.search().redirect);
-                if (redirect !== 'undefined') {
-                    $location.search('redirect', null); // remove the redirect query param
-                    $location.url(redirect);
-                } else {
-                    $location.url('/dashboard');
+        return httpService.post(ENV.api['root'] + 'user/login', { u: username, p: password })
+            .then(
+                function(result) {
+                    $rootScope.$broadcast('authService::login');
+                    var redirect = decodeURIComponent($location.search().redirect);
+                    if (redirect !== 'undefined') {
+                        $location.search('redirect', null); // remove the redirect query param
+                        $location.url(redirect);
+                    } else {
+                        $location.url('/monitor/dashboard');
+                    }
+                },
+                function(fault) {
+                    // do nothing
                 }
-                return result;
-            })
-            .error(function(fault) {
-                return fault;
-            });
-
-        return promise;
+            );
     };
 
     this.tokenLogin = function(token) {
         userModel.resetUser();
-        deliveryServicesModel.resetDeliveryServices();
-        var deferred = $q.defer();
-        $http.post(
-                ENV.apiEndpoint['1.2'] + "user/login/token", { t: token })
-            .success(function(result) {
-                deferred.resolve(result);
-            })
-            .error(function(fault) {
-                deferred.reject(fault);
-            });
-
-        return deferred.promise;
+        return httpService.post(ENV.api['root'] + 'user/login/token', { t: token });
     };
 
     this.logout = function() {
         userModel.resetUser();
-        deliveryServicesModel.resetDeliveryServices();
-        var promise = $http.post(
-                ENV.apiEndpoint['1.2'] + "user/logout")
-            .success(function(result) {
-                if ($state.current.name == 'trafficPortal.public.home.landing') {
-                    messageModel.setMessages(result.alerts, false);
-                } else {
-                    messageModel.setMessages(result.alerts, true);
-                    $state.go('trafficPortal.public.home.landing');
+        httpService.post(ENV.api['root'] + 'user/logout').
+            then(
+                function(result) {
+                    $rootScope.$broadcast('authService::logout');
+                    if ($state.current.name == 'trafficPortal.public.login') {
+                        messageModel.setMessages(result.alerts, false);
+                    } else {
+                        messageModel.setMessages(result.alerts, true);
+                        $state.go('trafficPortal.public.login');
+                    }
+                    return result;
                 }
-                return result;
-            })
-            .error(function(fault) {
-                return fault;
-            });
+        );
+    };
 
-        return promise;
+    this.resetPassword = function(email) {
+        // Todo: api endpoint not implemented yet
     };
 
 };
 
-AuthService.$inject = ['$http', '$state', '$location', '$q', 'userModel', 'deliveryServicesModel', 'messageModel', 'ENV'];
-module.exports = AuthService;
\ No newline at end of file
+AuthService.$inject = ['$rootScope', '$http', '$state', '$location', '$q', '$state', 'httpService', 'userModel', 'messageModel', 'ENV'];
+module.exports = AuthService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/CDNService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/CDNService.js b/traffic_portal/app/src/common/api/CDNService.js
new file mode 100644
index 0000000..e9221d0
--- /dev/null
+++ b/traffic_portal/app/src/common/api/CDNService.js
@@ -0,0 +1,216 @@
+/*
+ * 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 CDNService = function($http, $q, Restangular, locationUtils, messageModel, ENV) {
+
+    this.getCDNs = function(all) {
+        var request = $q.defer();
+
+        $http.get(ENV.api['root'] + "cdns")
+            .then(
+                function(result) {
+                    var response;
+                    if (all) { // there is a CDN called "ALL" that is not really a CDN but you might want it...
+                        response = result.data.response;
+                    } else {
+                        response = _.filter(result.data.response, function(cdn) {
+                            return cdn.name != 'ALL';
+                        });
+                    }
+                    request.resolve(response);
+                },
+                function(fault) {
+                    request.reject();
+                }
+            );
+
+        return request.promise;
+    };
+
+
+    this.getCDN = function(id) {
+        return Restangular.one("cdns", id).get();
+    };
+
+    this.createCDN = function(cdn) {
+        return Restangular.service('cdns').post(cdn)
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'CDN created' } ], true);
+                    locationUtils.navigateToPath('/admin/cdns');
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.updateCDN = function(cdn) {
+        return cdn.put()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'CDN updated' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.deleteCDN = function(id) {
+        return Restangular.one("cdns", id).remove()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'CDN deleted' } ], true);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
+                }
+            );
+    };
+
+    this.queueServerUpdates = function(id) {
+        return Restangular.one("cdns", id).customPOST( { action: "queue"}, "queue_update" )
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Queued CDN server updates' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.clearServerUpdates = function(id) {
+        return Restangular.one("cdns", id).customPOST( { action: "dequeue"}, "queue_update" )
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Cleared CDN server updates' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.getCapacity = function() {
+        var request = $q.defer();
+
+        $http.get(ENV.api['root'] + "cdns/capacity")
+            .then(
+                function(result) {
+                    request.resolve(result.data.response);
+                },
+                function(fault) {
+                    request.reject();
+                }
+            );
+
+        return request.promise;
+    };
+
+    this.getRoutingMethods = function() {
+        var request = $q.defer();
+
+        $http.get(ENV.api['root'] + "cdns/routing")
+            .then(
+                function(result) {
+                    request.resolve(result.data.response);
+                },
+                function(fault) {
+                    request.reject();
+                }
+            );
+
+        return request.promise;
+    };
+
+    this.getCurrentStats = function() {
+        var request = $q.defer();
+
+        $http.get(ENV.api['root'] + "current_stats")
+            .then(
+                function(result) {
+                    request.resolve(result.data.response);
+                },
+                function(fault) {
+                    request.reject();
+                }
+            );
+
+        return request.promise;
+    };
+
+    this.getCurrentSnapshot = function(cdnName) {
+        var request = $q.defer();
+
+        $http.get(ENV.api['root'] + "cdns/" + cdnName + "/snapshot")
+            .then(
+                function(result) {
+                    request.resolve(result.data.response);
+                },
+                function(fault) {
+                    request.reject();
+                }
+            );
+
+        return request.promise;
+    };
+
+    this.getNewSnapshot = function(cdnName) {
+        var request = $q.defer();
+
+        $http.get(ENV.api['root'] + "cdns/" + cdnName + "/snapshot/new")
+            .then(
+                function(result) {
+                    request.resolve(result.data.response);
+                },
+                function(fault) {
+                    request.reject();
+                }
+            );
+
+        return request.promise;
+    };
+
+    this.snapshot = function(cdn) {
+        var request = $q.defer();
+
+        $http.put(ENV.api['root'] + "cdns/" + cdn.id + "/snapshot")
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Snapshot performed' } ], true);
+                    locationUtils.navigateToPath('/admin/cdns/' + cdn.id);
+
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+
+        return request.promise;
+    };
+
+
+
+
+};
+
+CDNService.$inject = ['$http', '$q', 'Restangular', 'locationUtils', 'messageModel', 'ENV'];
+module.exports = CDNService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/CacheGroupParameterService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/CacheGroupParameterService.js b/traffic_portal/app/src/common/api/CacheGroupParameterService.js
new file mode 100644
index 0000000..ee1da69
--- /dev/null
+++ b/traffic_portal/app/src/common/api/CacheGroupParameterService.js
@@ -0,0 +1,53 @@
+/*
+ * 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 CacheGroupParameterService = function(Restangular, messageModel, httpService, ENV) {
+
+	this.getCacheGroupParameters = function(cachegroupId) {
+		return Restangular.one('cachegroups', cachegroupId).getList('parameters')
+	};
+
+	this.unlinkCacheGroupParameter = function(cgId, paramId) {
+		return httpService.delete(ENV.api['root'] + 'cachegroupparameters/' + cgId + '/' + paramId)
+			.then(
+				function() {
+					messageModel.setMessages([ { level: 'success', text: 'Cachegroup and parameter were unlinked.' } ], false);
+				},
+				function(fault) {
+					messageModel.setMessages(fault.data.alerts, true);
+				}
+			);
+	};
+
+	this.linkCacheGroupParameters = function(cgParamMappings) {
+		return Restangular.service('cachegroupparameters').post(cgParamMappings)
+			.then(
+				function() {
+					messageModel.setMessages([ { level: 'success', text: 'Parameters linked to cache group' } ], false);
+				},
+				function(fault) {
+					messageModel.setMessages(fault.data.alerts, false);
+				}
+			);
+	};
+
+};
+
+CacheGroupParameterService.$inject = ['Restangular', 'messageModel', 'httpService', 'ENV'];
+module.exports = CacheGroupParameterService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/CacheGroupService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/CacheGroupService.js b/traffic_portal/app/src/common/api/CacheGroupService.js
new file mode 100644
index 0000000..cec928e
--- /dev/null
+++ b/traffic_portal/app/src/common/api/CacheGroupService.js
@@ -0,0 +1,115 @@
+/*
+ * 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 CacheGroupService = function($http, $q, Restangular, locationUtils, messageModel, ENV) {
+
+    this.getCacheGroups = function(queryParams) {
+        return Restangular.all('cachegroups').getList(queryParams);
+    };
+
+    this.getCacheGroup = function(id) {
+        return Restangular.one("cachegroups", id).get();
+    };
+
+    this.createCacheGroup = function(cacheGroup) {
+        return Restangular.service('cachegroups').post(cacheGroup)
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'CacheGroup created' } ], true);
+                    locationUtils.navigateToPath('/configure/cache-groups');
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.updateCacheGroup = function(cacheGroup) {
+        return cacheGroup.put()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Cache group updated' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.deleteCacheGroup = function(id) {
+        return Restangular.one("cachegroups", id).remove()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Cache group deleted' } ], true);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
+                }
+            );
+    };
+
+    this.queueServerUpdates = function(cgId, cdnId) {
+        return Restangular.one("cachegroups", cgId).customPOST( { action: "queue", cdnId: cdnId }, "queue_update" )
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Queued cache group server updates' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.clearServerUpdates = function(cgId, cdnId) {
+        return Restangular.one("cachegroups", cgId).customPOST( { action: "dequeue", cdnId: cdnId}, "queue_update" )
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Cleared cache group server updates' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.getParameterCacheGroups = function(paramId) {
+        // todo: this needs an api: /parameters/:id/cachegroups
+        return Restangular.one('parameters', paramId).getList('cachegroups');
+    };
+
+    this.getCacheGroupHealth = function() {
+        var deferred = $q.defer();
+
+        $http.get(ENV.api['root'] + "cdns/health")
+            .then(
+                function(result) {
+                    deferred.resolve(result.data.response);
+                },
+                function(fault) {
+                    deferred.reject(fault);
+                }
+            );
+
+        return deferred.promise;
+    };
+
+};
+
+CacheGroupService.$inject = ['$http', '$q', 'Restangular', 'locationUtils', 'messageModel', 'ENV'];
+module.exports = CacheGroupService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/CacheStatsService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/CacheStatsService.js b/traffic_portal/app/src/common/api/CacheStatsService.js
new file mode 100644
index 0000000..3bcd97a
--- /dev/null
+++ b/traffic_portal/app/src/common/api/CacheStatsService.js
@@ -0,0 +1,63 @@
+/*
+ * 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 CacheStatsService = function($http, $q, httpService, ENV) {
+
+	this.getBandwidth = function(cdnName, start, end) {
+		var request = $q.defer();
+
+		var url = ENV.api['root'] + "cache_stats",
+			params = { cdnName: cdnName, metricType: 'bandwidth', startDate: start.seconds(00).format(), endDate: end.seconds(00).format()};
+
+		$http.get(url, { params: params })
+			.then(
+				function(result) {
+					request.resolve(result.data.response);
+				},
+				function(fault) {
+					request.reject();
+				}
+			);
+
+		return request.promise;
+	};
+
+	this.getConnections = function(cdnName, start, end) {
+		var request = $q.defer();
+
+		var url = ENV.api['root'] + "cache_stats",
+			params = { cdnName: cdnName, metricType: 'connections', startDate: start.seconds(00).format(), endDate: end.seconds(00).format()};
+
+		$http.get(url, { params: params })
+			.then(
+				function(result) {
+					request.resolve(result.data.response);
+				},
+				function(fault) {
+					request.reject();
+				}
+			);
+
+		return request.promise;
+	};
+
+};
+
+CacheStatsService.$inject = ['$http', '$q', 'httpService', 'ENV'];
+module.exports = CacheStatsService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/ChangeLogService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/ChangeLogService.js b/traffic_portal/app/src/common/api/ChangeLogService.js
new file mode 100644
index 0000000..133438e
--- /dev/null
+++ b/traffic_portal/app/src/common/api/ChangeLogService.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.
+ */
+
+var ChangeLogService = function(Restangular, $rootScope, httpService, ENV) {
+
+	this.getNewLogCount = function() {
+		return httpService.get(ENV.api['root'] + 'logs/newcount', { ignoreLoadingBar: true });
+	};
+
+	this.getChangeLogs = function(queryParams) {
+		// broadcast an event that will zero out the change log count immediately
+		$rootScope.$broadcast('changeLogService::getChangeLogs');
+		return Restangular.all('logs').getList(queryParams);
+	};
+
+};
+
+ChangeLogService.$inject = ['Restangular', '$rootScope', 'httpService', 'ENV'];
+module.exports = ChangeLogService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/DeliveryServiceRegexService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/DeliveryServiceRegexService.js b/traffic_portal/app/src/common/api/DeliveryServiceRegexService.js
new file mode 100644
index 0000000..8276a3c
--- /dev/null
+++ b/traffic_portal/app/src/common/api/DeliveryServiceRegexService.js
@@ -0,0 +1,70 @@
+/*
+ * 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 DeliveryServiceRegexService = function(Restangular, locationUtils, messageModel) {
+
+	this.getDeliveryServiceRegexes = function(dsId) {
+		return Restangular.one('deliveryservices', dsId).getList('regexes');
+	};
+
+	this.getDeliveryServiceRegex = function(dsId, regexId) {
+		return Restangular.one('deliveryservices', dsId).one('regexes', regexId).get();
+	};
+
+	this.createDeliveryServiceRegex = function(dsId, regex) {
+		return Restangular.one('deliveryservices', dsId).all('regexes').post(regex)
+			.then(
+				function() {
+					messageModel.setMessages([ { level: 'success', text: 'Regex created' } ], true);
+					locationUtils.navigateToPath('/configure/delivery-services/' + dsId + '/regexes');
+				},
+				function(fault) {
+					messageModel.setMessages(fault.data.alerts, false);
+				}
+			);
+	};
+
+	this.updateDeliveryServiceRegex = function(regex) {
+		return regex.put()
+			.then(
+				function() {
+					messageModel.setMessages([ { level: 'success', text: 'Regex updated' } ], false);
+				},
+				function(fault) {
+					messageModel.setMessages(fault.data.alerts, false);
+				}
+			);
+	};
+
+	this.deleteDeliveryServiceRegex = function(dsId, regexId) {
+		return Restangular.one('deliveryservices', dsId).one('regexes', regexId).remove()
+			.then(
+				function() {
+					messageModel.setMessages([ { level: 'success', text: 'Regex deleted' } ], true);
+				},
+				function(fault) {
+					messageModel.setMessages(fault.data.alerts, true);
+				}
+			);
+	};
+
+};
+
+DeliveryServiceRegexService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
+module.exports = DeliveryServiceRegexService;


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/styles/theme.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/styles/theme.scss b/traffic_ops/experimental/ui/app/src/styles/theme.scss
deleted file mode 100644
index fc909aa..0000000
--- a/traffic_ops/experimental/ui/app/src/styles/theme.scss
+++ /dev/null
@@ -1,4159 +0,0 @@
-/*!
- * gentelella v1.3.0
- * https://colorlib.com/polygon/gentelella/index.html
- * Copyright (c) 2016 Aigars Silkalns & Colorlib
- * License: MIT
- */
-
-.daterangepicker .ranges li {
-  color: #73879C
-}
-.daterangepicker .ranges li.active,
-.daterangepicker .ranges li:hover {
-  background: #536A7F;
-  border: 1px solid #536A7F;
-  color: #fff
-}
-.daterangepicker .input-mini {
-  background-color: #eee;
-  border: 1px solid #ccc;
-  box-shadow: none !important
-}
-.daterangepicker .input-mini.active {
-  border: 1px solid #ccc
-}
-.daterangepicker select.monthselect,
-.daterangepicker select.yearselect,
-.daterangepicker select.hourselect,
-.daterangepicker select.minuteselect,
-.daterangepicker select.secondselect,
-.daterangepicker select.ampmselect {
-  font-size: 12px;
-  padding: 1px;
-  height: auto;
-  margin: 0;
-  cursor: default;
-  height: 30px;
-  border: 1px solid #ADB2B5;
-  line-height: 30px;
-  border-radius: 0px !important
-}
-.daterangepicker select.monthselect {
-  margin-right: 2%
-}
-.daterangepicker td.in-range {
-  background: #E4E7EA;
-  color: #73879C
-}
-.daterangepicker td.active,
-.daterangepicker td.active:hover {
-  background-color: #536A7F;
-  color: #fff
-}
-.daterangepicker th.available:hover {
-  background: #eee;
-  color: #34495E
-}
-.daterangepicker:before,
-.daterangepicker:after {
-  content: none
-}
-.daterangepicker .calendar.single {
-  margin: 0 0 4px 0
-}
-.daterangepicker .calendar.single .calendar-table {
-  width: 224px;
-  padding: 0 0 4px 0 !important
-}
-.daterangepicker .calendar.single .calendar-table thead tr:first-child th {
-  padding: 8px 5px
-}
-.daterangepicker .calendar.single .calendar-table thead th {
-  border-radius: 0
-}
-.daterangepicker.picker_1 {
-  color: #fff;
-  background: #34495E
-}
-.daterangepicker.picker_1 .calendar-table {
-  background: #34495E
-}
-.daterangepicker.picker_1 .calendar-table thead tr {
-  background: #213345
-}
-.daterangepicker.picker_1 .calendar-table thead tr:first-child {
-  background: #1ABB9C
-}
-.daterangepicker.picker_1 .calendar-table td.off {
-  background: #34495E;
-  color: #999
-}
-.daterangepicker.picker_1 .calendar-table td.available:hover {
-  color: #34495E
-}
-.daterangepicker.picker_2 .calendar-table thead tr {
-  color: #1ABB9C
-}
-.daterangepicker.picker_2 .calendar-table thead tr:first-child {
-  color: #73879C
-}
-.daterangepicker.picker_3 .calendar-table thead tr:first-child {
-  color: #fff;
-  background: #1ABB9C
-}
-.daterangepicker.picker_4 .calendar-table thead tr:first-child {
-  color: #fff;
-  background: #34495E
-}
-.daterangepicker.picker_4 .calendar-table td,
-.daterangepicker.picker_4 .calendar-table td.off {
-  background: #ECF0F1;
-  border: 1px solid #fff;
-  border-radius: 0
-}
-.daterangepicker.picker_4 .calendar-table td.active {
-  background: #34495E
-}
-.calendar-exibit .show-calendar {
-  float: none;
-  display: block;
-  position: relative;
-  background-color: #fff;
-  border: 1px solid #ccc;
-  margin-bottom: 20px;
-  border: 1px solid rgba(0, 0, 0, 0.15);
-  overflow: hidden
-}
-.calendar-exibit .show-calendar .calendar {
-  margin: 0 0 4px 0
-}
-.calendar-exibit .show-calendar.picker_1 {
-  background: #34495E
-}
-.calendar-exibit .calendar-table {
-  padding: 0 0 4px 0
-}
-.left_col {
-  background: #2A3F54
-}
-.nav-sm .container.body .col-md-3.left_col {
-  min-height: 100%;
-  width: 70px;
-  padding: 0;
-  z-index: 9999;
-  position: absolute
-}
-.nav-sm .container.body .col-md-3.left_col.menu_fixed {
-  position: fixed;
-  height: 100%
-}
-.nav-sm .container.body .col-md-3.left_col .mCSB_container,
-.nav-sm .container.body .col-md-3.left_col .mCustomScrollBox {
-  overflow: visible
-}
-.nav-sm .hidden-small {
-  visibility: hidden
-}
-.nav-sm .container.body .right_col {
-  padding: 10px 20px;
-  margin-left: 70px;
-  z-index: 2
-}
-.nav-sm .navbar.nav_title {
-  width: 70px
-}
-.nav-sm .navbar.nav_title a span {
-  display: none
-}
-.nav-sm .navbar.nav_title a i {
-  font-size: 27px;
-  margin: 13px 0 0 3px
-}
-.site_title i {
-  border: 1px solid #EAEAEA;
-  padding: 5px 6px;
-  border-radius: 50%
-}
-.nav-sm .main_container .top_nav {
-  display: block;
-  margin-left: 70px;
-  z-index: 2
-}
-.nav-sm .nav.side-menu li a {
-  text-align: center !important;
-  font-weight: 400;
-  font-size: 10px;
-  padding: 10px 5px
-}
-.nav-sm .nav.child_menu li.active,
-.nav-sm .nav.side-menu li.active-sm {
-  border-right: 5px solid #1ABB9C
-}
-.nav-sm ul.nav.child_menu ul,
-.nav-sm .nav.side-menu li.active-sm ul ul {
-  position: static;
-  width: 200px;
-  background: none
-}
-.nav-sm>.nav.side-menu>li.active-sm>a {
-  color: #1ABB9C !important
-}
-.nav-sm .nav.side-menu li a i.toggle-up {
-  display: none !important
-}
-.nav-sm .nav.side-menu li a i {
-  font-size: 25px !important;
-  text-align: center;
-  width: 100% !important;
-  margin-bottom: 5px
-}
-.nav-sm ul.nav.child_menu {
-  left: 100%;
-  position: absolute;
-  top: 0;
-  width: 210px;
-  z-index: 4000;
-  background: #3E5367;
-  display: none
-}
-.nav-sm ul.nav.child_menu li {
-  padding: 0 10px
-}
-.nav-sm ul.nav.child_menu li a {
-  text-align: left !important
-}
-.nav-sm .profile {
-  display: none
-}
-.menu_section {
-  margin-bottom: 35px
-}
-.menu_section h3 {
-  padding-left: 15px;
-  color: #fff;
-  text-transform: uppercase;
-  letter-spacing: .5px;
-  font-weight: bold;
-  font-size: 11px;
-  margin-bottom: 0;
-  margin-top: 0;
-  text-shadow: 1px 1px #000
-}
-.menu_section>ul {
-  margin-top: 10px
-}
-.profile_pic {
-  width: 35%;
-  float: left
-}
-.img-circle.profile_img {
-  width: 70%;
-  background: #fff;
-  margin-left: 15%;
-  z-index: 1000;
-  position: inherit;
-  margin-top: 20px;
-  border: 1px solid rgba(52, 73, 94, 0.44);
-  padding: 4px
-}
-.profile_info {
-  padding: 25px 10px 10px;
-  width: 65%;
-  float: left
-}
-.profile_info span {
-  font-size: 13px;
-  line-height: 30px;
-  color: #BAB8B8
-}
-.profile_info h2 {
-  font-size: 14px;
-  color: #ECF0F1;
-  margin: 0;
-  font-weight: 300
-}
-.profile.img_2 {
-  text-align: center
-}
-.profile.img_2 .profile_pic {
-  width: 100%
-}
-.profile.img_2 .profile_pic .img-circle.profile_img {
-  width: 50%;
-  margin: 10px 0 0
-}
-.profile.img_2 .profile_info {
-  padding: 15px 10px 0;
-  width: 100%;
-  margin-bottom: 10px;
-  float: left
-}
-.main_menu span.fa {
-  float: right;
-  text-align: center;
-  margin-top: 5px;
-  font-size: 10px;
-  min-width: inherit;
-  color: #C4CFDA
-}
-.active a span.fa {
-  text-align: right !important;
-  margin-right: 4px
-}
-.nav-sm .menu_section {
-  margin: 0
-}
-.nav-sm span.fa,
-.nav-sm .menu_section h3 {
-  display: none
-}
-.nav-sm li li span.fa {
-  display: inline-block
-}
-.nav_menu {
-  float: left;
-  background: #EDEDED;
-  border-bottom: 1px solid #D9DEE4;
-  margin-bottom: 10px;
-  width: 100%;
-  position: relative
-}
-@media (min-width: 480px) {
-  .nav_menu {
-    position: static
-  }
-}
-.nav-md .container.body .col-md-3.left_col {
-  min-height: 100%;
-  width: 230px;
-  padding: 0;
-  position: absolute;
-  display: -ms-flexbox;
-  display: flex;
-  z-index: 1
-}
-.nav-md .container.body .col-md-3.left_col.menu_fixed {
-  height: 100%;
-  position: fixed
-}
-body .container.body .right_col {
-  background: #F7F7F7
-}
-.nav-md .container.body .right_col {
-  padding: 10px 20px 0;
-  margin-left: 230px
-}
-.nav_title {
-  width: 230px;
-  float: left;
-  background: #2A3F54;
-  border-radius: 0;
-  height: 57px
-}
-@media (max-width: 991px) {
-  .nav-md .container.body .right_col,
-  .nav-md .container.body .top_nav {
-    width: 100%;
-    margin: 0
-  }
-  .nav-md .container.body .col-md-3.left_col {
-    display: none
-  }
-  .nav-md .container.body .right_col {
-    width: 100%;
-    padding-right: 0
-  }
-  .right_col {
-    padding: 10px !important
-  }
-}
-@media (max-width: 1200px) {
-  .x_title h2 {
-    width: 62%;
-    font-size: 17px
-  }
-  .tile,
-  .graph {
-    zoom: 85%;
-    height: inherit
-  }
-}
-@media (max-width: 1270px) and (min-width: 192px) {
-  .x_title h2 small {
-    display: none
-  }
-}
-.left_col .mCSB_scrollTools {
-  width: 6px
-}
-.left_col .mCSB_dragger {
-  max-height: 400px !important
-}
-.blue {
-  color: #3498DB
-}
-.purple {
-  color: #9B59B6
-}
-.green {
-  color: #1ABB9C
-}
-.aero {
-  color: #9CC2CB
-}
-.red {
-  color: #E74C3C
-}
-.dark {
-  color: #34495E
-}
-.border-blue {
-  border-color: #3498DB !important
-}
-.border-purple {
-  border-color: #9B59B6 !important
-}
-.border-green {
-  border-color: #1ABB9C !important
-}
-.border-aero {
-  border-color: #9CC2CB !important
-}
-.border-red {
-  border-color: #E74C3C !important
-}
-.border-dark {
-  border-color: #34495E !important
-}
-.bg-white {
-  background: #fff !important;
-  border: 1px solid #fff !important;
-  color: #73879C
-}
-.bg-green {
-  background: #1ABB9C !important;
-  border: 1px solid #1ABB9C !important;
-  color: #fff
-}
-.bg-red {
-  background: #E74C3C !important;
-  border: 1px solid #E74C3C !important;
-  color: #fff
-}
-.bg-blue {
-  background: #3498DB !important;
-  border: 1px solid #3498DB !important;
-  color: #fff
-}
-.bg-orange {
-  background: #F39C12 !important;
-  border: 1px solid #F39C12 !important;
-  color: #fff
-}
-.bg-purple {
-  background: #9B59B6 !important;
-  border: 1px solid #9B59B6 !important;
-  color: #fff
-}
-.bg-blue-sky {
-  background: #50C1CF !important;
-  border: 1px solid #50C1CF !important;
-  color: #fff
-}
-.container {
-  width: 100%;
-  padding: 0
-}
-.navbar-nav>li>a,
-.navbar-brand,
-.navbar-nav>li>a {
-  color: #fff !important
-}
-.top_nav .nav>li>a:focus,
-.top_nav .nav>li>a:hover,
-.top_nav .nav .open>a,
-.top_nav .nav .open>a:focus,
-.top_nav .nav .open>a:hover {
-  background: #D9DEE4
-}
-body {
-  color: #73879C;
-  background: #2A3F54;
-  font-family: "Helvetica Neue", Roboto, Arial, "Droid Sans", sans-serif;
-  font-size: 13px;
-  font-weight: 400;
-  line-height: 1.471
-}
-.main_container .top_nav {
-  display: block;
-  margin-left: 230px
-}
-.no-padding {
-  padding: 0 !important
-}
-.page-title {
-  width: 100%;
-  height: 65px;
-  padding: 10px 0
-}
-.page-title .title_left {
-  width: 45%;
-  float: left;
-  display: block
-}
-.page-title .title_left h3 {
-  margin: 9px 0
-}
-.page-title .title_right {
-  width: 55%;
-  float: left;
-  display: block
-}
-.page-title .title_right .pull-right {
-  margin: 10px 0
-}
-.fixed_height_320 {
-  height: 320px
-}
-.fixed_height_390 {
-  height: 390px
-}
-.fixed_height_200 {
-  height: 200px
-}
-.overflow_hidden {
-  overflow: hidden
-}
-.progress-bar-dark {
-  background-color: #34495E !important
-}
-.progress-bar-gray {
-  background-color: #BDC3C7 !important
-}
-table.no-margin .progress {
-  margin-bottom: 0
-}
-.main_content {
-  padding: 10px 20px
-}
-.col-md-55 {
-  width: 50%;
-  margin-bottom: 10px
-}
-@media (min-width: 768px) {
-  .col-md-55 {
-    width: 20%
-  }
-}
-@media (min-width: 992px) {
-  .col-md-55 {
-    width: 20%
-  }
-}
-@media (min-width: 1200px) {
-  .col-md-55 {
-    width: 20%
-  }
-}
-@media (min-width: 192px) and (max-width: 1270px) {
-  table.tile_info span.right {
-    margin-right: 7px;
-    float: left
-  }
-}
-.center-margin {
-  margin: 0 auto;
-  float: none !important
-}
-.col-md-55,
-.col-xs-1,
-.col-sm-1,
-.col-md-1,
-.col-lg-1,
-.col-xs-2,
-.col-sm-2,
-.col-md-2,
-.col-lg-2,
-.col-xs-3,
-.col-sm-3,
-.col-md-3,
-.col-lg-3,
-.col-xs-4,
-.col-sm-4,
-.col-md-4,
-.col-lg-4,
-.col-xs-5,
-.col-sm-5,
-.col-md-5,
-.col-lg-5,
-.col-xs-6,
-.col-sm-6,
-.col-md-6,
-.col-lg-6,
-.col-xs-7,
-.col-sm-7,
-.col-md-7,
-.col-lg-7,
-.col-xs-8,
-.col-sm-8,
-.col-md-8,
-.col-lg-8,
-.col-xs-9,
-.col-sm-9,
-.col-md-9,
-.col-lg-9,
-.col-xs-10,
-.col-sm-10,
-.col-md-10,
-.col-lg-10,
-.col-xs-11,
-.col-sm-11,
-.col-md-11,
-.col-lg-11,
-.col-xs-12,
-.col-sm-12,
-.col-md-12,
-.col-lg-12 {
-  position: relative;
-  min-height: 1px;
-  float: left;
-  padding-right: 10px;
-  padding-left: 10px
-}
-.row {
-  margin-right: -10px;
-  margin-left: -10px
-}
-.grid_slider .col-md-6 {
-  padding: 0 40px
-}
-h1,
-.h1,
-h2,
-.h2,
-h3,
-.h3 {
-  margin-top: 10px;
-  margin-bottom: 10px
-}
-a {
-  color: #5A738E;
-  text-decoration: none
-}
-a,
-a:visited,
-a:focus,
-a:active,
-:visited,
-:focus,
-:active,
-.btn:focus,
-.btn:active:focus,
-.btn.active:focus,
-.btn.focus,
-.btn:active.focus,
-.btn.active.focus {
-  outline: 0
-}
-a:hover,
-a:focus {
-  text-decoration: none
-}
-.navbar {
-  margin-bottom: 0
-}
-.navbar-header {
-  background: #34495E
-}
-.navbar-right {
-  margin-right: 0
-}
-.top_nav .navbar-right {
-  margin: 0;
-  width: 70%;
-  float: right
-}
-.top_nav .navbar-right li {
-  display: inline-block;
-  float: right;
-  position: static
-}
-@media (min-width: 480px) {
-  .top_nav .navbar-right li {
-    position: relative
-  }
-}
-.top_nav .dropdown-menu li {
-  width: 100%
-}
-.top_nav .dropdown-menu li a {
-  width: 100%;
-  padding: 12px 20px
-}
-.top_nav li a i {
-  font-size: 15px
-}
-.navbar-static-top {
-  position: fixed;
-  top: 0;
-  width: 100%
-}
-.sidebar-header {
-  border-bottom: 0;
-  margin-top: 46px
-}
-.sidebar-header:first-of-type {
-  margin-top: 0
-}
-.nav.side-menu>li {
-  position: relative;
-  display: block;
-  cursor: pointer
-}
-.nav.side-menu>li>a {
-  margin-bottom: 6px
-}
-.nav.side-menu>li>a:hover {
-  color: #F2F5F7 !important
-}
-.nav.side-menu>li>a:hover,
-.nav>li>a:focus {
-  text-decoration: none;
-  background: transparent
-}
-.nav.child_menu {
-  display: none
-}
-.nav.child_menu li:hover,
-.nav.child_menu li.active {
-  background-color: rgba(255, 255, 255, 0.06)
-}
-.nav.child_menu li {
-  padding-left: 36px
-}
-.nav-md ul.nav.child_menu li:before {
-  background: #425668;
-  bottom: auto;
-  content: "";
-  height: 8px;
-  left: 23px;
-  margin-top: 15px;
-  position: absolute;
-  right: auto;
-  width: 8px;
-  z-index: 1;
-  border-radius: 50%
-}
-.nav-md ul.nav.child_menu li:after {
-  border-left: 1px solid #425668;
-  bottom: 0;
-  content: "";
-  left: 27px;
-  position: absolute;
-  top: 0
-}
-.nav.side-menu>li>a,
-.nav.child_menu>li>a {
-  color: #E7E7E7;
-  font-weight: 500
-}
-.nav.child_menu li li:hover,
-.nav.child_menu li li.active {
-  background: none
-}
-.nav.child_menu li li a:hover,
-.nav.child_menu li li a.active {
-  color: #fff
-}
-.nav>li>a {
-  position: relative;
-  display: block;
-  padding: 13px 15px 12px
-}
-.nav.side-menu>li.current-page,
-.nav.side-menu>li.active {
-  border-right: 5px solid #1ABB9C
-}
-.nav li.current-page {
-  background: rgba(255, 255, 255, 0.05)
-}
-.nav li li li.current-page {
-  background: none
-}
-.nav li li.current-page a {
-  color: #fff
-}
-.nav.side-menu>li.active>a {
-  text-shadow: rgba(0, 0, 0, 0.25) 0 -1px 0;
-  background: linear-gradient(#334556, #2C4257), #2A3F54;
-  box-shadow: rgba(0, 0, 0, 0.25) 0 1px 0, inset rgba(255, 255, 255, 0.16) 0 1px 0
-}
-.navbar-brand,
-.navbar-nav>li>a {
-  font-weight: 500;
-  color: #ECF0F1 !important;
-  margin-left: 0 !important;
-  line-height: 32px
-}
-.site_title {
-  text-overflow: ellipsis;
-  overflow: hidden;
-  font-weight: 400;
-  font-size: 22px;
-  width: 100%;
-  color: #ECF0F1 !important;
-  margin-left: 0 !important;
-  line-height: 59px;
-  display: block;
-  height: 55px;
-  margin: 0;
-  padding-left: 10px
-}
-.site_title:hover,
-.site_title:focus {
-  text-decoration: none
-}
-.nav.navbar-nav>li>a {
-  color: #515356 !important
-}
-.nav.top_menu>li>a {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  color: #34495E !important
-}
-.nav>li>a:hover,
-.nav>li>a:focus {
-  background-color: transparent
-}
-.top_search {
-  padding: 0
-}
-.top_search .form-control {
-  border-right: 0;
-  box-shadow: inset 0 1px 0px rgba(0, 0, 0, 0.075);
-  border-radius: 25px 0px 0px 25px;
-  padding-left: 20px;
-  border: 1px solid rgba(221, 226, 232, 0.49)
-}
-.top_search .form-control:focus {
-  border: 1px solid rgba(221, 226, 232, 0.49);
-  border-right: 0
-}
-.top_search .input-group-btn button {
-  border-radius: 0px 25px 25px 0px;
-  border: 1px solid rgba(221, 226, 232, 0.49);
-  border-left: 0;
-  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-  color: #93A2B2;
-  margin-bottom: 0 !important
-}
-.toggle {
-  float: left;
-  margin: 0;
-  padding-top: 16px;
-  width: 70px
-}
-.toggle a {
-  padding: 15px 15px 0;
-  margin: 0;
-  cursor: pointer
-}
-.toggle a i {
-  font-size: 26px
-}
-.nav.child_menu>li>a {
-  color: rgba(255, 255, 255, 0.75);
-  font-size: 12px;
-  padding: 9px
-}
-.panel_toolbox {
-  float: right;
-  min-width: 70px
-}
-.panel_toolbox>li {
-  float: left;
-  cursor: pointer
-}
-.panel_toolbox>li>a {
-  padding: 5px;
-  color: #C5C7CB;
-  font-size: 14px
-}
-.panel_toolbox>li>a:hover {
-  background: #F5F7FA
-}
-.line_30 {
-  line-height: 30px
-}
-.main_menu_side {
-  padding: 0
-}
-.bs-docs-sidebar .nav>li>a {
-  display: block;
-  padding: 4px 6px
-}
-footer {
-  background: #fff;
-  padding: 15px 20px;
-  display: block
-}
-.nav-sm footer {
-  margin-left: 70px
-}
-.footer_fixed footer {
-  position: fixed;
-  left: 0px;
-  bottom: 0px;
-  width: 100%
-}
-@media (min-width: 768px) {
-  .footer_fixed footer {
-    margin-left: 0
-  }
-}
-@media (min-width: 768px) {
-  .footer_fixed .nav-sm footer {
-    margin-left: 0
-  }
-}
-.tile-stats.sparkline {
-  padding: 10px;
-  text-align: center
-}
-.jqstooltip {
-  background: #34495E !important;
-  width: 30px !important;
-  height: 22px !important;
-  text-decoration: none
-}
-.tooltip {
-  display: block !important
-}
-.tiles {
-  border-top: 1px solid #ccc;
-  margin-top: 15px;
-  padding-top: 5px;
-  margin-bottom: 0
-}
-.tile {
-  overflow: hidden
-}
-.top_tiles {
-  margin-bottom: 0
-}
-.top_tiles .tile h2 {
-  font-size: 30px;
-  line-height: 30px;
-  margin: 3px 0 7px;
-  font-weight: bold
-}
-article.media {
-  width: 100%
-}
-*,
-*:before,
-*:after {
-  box-sizing: border-box
-}
-#integration-list {
-  width: 100%;
-  margin: 0 auto;
-  display: table
-}
-#integration-list ul {
-  padding: 0;
-  margin: 20px 0;
-  color: #555
-}
-#integration-list ul>li {
-  list-style: none;
-  border-top: 1px solid #ddd;
-  display: block;
-  padding: 15px;
-  overflow: hidden
-}
-#integration-list ul:last-child {
-  border-bottom: 1px solid #ddd
-}
-#integration-list ul>li:hover {
-  background: #efefef
-}
-.expand {
-  display: block;
-  text-decoration: none;
-  color: #555;
-  cursor: pointer
-}
-.expand h2 {
-  width: 85%;
-  float: left
-}
-h2 {
-  font-size: 18px;
-  font-weight: 400
-}
-#left,
-#right {
-  display: table
-}
-#sup {
-  display: table-cell;
-  vertical-align: middle;
-  width: 80%
-}
-.detail a {
-  text-decoration: none;
-  color: #C0392B;
-  border: 1px solid #C0392B;
-  padding: 6px 10px 5px;
-  font-size: 13px;
-  margin-right: 7px
-}
-.detail {
-  margin: 10px 0 10px 0px;
-  display: none;
-  line-height: 22px;
-  height: 150px
-}
-.detail span {
-  margin: 0
-}
-.right-arrow {
-  width: 10px;
-  float: right;
-  font-weight: bold;
-  font-size: 20px
-}
-.accordion .panel {
-  margin-bottom: 5px;
-  border-radius: 0;
-  border-bottom: 1px solid #efefef
-}
-.accordion .panel-heading {
-  background: #F2F5F7;
-  padding: 13px;
-  width: 100%;
-  display: block
-}
-.accordion .panel:hover {
-  background: #F2F5F7
-}
-.x_panel {
-  position: relative;
-  width: 100%;
-  margin-bottom: 10px;
-  padding: 10px 17px;
-  display: inline-block;
-  background: #fff;
-  border: 1px solid #E6E9ED;
-  -webkit-column-break-inside: avoid;
-  -moz-column-break-inside: avoid;
-  column-break-inside: avoid;
-  opacity: 1;
-  transition: all .2s ease
-}
-.x_title {
-  border-bottom: 2px solid #E6E9ED;
-  padding: 1px 5px 6px;
-  margin-bottom: 10px
-}
-.x_title .filter {
-  width: 40%;
-  float: right
-}
-.x_title h2 {
-  margin: 5px 0 6px;
-  float: left;
-  display: block;
-  text-overflow: ellipsis;
-  overflow: hidden;
-  white-space: nowrap
-}
-.x_title h2 small {
-  margin-left: 10px
-}
-.x_title span {
-  color: #BDBDBD
-}
-.x_content {
-  padding: 0 5px 6px;
-  position: relative;
-  width: 100%;
-  float: left;
-  clear: both;
-  margin-top: 5px
-}
-.x_content h4 {
-  font-size: 16px;
-  font-weight: 500
-}
-legend {
-  padding-bottom: 7px
-}
-.demo-placeholder {
-  height: 280px
-}
-.profile_details:nth-child(3n) {
-  clear: both
-}
-.profile_details .profile_view {
-  display: inline-block;
-  padding: 10px 0 0;
-  background: #fff
-}
-.profile_details .profile_view .divider {
-  border-top: 1px solid #e5e5e5;
-  padding-top: 5px;
-  margin-top: 5px
-}
-.profile_details .profile_view .ratings {
-  margin-bottom: 0
-}
-.profile_details .profile_view .bottom {
-  background: #F2F5F7;
-  padding: 9px 0;
-  border-top: 1px solid #E6E9ED
-}
-.profile_details .profile_view .left {
-  margin-top: 20px
-}
-.profile_details .profile_view .left p {
-  margin-bottom: 3px
-}
-.profile_details .profile_view .right {
-  margin-top: 0px;
-  padding: 10px
-}
-.profile_details .profile_view .img-circle {
-  border: 1px solid #E6E9ED;
-  padding: 2px
-}
-.profile_details .profile_view h2 {
-  margin: 5px 0
-}
-.profile_details .profile_view .ratings {
-  text-align: left;
-  font-size: 16px
-}
-.profile_details .profile_view .brief {
-  margin: 0;
-  font-weight: 300
-}
-.profile_details .profile_left {
-  background: white
-}
-.pagination.pagination-split li {
-  display: inline-block;
-  margin-right: 3px
-}
-.pagination.pagination-split li a {
-  border-radius: 4px;
-  color: #768399;
-  -moz-border-radius: 4px;
-  -webkit-border-radius: 4px
-}
-table.tile h3,
-table.tile h4,
-table.tile span {
-  font-weight: bold;
-  vertical-align: middle !important
-}
-table.tile th,
-table.tile td {
-  text-align: center
-}
-table.tile th {
-  border-bottom: 1px solid #E6ECEE
-}
-table.tile td {
-  padding: 5px 0
-}
-table.tile td ul {
-  text-align: left;
-  padding-left: 0
-}
-table.tile td ul li {
-  list-style: none;
-  width: 100%
-}
-table.tile td ul li a {
-  width: 100%
-}
-table.tile td ul li a big {
-  right: 0;
-  float: right;
-  margin-right: 13px
-}
-table.tile_info {
-  width: 100%
-}
-table.tile_info td {
-  text-align: left;
-  padding: 1px;
-  font-size: 15px
-}
-table.tile_info td p {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  margin: 0;
-  line-height: 28px
-}
-table.tile_info td i {
-  margin-right: 8px;
-  font-size: 17px;
-  float: left;
-  width: 18px;
-  line-height: 28px
-}
-table.tile_info td:first-child {
-  width: 83%
-}
-td span {
-  line-height: 28px
-}
-.sidebar-widget {
-  overflow: hidden
-}
-.error-number {
-  font-size: 90px;
-  line-height: 90px;
-  margin: 20px 0
-}
-.col-middle {
-  margin-top: 5%
-}
-.mid_center {
-  width: 370px;
-  margin: 0 auto;
-  text-align: center;
-  padding: 10px 20px
-}
-h3.degrees {
-  font-size: 22px;
-  font-weight: 400;
-  text-align: center
-}
-.degrees:after {
-  content: "o";
-  position: relative;
-  top: -12px;
-  font-size: 13px;
-  font-weight: 300
-}
-.daily-weather .day {
-  font-size: 14px;
-  border-top: 2px solid rgba(115, 135, 156, 0.36);
-  text-align: center;
-  border-bottom: 2px solid rgba(115, 135, 156, 0.36);
-  padding: 5px 0
-}
-.weather-days .col-sm-2 {
-  overflow: hidden;
-  width: 16.66666667%
-}
-.weather .row {
-  margin-bottom: 0
-}
-.bulk-actions {
-  display: none
-}
-table.countries_list {
-  width: 100%
-}
-table.countries_list td {
-  padding: 0 10px;
-  line-height: 30px;
-  border-top: 1px solid #eeeeee
-}
-.dataTables_paginate a {
-  padding: 6px 9px !important;
-  background: #ddd !important;
-  border-color: #ddd !important
-}
-.paging_full_numbers a.paginate_active {
-  background-color: rgba(38, 185, 154, 0.59) !important;
-  border-color: rgba(38, 185, 154, 0.59) !important
-}
-button.DTTT_button,
-div.DTTT_button,
-a.DTTT_button {
-  border: 1px solid #E7E7E7 !important;
-  background: #E7E7E7 !important;
-  box-shadow: none !important
-}
-table.jambo_table {
-  border: 1px solid rgba(221, 221, 221, 0.78)
-}
-table.jambo_table thead {
-  background: rgba(52, 73, 94, 0.94);
-  color: #ECF0F1
-}
-table.jambo_table tbody tr:hover td {
-  background: rgba(38, 185, 154, 0.07);
-  border-top: 1px solid rgba(38, 185, 154, 0.11);
-  border-bottom: 1px solid rgba(38, 185, 154, 0.11)
-}
-table.jambo_table tbody tr.selected {
-  background: rgba(38, 185, 154, 0.16)
-}
-table.jambo_table tbody tr.selected td {
-  border-top: 1px solid rgba(38, 185, 154, 0.4);
-  border-bottom: 1px solid rgba(38, 185, 154, 0.4)
-}
-.dataTables_paginate a {
-  background: #ff0000
-}
-.dataTables_wrapper {
-  position: relative;
-  clear: both;
-  zoom: 1
-}
-.dataTables_processing {
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  width: 250px;
-  height: 30px;
-  margin-left: -125px;
-  margin-top: -15px;
-  padding: 14px 0 2px 0;
-  border: 1px solid #ddd;
-  text-align: center;
-  color: #999;
-  font-size: 14px;
-  background-color: white
-}
-.dataTables_length {
-  width: 40%;
-  float: left
-}
-.dataTables_filter {
-  width: 50%;
-  float: right;
-  text-align: right
-}
-.dataTables_info {
-  width: 60%;
-  float: left
-}
-.dataTables_paginate {
-  float: right;
-  text-align: right
-}
-table.dataTable th.focus,
-table.dataTable td.focus {
-  outline: 2px solid #1ABB9C !important;
-  outline-offset: -1px
-}
-table.display {
-  margin: 0 auto;
-  clear: both;
-  width: 100%
-}
-table.display thead th {
-  padding: 8px 18px 8px 10px;
-  border-bottom: 1px solid black;
-  font-weight: bold;
-  cursor: pointer
-}
-table.display tfoot th {
-  padding: 3px 18px 3px 10px;
-  border-top: 1px solid black;
-  font-weight: bold
-}
-table.display tr.heading2 td {
-  border-bottom: 1px solid #aaa
-}
-table.display td {
-  padding: 3px 10px
-}
-table.display td.center {
-  text-align: center
-}
-table.display thead th:active,
-table.display thead td:active {
-  outline: none
-}
-.dataTables_scroll {
-  clear: both
-}
-.dataTables_scrollBody {
-  *margin-top: -1px;
-  -webkit-overflow-scrolling: touch
-}
-.top .dataTables_info {
-  float: none
-}
-.clear {
-  clear: both
-}
-.dataTables_empty {
-  text-align: center
-}
-tfoot input {
-  margin: 0.5em 0;
-  width: 100%;
-  color: #444
-}
-tfoot input.search_init {
-  color: #999
-}
-td.group {
-  background-color: #d1cfd0;
-  border-bottom: 2px solid #A19B9E;
-  border-top: 2px solid #A19B9E
-}
-td.details {
-  background-color: #d1cfd0;
-  border: 2px solid #A19B9E
-}
-.example_alt_pagination div.dataTables_info {
-  width: 40%
-}
-.paging_full_numbers {
-  width: 400px;
-  height: 22px;
-  line-height: 22px
-}
-.paging_full_numbers a:active {
-  outline: none
-}
-.paging_full_numbers a:hover {
-  text-decoration: none
-}
-.paging_full_numbers a.paginate_button,
-.paging_full_numbers a.paginate_active {
-  border: 1px solid #aaa;
-  -webkit-border-radius: 5px;
-  -moz-border-radius: 5px;
-  padding: 2px 5px;
-  margin: 0 3px;
-  cursor: pointer
-}
-.paging_full_numbers a.paginate_button {
-  background-color: #ddd
-}
-.paging_full_numbers a.paginate_button:hover {
-  background-color: #ccc;
-  text-decoration: none !important
-}
-.paging_full_numbers a.paginate_active {
-  background-color: #99B3FF
-}
-table.display tr.even.row_selected td {
-  background-color: #B0BED9
-}
-table.display tr.odd.row_selected td {
-  background-color: #9FAFD1
-}
-div.box {
-  height: 100px;
-  padding: 10px;
-  overflow: auto;
-  border: 1px solid #8080FF;
-  background-color: #E5E5FF
-}
-ul.msg_list li {
-  background: #f7f7f7;
-  padding: 5px;
-  display: -ms-flexbox;
-  display: flex;
-  margin: 6px 6px 0;
-  width: 96% !important
-}
-ul.msg_list li:last-child {
-  margin-bottom: 6px;
-  padding: 10px
-}
-ul.msg_list li a {
-  padding: 3px 5px !important
-}
-ul.msg_list li a .image img {
-  border-radius: 2px 2px 2px 2px;
-  -webkit-border-radius: 2px 2px 2px 2px;
-  float: left;
-  margin-right: 10px;
-  width: 11%
-}
-ul.msg_list li a .time {
-  font-size: 11px;
-  font-style: italic;
-  font-weight: bold;
-  position: absolute;
-  right: 35px
-}
-ul.msg_list li a .message {
-  display: block !important;
-  font-size: 11px
-}
-.dropdown-menu.msg_list span {
-  white-space: normal
-}
-.dropdown-menu {
-  border: medium none;
-  box-shadow: none;
-  display: none;
-  float: left;
-  font-size: 12px;
-  left: 0;
-  list-style: none outside none;
-  padding: 0;
-  position: absolute;
-  text-shadow: none;
-  top: 100%;
-  z-index: 9998;
-  border: 1px solid #D9DEE4;
-  border-top-left-radius: 0;
-  border-top-right-radius: 0
-}
-.dropdown-menu>li>a {
-  color: #5A738E
-}
-.navbar-nav .open .dropdown-menu {
-  position: absolute;
-  background: #fff;
-  margin-top: 0;
-  border: 1px solid #D9DEE4;
-  -webkit-box-shadow: none;
-  right: 0;
-  left: auto;
-  width: 220px
-}
-.navbar-nav .open .dropdown-menu.msg_list {
-  width: 300px
-}
-.info-number .badge {
-  font-size: 10px;
-  font-weight: normal;
-  line-height: 13px;
-  padding: 2px 6px;
-  position: absolute;
-  right: 2px;
-  top: 8px
-}
-ul.to_do {
-  padding: 0
-}
-ul.to_do li {
-  background: #f3f3f3;
-  border-radius: 3px;
-  position: relative;
-  padding: 7px;
-  margin-bottom: 5px;
-  list-style: none
-}
-ul.to_do p {
-  margin: 0
-}
-.dashboard-widget {
-  background: #f6f6f6;
-  border-top: 5px solid #79C3DF;
-  border-radius: 3px;
-  padding: 5px 10px 10px
-}
-.dashboard-widget .dashboard-widget-title {
-  font-weight: normal;
-  border-bottom: 1px solid #c1cdcd;
-  margin: 0 0 10px 0;
-  padding-bottom: 5px;
-  padding-left: 40px;
-  line-height: 30px
-}
-.dashboard-widget .dashboard-widget-title i {
-  font-size: 100%;
-  margin-left: -35px;
-  margin-right: 10px;
-  color: #33a1c9;
-  padding: 3px 6px;
-  border: 1px solid #abd9ea;
-  border-radius: 5px;
-  background: #fff
-}
-ul.quick-list {
-  width: 45%;
-  padding-left: 0;
-  display: inline-block
-}
-ul.quick-list li {
-  padding-left: 10px;
-  list-style: none;
-  margin: 0;
-  padding-bottom: 6px;
-  padding-top: 4px;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden
-}
-ul.quick-list li i {
-  padding-right: 10px;
-  color: #757679
-}
-.dashboard-widget-content {
-  padding-top: 9px
-}
-.dashboard-widget-content .sidebar-widget {
-  width: 50%;
-  display: inline-block;
-  vertical-align: top;
-  background: #fff;
-  border: 1px solid #abd9ea;
-  border-radius: 5px;
-  text-align: center;
-  float: right;
-  padding: 2px;
-  margin-top: 10px
-}
-.widget_summary {
-  width: 100%;
-  display: -ms-inline-flexbox;
-  display: inline-flex
-}
-.widget_summary .w_left {
-  float: left;
-  text-align: left
-}
-.widget_summary .w_center {
-  float: left
-}
-.widget_summary .w_right {
-  float: left;
-  text-align: right
-}
-.widget_summary .w_right span {
-  font-size: 20px
-}
-.w_20 {
-  width: 20%
-}
-.w_25 {
-  width: 25%
-}
-.w_55 {
-  width: 55%
-}
-h5.graph_title {
-  text-align: left;
-  margin-left: 10px
-}
-h5.graph_title i {
-  margin-right: 10px;
-  font-size: 17px
-}
-span.right {
-  float: right;
-  font-size: 14px !important
-}
-.tile_info a {
-  text-overflow: ellipsis
-}
-.sidebar-footer {
-  bottom: 0px;
-  clear: both;
-  display: block;
-  padding: 5px 0 0 0;
-  position: fixed;
-  width: 230px;
-  background: #2A3F54;
-  z-index:999;
-}
-.sidebar-footer a {
-  padding: 7px 0 3px;
-  text-align: center;
-  width: 25%;
-  font-size: 17px;
-  display: block;
-  float: left;
-  background: #172D44;
-  cursor: pointer;
-}
-.sidebar-footer a:hover {
-  background: #425567
-}
-.tile_count {
-  margin-bottom: 20px;
-  margin-top: 20px
-}
-.tile_count .tile_stats_count {
-  border-bottom: 1px solid #D9DEE4;
-  padding: 0 10px 0 20px;
-  text-overflow: ellipsis;
-  overflow: hidden;
-  white-space: nowrap;
-  position: relative
-}
-@media (min-width: 992px) {
-  footer {
-    margin-left: 230px
-  }
-}
-@media (min-width: 992px) {
-  .tile_count .tile_stats_count {
-    margin-bottom: 10px;
-    border-bottom: 0;
-    padding-bottom: 10px
-  }
-}
-.tile_count .tile_stats_count:before {
-  content: "";
-  position: absolute;
-  left: 0;
-  height: 65px;
-  border-left: 2px solid #ADB2B5;
-  margin-top: 10px
-}
-.tile_count .tile_stats_count .count {
-  font-size: 25px;
-  line-height: 47px;
-  font-weight: 600
-}
-.tile_count .tile_stats_count span {
-  font-size: 12px
-}
-@media (min-width: 768px) {
-  .tile_count .tile_stats_count span {
-    font-size: 13px
-  }
-}
-.tile_count .tile_stats_count .count_bottom i {
-  width: 12px
-}
-.dashboard_graph {
-  background: #fff;
-  padding: 7px 10px
-}
-.dashboard_graph .col-md-9,
-.dashboard_graph .col-md-3 {
-  padding: 0
-}
-a.user-profile {
-  color: #5E6974 !important
-}
-.user-profile img {
-  width: 29px;
-  height: 29px;
-  border-radius: 50%;
-  margin-right: 10px
-}
-ul.top_profiles {
-  height: 330px;
-  width: 100%
-}
-ul.top_profiles li {
-  margin: 0;
-  padding: 3px 5px
-}
-ul.top_profiles li:nth-child(odd) {
-  background-color: #eee
-}
-.media .profile_thumb {
-  border: 1px solid;
-  width: 50px;
-  height: 50px;
-  margin: 5px 10px 5px 0;
-  border-radius: 50%;
-  padding: 9px 12px
-}
-.media .profile_thumb i {
-  font-size: 30px
-}
-.media .date {
-  background: #ccc;
-  width: 52px;
-  margin-right: 10px;
-  border-radius: 10px;
-  padding: 5px
-}
-.media .date .month {
-  margin: 0;
-  text-align: center;
-  color: #fff
-}
-.media .date .day {
-  text-align: center;
-  color: #fff;
-  font-size: 27px;
-  margin: 0;
-  line-height: 27px;
-  font-weight: bold
-}
-.event .media-body a.title {
-  font-weight: bold
-}
-.event .media-body p {
-  margin-bottom: 0
-}
-h4.graph_title {
-  margin: 7px;
-  text-align: center
-}
-.fontawesome-icon-list .fa-hover a:hover {
-  background-color: #ddd;
-  color: #fff;
-  text-decoration: none
-}
-.fontawesome-icon-list .fa-hover a {
-  display: block;
-  line-height: 32px;
-  height: 32px;
-  padding-left: 10px;
-  border-radius: 4px
-}
-.fontawesome-icon-list .fa-hover a:hover .fa {
-  font-size: 28px;
-  vertical-align: -6px
-}
-.fontawesome-icon-list .fa-hover a .fa {
-  width: 32px;
-  font-size: 16px;
-  display: inline-block;
-  text-align: right;
-  margin-right: 10px
-}
-.main_menu .fa {
-  width: 26px;
-  opacity: .99;
-  display: inline-block;
-  font-family: FontAwesome;
-  font-style: normal;
-  font-weight: normal;
-  font-size: 18px;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale
-}
-.tile-stats {
-  position: relative;
-  display: block;
-  margin-bottom: 12px;
-  border: 1px solid #E4E4E4;
-  -webkit-border-radius: 5px;
-  overflow: hidden;
-  padding-bottom: 5px;
-  -webkit-background-clip: padding-box;
-  -moz-border-radius: 5px;
-  -moz-background-clip: padding;
-  border-radius: 5px;
-  background-clip: padding-box;
-  background: #FFF;
-  transition: all 300ms ease-in-out
-}
-.tile-stats:hover .icon i {
-  animation-name: tansformAnimation;
-  animation-duration: .5s;
-  animation-iteration-count: 1;
-  color: rgba(58, 58, 58, 0.41);
-  animation-timing-function: ease;
-  animation-fill-mode: forwards;
-  -webkit-animation-name: tansformAnimation;
-  -webkit-animation-duration: .5s;
-  -webkit-animation-iteration-count: 1;
-  -webkit-animation-timing-function: ease;
-  -webkit-animation-fill-mode: forwards;
-  -moz-animation-name: tansformAnimation;
-  -moz-animation-duration: .5s;
-  -moz-animation-iteration-count: 1;
-  -moz-animation-timing-function: ease;
-  -moz-animation-fill-mode: forwards
-}
-.tile-stats .icon {
-  width: 20px;
-  height: 20px;
-  color: #BAB8B8;
-  position: absolute;
-  right: 53px;
-  top: 22px;
-  z-index: 1
-}
-.tile-stats .icon i {
-  margin: 0;
-  font-size: 60px;
-  line-height: 0;
-  vertical-align: bottom;
-  padding: 0
-}
-.tile-stats .count {
-  font-size: 38px;
-  font-weight: bold;
-  line-height: 1.65857
-}
-.tile-stats .count,
-.tile-stats h3,
-.tile-stats p {
-  position: relative;
-  margin: 0;
-  margin-left: 10px;
-  z-index: 5;
-  padding: 0
-}
-.tile-stats h3 {
-  color: #BAB8B8
-}
-.tile-stats p {
-  margin-top: 5px;
-  font-size: 12px
-}
-.tile-stats>.dash-box-footer {
-  position: relative;
-  text-align: center;
-  margin-top: 5px;
-  padding: 3px 0;
-  color: #fff;
-  color: rgba(255, 255, 255, 0.8);
-  display: block;
-  z-index: 10;
-  background: rgba(0, 0, 0, 0.1);
-  text-decoration: none
-}
-.tile-stats>.dash-box-footer:hover {
-  color: #fff;
-  background: rgba(0, 0, 0, 0.15)
-}
-.tile-stats>.dash-box-footer:hover {
-  color: #fff;
-  background: rgba(0, 0, 0, 0.15)
-}
-table.tile_info {
-  padding: 10px 15px
-}
-table.tile_info span.right {
-  margin-right: 0;
-  float: right;
-  position: absolute;
-  right: 4%
-}
-.tile:hover {
-  text-decoration: none
-}
-.tile_header {
-  border-bottom: transparent;
-  padding: 7px 15px;
-  margin-bottom: 15px;
-  background: #E7E7E7
-}
-.tile_head h4 {
-  margin-top: 0;
-  margin-bottom: 5px
-}
-.tiles-bottom {
-  padding: 5px 10px;
-  margin-top: 10px;
-  background: rgba(194, 194, 194, 0.3);
-  text-align: left
-}
-a.star {
-  color: #428bca !important
-}
-.mail_content {
-  background: none repeat scroll 0 0 #FFFFFF;
-  border-radius: 4px;
-  margin-top: 20px;
-  min-height: 500px;
-  padding: 10px 11px;
-  width: 100%
-}
-.list-btn-mail {
-  margin-bottom: 15px
-}
-.list-btn-mail.active {
-  border-bottom: 1px solid #39B3D7;
-  padding: 0 0 14px
-}
-.list-btn-mail>i {
-  float: left;
-  font-size: 18px;
-  font-style: normal;
-  width: 33px
-}
-.list-btn-mail>.cn {
-  background: none repeat scroll 0 0 #39B3D7;
-  border-radius: 12px;
-  color: #FFFFFF;
-  float: right;
-  font-style: normal;
-  padding: 0 5px
-}
-.button-mail {
-  margin: 0 0 15px !important;
-  text-align: left;
-  width: 100%
-}
-button,
-.buttons,
-.btn,
-.modal-footer .btn+.btn {
-  margin-bottom: 5px;
-  margin-right: 5px
-}
-.btn-group-vertical .btn,
-.btn-group .btn {
-  margin-bottom: 0;
-  margin-right: 0
-}
-.mail_list_column {
-  border-left: 1px solid #DBDBDB
-}
-.mail_view {
-  border-left: 1px solid #DBDBDB
-}
-.mail_list {
-  width: 100%;
-  border-bottom: 1px solid #DBDBDB;
-  margin-bottom: 2px;
-  display: inline-block
-}
-.mail_list .left {
-  width: 5%;
-  float: left;
-  margin-right: 3%
-}
-.mail_list .right {
-  width: 90%;
-  float: left
-}
-.mail_list h3 {
-  font-size: 15px;
-  font-weight: bold;
-  margin: 0px 0 6px
-}
-.mail_list h3 small {
-  float: right;
-  color: #ADABAB;
-  font-size: 11px;
-  line-height: 20px
-}
-.mail_list .badge {
-  padding: 3px 6px;
-  font-size: 8px;
-  background: #BAB7B7
-}
-@media (max-width: 767px) {
-  .mail_list {
-    margin-bottom: 5px;
-    display: inline-block
-  }
-}
-.mail_heading h4 {
-  font-size: 18px;
-  border-bottom: 1px solid #ddd;
-  padding-bottom: 10px;
-  margin-top: 20px
-}
-.attachment {
-  margin-top: 30px
-}
-.attachment ul {
-  width: 100%;
-  list-style: none;
-  padding-left: 0;
-  display: inline-block;
-  margin-bottom: 30px
-}
-.attachment ul li {
-  float: left;
-  width: 150px;
-  margin-right: 10px;
-  margin-bottom: 10px
-}
-.attachment ul li img {
-  height: 150px;
-  border: 1px solid #ddd;
-  padding: 5px;
-  margin-bottom: 10px
-}
-.attachment ul li span {
-  float: right
-}
-.attachment .file-name {
-  float: left
-}
-.attachment .links {
-  width: 100%;
-  display: inline-block
-}
-.compose {
-  padding: 0;
-  position: fixed;
-  bottom: 0;
-  right: 0;
-  background: #fff;
-  border: 1px solid #D9DEE4;
-  border-right: 0;
-  border-bottom: 0;
-  border-top-left-radius: 5px;
-  z-index: 9999;
-  display: none
-}
-.compose .compose-header {
-  padding: 5px;
-  background: #169F85;
-  color: #fff;
-  border-top-left-radius: 5px
-}
-.compose .compose-header .close {
-  text-shadow: 0 1px 0 #ffffff;
-  line-height: .8
-}
-.compose .compose-body .editor.btn-toolbar {
-  margin: 0
-}
-.compose .compose-body .editor-wrapper {
-  height: 100%;
-  min-height: 50px;
-  max-height: 180px;
-  border-radius: 0;
-  border-left: none;
-  border-right: none;
-  overflow: auto
-}
-.compose .compose-footer {
-  padding: 10px
-}
-.editor.btn-toolbar {
-  zoom: 1;
-  background: #F7F7F7;
-  margin: 5px 2px;
-  padding: 3px 0;
-  border: 1px solid #EFEFEF
-}
-.input-group {
-  margin-bottom: 10px
-}
-.ln_solid {
-  border-top: 1px solid #e5e5e5;
-  color: #ffffff;
-  background-color: #ffffff;
-  height: 1px;
-  margin: 20px 0
-}
-span.section {
-  display: block;
-  width: 100%;
-  padding: 0;
-  margin-bottom: 20px;
-  font-size: 21px;
-  line-height: inherit;
-  color: #333;
-  border: 0;
-  border-bottom: 1px solid #e5e5e5
-}
-.form-control {
-  border-radius: 0;
-  width: 100%
-}
-.form-horizontal .control-label {
-  padding-top: 8px
-}
-.form-control:focus {
-  border-color: #CCD0D7;
-  box-shadow: none !important
-}
-legend {
-  font-size: 18px;
-  color: inherit
-}
-.form-horizontal .form-group {
-  margin-right: 0;
-  margin-left: 0
-}
-.form-control-feedback {
-  margin-top: 8px;
-  height: 23px;
-  color: #bbb;
-  line-height: 24px;
-  font-size: 15px
-}
-.form-control-feedback.left {
-  border-right: 1px solid #ccc;
-  left: 13px
-}
-.form-control-feedback.right {
-  border-left: 1px solid #ccc;
-  right: 13px
-}
-.form-control.has-feedback-left {
-  padding-left: 45px
-}
-.form-control.has-feedback-right {
-  padding-right: 45px
-}
-.form-group {
-  margin-bottom: 10px
-}
-.validate {
-  margin-top: 10px
-}
-.invalid-form-error-message {
-  margin-top: 10px;
-  padding: 5px
-}
-.invalid-form-error-message.filled {
-  border-left: 2px solid #E74C3C
-}
-p.parsley-success {
-  color: #468847;
-  background-color: #DFF0D8;
-  border: 1px solid #D6E9C6
-}
-p.parsley-error {
-  color: #B94A48;
-  background-color: #F2DEDE;
-  border: 1px solid #EED3D7
-}
-ul.parsley-errors-list {
-  list-style: none;
-  color: #E74C3C;
-  padding-left: 0
-}
-input.parsley-error,
-textarea.parsley-error,
-select.parsley-error {
-  background: #FAEDEC;
-  border: 1px solid #E85445
-}
-.btn-group .parsley-errors-list {
-  display: none
-}
-.bad input,
-.bad select,
-.bad textarea {
-  border: 1px solid #CE5454;
-  box-shadow: 0 0 4px -2px #CE5454;
-  position: relative;
-  left: 0;
-  -moz-animation: .7s 1 shake linear;
-  -webkit-animation: 0.7s 1 shake linear
-}
-.item input,
-.item textarea {
-  transition: 0.42s
-}
-.item .alert {
-  float: left;
-  margin: 0 0 0 20px;
-  padding: 3px 10px;
-  color: #FFF;
-  border-radius: 3px 4px 4px 3px;
-  background-color: #CE5454;
-  max-width: 170px;
-  white-space: pre;
-  position: relative;
-  left: -15px;
-  opacity: 0;
-  z-index: 1;
-  transition: 0.15s ease-out
-}
-.item .alert::after {
-  content: '';
-  display: block;
-  height: 0;
-  width: 0;
-  border-color: transparent #CE5454 transparent transparent;
-  border-style: solid;
-  border-width: 11px 7px;
-  position: absolute;
-  left: -13px;
-  top: 1px
-}
-.item.bad .alert {
-  left: 0;
-  opacity: 1
-}
-.inl-bl {
-  display: inline-block
-}
-.well .markup {
-  background: #fff;
-  color: #777;
-  position: relative;
-  padding: 45px 15px 15px;
-  margin: 15px 0 0 0;
-  background-color: #fff;
-  border-radius: 0 0 4px 4px;
-  box-shadow: none
-}
-.well .markup::after {
-  content: "Example";
-  position: absolute;
-  top: 15px;
-  left: 15px;
-  font-size: 12px;
-  font-weight: bold;
-  color: #bbb;
-  text-transform: uppercase;
-  letter-spacing: 1px
-}
-.autocomplete-suggestions {
-  border: 1px solid #e4e4e4;
-  background: #F4F4F4;
-  cursor: default;
-  overflow: auto
-}
-.autocomplete-suggestion {
-  padding: 2px 5px;
-  font-size: 1.2em;
-  white-space: nowrap;
-  overflow: hidden
-}
-.autocomplete-selected {
-  background: #f0f0f0
-}
-.autocomplete-suggestions strong {
-  font-weight: normal;
-  color: #3399ff;
-  font-weight: bolder
-}
-.btn {
-  border-radius: 3px
-}
-a.btn-success,
-a.btn-primary,
-a.btn-warning,
-a.btn-danger {
-  color: #fff
-}
-.btn-success {
-  background: #26B99A;
-  border: 1px solid #169F85
-}
-.btn-success:hover,
-.btn-success:focus,
-.btn-success:active,
-.btn-success.active,
-.open .dropdown-toggle.btn-success {
-  background: #169F85
-}
-.btn-dark {
-  color: #E9EDEF;
-  background-color: #4B5F71;
-  border-color: #364B5F
-}
-.btn-dark:hover,
-.btn-dark:focus,
-.btn-dark:active,
-.btn-dark.active,
-.open .dropdown-toggle.btn-dark {
-  color: #FFFFFF;
-  background-color: #394D5F;
-  border-color: #394D5F
-}
-.btn-round {
-  border-radius: 30px
-}
-.btn.btn-app {
-  position: relative;
-  padding: 15px 5px;
-  margin: 0 0 10px 10px;
-  min-width: 80px;
-  height: 60px;
-  box-shadow: none;
-  border-radius: 0;
-  text-align: center;
-  color: #666;
-  border: 1px solid #ddd;
-  background-color: #fafafa;
-  font-size: 12px
-}
-.btn.btn-app>.fa,
-.btn.btn-app>.glyphicon,
-.btn.btn-app>.ion {
-  font-size: 20px;
-  display: block
-}
-.btn.btn-app:hover {
-  background: #f4f4f4;
-  color: #444;
-  border-color: #aaa
-}
-.btn.btn-app:active,
-.btn.btn-app:focus {
-  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125)
-}
-.btn.btn-app>.badge {
-  position: absolute;
-  top: -3px;
-  right: -10px;
-  font-size: 10px;
-  font-weight: 400
-}
-textarea {
-  padding: 10px;
-  vertical-align: top;
-  width: 200px
-}
-textarea:focus {
-  outline-style: solid;
-  outline-width: 2px
-}
-.btn_ {
-  display: inline-block;
-  padding: 3px 9px;
-  margin-bottom: 0;
-  font-size: 14px;
-  line-height: 20px;
-  text-align: center;
-  vertical-align: middle;
-  cursor: pointer;
-  color: #333333;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-  background-color: #f5f5f5;
-  background-image: linear-gradient(to bottom, #fff, #e6e6e6);
-  background-repeat: repeat-x;
-  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  border: 1px solid #cccccc;
-  border-bottom-color: #b3b3b3;
-  border-radius: 4px;
-  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05)
-}
-.bs-glyphicons {
-  margin: 0 -10px 20px;
-  overflow: hidden
-}
-.bs-glyphicons-list {
-  padding-left: 0;
-  list-style: none
-}
-.bs-glyphicons li {
-  float: left;
-  width: 25%;
-  height: 115px;
-  padding: 10px;
-  font-size: 10px;
-  line-height: 1.4;
-  text-align: center;
-  background-color: #f9f9f9;
-  border: 1px solid #fff
-}
-.bs-glyphicons .glyphicon {
-  margin-top: 5px;
-  margin-bottom: 10px;
-  font-size: 24px
-}
-.bs-glyphicons .glyphicon-class {
-  display: block;
-  text-align: center;
-  word-wrap: break-word
-}
-.bs-glyphicons li:hover {
-  color: #fff;
-  background-color: #1ABB9C
-}
-@media (min-width: 768px) {
-  .bs-glyphicons {
-    margin-right: 0;
-    margin-left: 0
-  }
-  .bs-glyphicons li {
-    width: 12.5%;
-    font-size: 12px
-  }
-}
-.tagsinput {
-  border: 1px solid #CCC;
-  background: #FFF;
-  padding: 6px 6px 0;
-  width: 300px;
-  overflow-y: auto
-}
-span.tag {
-  -moz-border-radius: 2px;
-  -webkit-border-radius: 2px;
-  display: block;
-  float: left;
-  padding: 5px 9px;
-  text-decoration: none;
-  background: #1ABB9C;
-  color: #F1F6F7;
-  margin-right: 5px;
-  font-weight: 500;
-  margin-bottom: 5px;
-  font-family: helvetica
-}
-span.tag a {
-  color: #F1F6F7 !important
-}
-.tagsinput span.tag a {
-  font-weight: bold;
-  color: #82ad2b;
-  text-decoration: none;
-  font-size: 11px
-}
-.tagsinput input {
-  width: 80px;
-  margin: 0px;
-  font-family: helvetica;
-  font-size: 13px;
-  border: 1px solid transparent;
-  padding: 3px;
-  background: transparent;
-  color: #000;
-  outline: 0px
-}
-.tagsinput div {
-  display: block;
-  float: left
-}
-.tags_clear {
-  clear: both;
-  width: 100%;
-  height: 0px
-}
-.not_valid {
-  background: #FBD8DB !important;
-  color: #90111A !important
-}
-ul.bar_tabs {
-  overflow: visible;
-  background: #F5F7FA;
-  height: 25px;
-  margin: 21px 0 14px;
-  padding-left: 14px;
-  position: relative;
-  z-index: 1;
-  width: 100%;
-  border-bottom: 1px solid #E6E9ED
-}
-ul.bar_tabs>li {
-  border: 1px solid #E6E9ED;
-  color: #333 !important;
-  margin-top: -17px;
-  margin-left: 8px;
-  background: #fff;
-  border-bottom: none;
-  border-radius: 4px 4px 0 0
-}
-ul.bar_tabs>li.active {
-  border-right: 6px solid #D3D6DA;
-  border-top: 0;
-  margin-top: -15px
-}
-ul.bar_tabs>li a {
-  padding: 10px 17px;
-  background: #F5F7FA;
-  margin: 0;
-  border-top-right-radius: 0
-}
-ul.bar_tabs>li a:hover {
-  border: 1px solid transparent
-}
-ul.bar_tabs>li.active a {
-  border-bottom: none
-}
-ul.bar_tabs.right {
-  padding-right: 14px
-}
-ul.bar_tabs.right li {
-  float: right
-}
-a:focus {
-  outline: none
-}
-ul.timeline li {
-  position: relative;
-  border-bottom: 1px solid #e8e8e8;
-  clear: both
-}
-.timeline .block {
-  margin: 0;
-  border-left: 3px solid #e8e8e8;
-  overflow: visible;
-  padding: 10px 15px;
-  margin-left: 105px
-}
-.timeline.widget {
-  min-width: 0;
-  max-width: inherit
-}
-.timeline.widget .block {
-  margin-left: 5px
-}
-.timeline .tags {
-  position: absolute;
-  top: 15px;
-  left: 0;
-  width: 84px
-}
-.timeline .tag {
-  display: block;
-  height: 30px;
-  font-size: 13px;
-  padding: 8px
-}
-.timeline .tag span {
-  display: block;
-  overflow: hidden;
-  width: 100%;
-  white-space: nowrap;
-  text-overflow: ellipsis
-}
-.tag {
-  line-height: 1;
-  background: #1ABB9C;
-  color: #fff !important
-}
-.tag:after {
-  content: " ";
-  height: 30px;
-  width: 0;
-  position: absolute;
-  left: 100%;
-  top: 0;
-  margin: 0;
-  pointer-events: none;
-  border-top: 14px solid transparent;
-  border-bottom: 14px solid transparent;
-  border-left: 11px solid #1ABB9C
-}
-.timeline h2.title {
-  position: relative;
-  font-size: 16px;
-  margin: 0
-}
-.timeline h2.title:before {
-  content: "";
-  position: absolute;
-  left: -23px;
-  top: 3px;
-  display: block;
-  width: 14px;
-  height: 14px;
-  border: 3px solid #d2d3d2;
-  border-radius: 14px;
-  background: #f9f9f9
-}
-.timeline .byline {
-  padding: .25em 0
-}
-.byline {
-  -webkit-font-smoothing: antialiased;
-  font-style: italic;
-  font-size: .9375em;
-  line-height: 1.3;
-  color: #aab6aa
-}
-ul.social li {
-  border: 0
-}
-.social-sidebar,
-.social-body {
-  float: right
-}
-.social-sidebar {
-  background: #EDEDED;
-  width: 22%
-}
-.social-body {
-  border: 1px solid #ccc;
-  width: 78%
-}
-.thumb img {
-  width: 50px;
-  height: 50px;
-  border-radius: 50%
-}
-.chat .thumb img {
-  width: 27px;
-  height: 27px;
-  border-radius: 50%
-}
-.chat .status {
-  float: left;
-  margin: 16px 0 0 -16px;
-  font-size: 14px;
-  font-weight: bold;
-  width: 12px;
-  height: 12px;
-  display: block;
-  border: 2px solid #FFF;
-  z-index: 12312;
-  border-radius: 50%
-}
-.chat .status.online {
-  background: #1ABB9C
-}
-.chat .status.away {
-  background: #F39C12
-}
-.chat .status.offline {
-  background: #ccc
-}
-.chat .media-body {
-  padding-top: 5px
-}
-.dashboard_graph .x_title {
-  padding: 5px 5px 7px
-}
-.dashboard_graph .x_title h3 {
-  margin: 0;
-  font-weight: normal
-}
-.chart {
-  position: relative;
-  display: inline-block;
-  width: 110px;
-  height: 110px;
-  margin-top: 5px;
-  margin-bottom: 5px;
-  text-align: center
-}
-.chart canvas {
-  position: absolute;
-  top: 0;
-  left: 0
-}
-.percent {
-  display: inline-block;
-  line-height: 110px;
-  z-index: 2;
-  font-size: 18px
-}
-.percent:after {
-  content: '%';
-  margin-left: 0.1em;
-  font-size: .8em
-}
-.angular {
-  margin-top: 100px
-}
-.angular .chart {
-  margin-top: 0
-}
-.widget {
-  min-width: 250px;
-  max-width: 310px
-}
-.widget_tally_box .btn-group button {
-  text-align: center
-}
-.widget_tally_box .btn-group button {
-  color: inherit;
-  font-weight: 500;
-  background-color: #f5f5f5;
-  border: 1px solid #e7e7e7
-}
-ul.widget_tally,
-ul.widget_tally li {
-  width: 100%
-}
-ul.widget_tally li {
-  padding: 2px 10px;
-  border-bottom: 1px solid #ECECEC;
-  padding-bottom: 4px
-}
-ul.widget_tally .month {
-  width: 70%;
-  float: left
-}
-ul.widget_tally .count {
-  width: 30%;
-  float: left;
-  text-align: right
-}
-.pie_bg {
-  border-bottom: 1px solid rgba(101, 204, 182, 0.16);
-  padding-bottom: 15px;
-  border-radius: 4px;
-  padding-bottom: 10px;
-  box-shadow: 0 4px 6px -6px #222
-}
-.widget_tally_box .flex {
-  display: -ms-flexbox;
-  display: flex
-}
-ul.widget_profile_box {
-  width: 100%;
-  height: 42px;
-  padding: 3px;
-  background: #ececec;
-  margin-top: 40px;
-  margin-left: 1px
-}
-ul.widget_profile_box li:first-child {
-  width: 25%;
-  float: left
-}
-ul.widget_profile_box li:first-child a {
-  float: left
-}
-ul.widget_profile_box li:last-child {
-  width: 25%;
-  float: right
-}
-ul.widget_profile_box li:last-child a {
-  float: right
-}
-ul.widget_profile_box li a {
-  font-size: 22px;
-  text-align: center;
-  width: 35px;
-  height: 35px;
-  border: 1px solid rgba(52, 73, 94, 0.44);
-  display: block;
-  border-radius: 50%;
-  padding: 0px
-}
-ul.widget_profile_box li a:hover {
-  color: #1ABB9C !important;
-  border: 1px solid #26b99a
-}
-ul.widget_profile_box li .profile_img {
-  width: 85px;
-  height: 85px;
-  margin: 0;
-  margin-top: -28px
-}
-.widget_tally_box p,
-.widget_tally_box span {
-  text-align: center
-}
-.widget_tally_box .name {
-  text-align: center;
-  margin: 25px
-}
-.widget_tally_box .name_title {
-  text-align: center;
-  margin: 5px
-}
-.widget_tally_box ul.legend {
-  margin: 0
-}
-.widget_tally_box ul.legend p,
-.widget_tally_box ul.legend span {
-  text-align: left
-}
-.widget_tally_box ul.legend li .icon {
-  font-size: 20px;
-  float: left;
-  width: 14px
-}
-.widget_tally_box ul.legend li .name {
-  font-size: 14px;
-  margin: 5px 0 0 14px;
-  text-overflow: ellipsis;
-  float: left
-}
-.widget_tally_box ul.legend p {
-  display: inline-block;
-  margin: 0
-}
-.widget_tally_box ul.verticle_bars li {
-  height: 140px;
-  width: 23%
-}
-.widget .verticle_bars li .progress.vertical.progress_wide {
-  width: 65%
-}
-ul.count2 {
-  width: 100%;
-  margin-left: 1px;
-  border: 1px solid #ddd;
-  border-left: 0;
-  border-right: 0;
-  padding: 10px 0
-}
-ul.count2 li {
-  width: 30%;
-  text-align: center
-}
-ul.count2 li h3 {
-  font-weight: 400;
-  margin: 0
-}
-ul.count2 li span {
-  font-weight: 300
-}
-.divider {
-  border-bottom: 1px solid #ddd;
-  margin: 10px
-}
-.divider-dashed {
-  border-top: 1px dashed #e7eaec;
-  background-color: #ffffff;
-  height: 1px;
-  margin: 10px 0
-}
-ul.messages {
-  padding: 0;
-  list-style: none
-}
-ul.messages li,
-.tasks li {
-  border-bottom: 1px dotted #e6e6e6;
-  padding: 8px 0
-}
-ul.messages li img.avatar,
-img.avatar {
-  height: 32px;
-  width: 32px;
-  float: left;
-  display: inline-block;
-  border-radius: 2px;
-  padding: 2px;
-  background: #f7f7f7;
-  border: 1px solid #e6e6e6
-}
-ul.messages li .message_date {
-  float: right;
-  text-align: right
-}
-ul.messages li .message_wrapper {
-  margin-left: 50px;
-  margin-right: 40px
-}
-ul.messages li .message_wrapper h4.heading {
-  font-weight: 600;
-  margin: 0;
-  cursor: pointer;
-  margin-bottom: 10px;
-  line-height: 100%
-}
-ul.messages li .message_wrapper blockquote {
-  padding: 0px 10px;
-  margin: 0;
-  border-left: 5px solid #eee
-}
-ul.user_data li {
-  margin-bottom: 6px
-}
-ul.user_data li p {
-  margin-bottom: 0
-}
-ul.user_data li .progress {
-  width: 90%
-}
-.project_progress .progress {
-  margin-bottom: 3px !important;
-  margin-top: 5px
-}
-.projects .list-inline {
-  margin: 0
-}
-.profile_title {
-  background: #F5F7FA;
-  border: 0;
-  padding: 7px 0;
-  display: -ms-flexbox;
-  display: flex
-}
-ul.stats-overview {
-  border-bottom: 1px solid #e8e8e8;
-  padding-bottom: 10px;
-  margin-bottom: 10px
-}
-ul.stats-overview li {
-  display: inline-block;
-  text-align: center;
-  padding: 0 15px;
-  width: 30%;
-  font-size: 14px;
-  border-right: 1px solid #e8e8e8
-}
-ul.stats-overview li:last-child {
-  border-right: 0
-}
-ul.stats-overview li .name {
-  font-size: 12px
-}
-ul.stats-overview li .value {
-  font-size: 14px;
-  font-weight: bold;
-  display: block
-}
-ul.stats-overview li:first-child {
-  padding-left: 0
-}
-ul.project_files li {
-  margin-bottom: 5px
-}
-ul.project_files li a i {
-  width: 20px
-}
-.project_detail p {
-  margin-bottom: 10px
-}
-.project_detail p.title {
-  font-weight: bold;
-  margin-bottom: 0
-}
-.avatar img {
-  border-radius: 50%;
-  max-width: 45px
-}
-.pricing {
-  background: #fff
-}
-.pricing .title {
-  background: #1ABB9C;
-  height: 110px;
-  color: #fff;
-  padding: 15px 0 0;
-  text-align: center
-}
-.pricing .title h2 {
-  text-transform: capitalize;
-  font-size: 18px;
-  border-radius: 5px 5px 0 0;
-  margin: 0;
-  font-weight: 400
-}
-.pricing .title h1 {
-  font-size: 30px;
-  margin: 12px
-}
-.pricing .title span {
-  background: rgba(51, 51, 51, 0.28);
-  padding: 2px 5px
-}
-.pricing_features {
-  background: #FAFAFA;
-  padding: 20px 15px;
-  min-height: 230px;
-  font-size: 13.5px
-}
-.pricing_features ul li {
-  margin-top: 10px
-}
-.pricing_footer {
-  padding: 10px 15px;
-  background-color: #f5f5f5;
-  border-top: 1px solid #ddd;
-  text-align: center;
-  border-bottom-right-radius: 3px;
-  border-bottom-left-radius: 3px
-}
-.pricing_footer p {
-  font-size: 13px;
-  padding: 10px 0 2px;
-  display: block
-}
-.ui-ribbon-container {
-  position: relative
-}
-.ui-ribbon-container .ui-ribbon-wrapper {
-  position: absolute;
-  overflow: hidden;
-  width: 85px;
-  height: 88px;
-  top: -3px;
-  right: -3px
-}
-.ui-ribbon-container.ui-ribbon-primary .ui-ribbon {
-  background-color: #5b90bf
-}
-.ui-ribbon-container .ui-ribbon {
-  position: relative;
-  display: block;
-  text-align: center;
-  font-size: 15px;
-  font-weight: 700;
-  color: #fff;
-  transform: rotate(45deg);
-  padding: 7px 0;
-  left: -5px;
-  top: 15px;
-  width: 120px;
-  line-height: 20px;
-  background-color: #555;
-  box-shadow: 0 0 3px rgba(0, 0, 0, 0.3)
-}
-.ui-ribbon-container.ui-ribbon-primary .ui-ribbon:after,
-.ui-ribbon-container.ui-ribbon-primary .ui-ribbon:before {
-  border-top: 2px solid #5b90bf
-}
-.ui-ribbon-container .ui-ribbon:before {
-  left: 0;
-  bottom: -1px
-}
-.ui-ribbon-container .ui-ribbon:before {
-  right: 0
-}
-.ui-ribbon-container .ui-ribbon:after,
-.ui-ribbon-container .ui-ribbon:before {
-  position: absolute;
-  content: " ";
-  line-height: 0;
-  border-top: 2px solid #555;
-  border-left: 2px solid transparent;
-  border-right: 2px solid transparent
-}
-.thumbnail .image {
-  height: 120px;
-  overflow: hidden
-}
-.caption {
-  padding: 9px 5px;
-  background: #F7F7F7
-}
-.caption p {
-  margin-bottom: 5px
-}
-.thumbnail {
-  height: 190px;
-  overflow: hidden
-}
-.view {
-  overflow: hidden;
-  position: relative;
-  text-align: center;
-  box-shadow: 1px 1px 2px #e6e6e6;
-  cursor: default
-}
-.view .mask,
-.view .content {
-  position: absolute;
-  width: 100%;
-  overflow: hidden;
-  top: 0;
-  left: 0
-}
-.view img {
-  display: block;
-  position: relative
-}
-.view .tools {
-  text-transform: uppercase;
-  color: #fff;
-  text-align: center;
-  position: relative;
-  font-size: 17px;
-  padding: 3px;
-  background: rgba(0, 0, 0, 0.35);
-  margin: 43px 0 0 0
-}
-.mask.no-caption .tools {
-  margin: 90px 0 0 0
-}
-.view .tools a {
-  display: inline-block;
-  color: #FFF;
-  font-size: 18px;
-  font-weight: 400;
-  padding: 0 4px
-}
-.view p {
-  font-family: Georgia, serif;
-  font-style: italic;
-  font-size: 12px;
-  position: relative;
-  color: #fff;
-  padding: 10px 20px 20px;
-  text-align: center
-}
-.view a.info {
-  display: inline-block;
-  text-decoration: none;
-  padding: 7px 14px;
-  background: #000;
-  color: #fff;
-  text-transform: uppercase;
-  box-shadow: 0 0 1px #000
-}
-.view-first img {
-  transition: all 0.2s linear
-}
-.view-first .mask {
-  opacity: 0;
-  background-color: rgba(0, 0, 0, 0.5);
-  transition: all 0.4s ease-in-out
-}
-.view-first .tools {
-  transform: translateY(-100px);
-  opacity: 0;
-  transition: all 0.2s ease-in-out
-}
-.view-first p {
-  transform: translateY(100px);
-  opacity: 0;
-  transition: all 0.2s linear
-}
-.view-first:hover img {
-  transform: scale(1.1)
-}
-.view-first:hover .mask {
-  opacity: 1
-}
-.view-first:hover .tools,
-.view-first:hover p {
-  opacity: 1;
-  transform: translateY(0px)
-}
-.view-first:hover p {
-  transition-delay: 0.1s
-}
-.form-group.has-feedback span {
-  display: block !important;
-}
-.form-group .btn {
-  margin-bottom: -6px;
-}
-
-.input-group-btn .btn { margin-bottom:0; }
-
-/*!
- * bootstrap-vertical-tabs - v1.2.1
- * https://dbtek.github.io/bootstrap-vertical-tabs
- * 2014-11-07
- * Copyright (c) 2014 Ismail Demirbilek
- * License: MIT
- */
-
-.tabs-left,
-.tabs-right {
-  border-bottom: none;
-  padding-top: 2px
-}
-.tabs-left {
-  border-right: 1px solid #F7F7F7
-}
-.tabs-right {
-  border-left: 1px solid #F7F7F7
-}
-.tabs-left>li,
-.tabs-right>li {
-  float: none;
-  margin-bottom: 2px
-}
-.tabs-left>li {
-  margin-right: -1px
-}
-.tabs-right>li {
-  margin-left: -1px
-}
-.tabs-left>li.active>a,
-.tabs-left>li.active>a:hover,
-.tabs-left>li.active>a:focus {
-  border-bottom-color: #F7F7F7;
-  border-right-color: transparent
-}
-.tabs-right>li.active>a,
-.tabs-right>li.active>a:hover,
-.tabs-right>li.active>a:focus {
-  border-bottom: 1px solid #F7F7F7;
-  border-left-color: transparent
-}
-.tabs-left>li>a {
-  border-radius: 4px 0 0 4px;
-  margin-right: 0;
-  display: block;
-  background: #F7F7F7;
-  text-overflow: ellipsis;
-  overflow: hidden
-}
-.tabs-right>li>a {
-  border-radius: 0 4px 4px 0;
-  margin-right: 0;
-  background: #F7F7F7;
-  text-overflow: ellipsis;
-  overflow: hidden
-}
-.sideways {
-  margin-top: 50px;
-  border: none;
-  position: relative
-}
-.sideways>li {
-  height: 20px;
-  width: 120px;
-  margin-bottom: 100px
-}
-.sideways>li>a {
-  border-bottom: 1px solid #ddd;
-  border-right-color: transparent;
-  text-align: center;
-  border-radius: 4px 4px 0px 0px
-}
-.sideways>li.active>a,
-.sideways>li.active>a:hover,
-.sideways>li.active>a:focus {
-  border-bottom-color: transparent;
-  border-right-color: #ddd;
-  border-left-color: #ddd
-}
-.sideways.tabs-left {
-  left: -50px
-}
-.sideways.tabs-right {
-  right: -50px
-}
-.sideways.tabs-right>li {
-  transform: rotate(90deg)
-}
-.sideways.tabs-left>li {
-  transform: rotate(-90deg)
-}
-.morris-hover {
-  position: absolute;
-  z-index: 1000
-}
-.morris-hover.morris-default-style {
-  padding: 6px;
-  color: #666;
-  background: rgba(243, 242, 243, 0.8);
-  border: solid 2px rgba(195, 194, 196, 0.8);
-  font-family: sans-serif;
-  font-size: 12px;
-  text-align: center
-}
-.morris-hover.morris-default-style .morris-hover-row-label {
-  font-weight: bold;
-  margin: 0.25em 0
-}
-.morris-hover.morris-default-style .morris-hover-point {
-  white-space: nowrap;
-  margin: 0.1em 0
-}
-.price {
-  font-size: 40px;
-  font-weight: 400;
-  color: #26B99A;
-  margin: 0
-}
-.prod_title {
-  border-bottom: 1px solid #DFDFDF;
-  padding-bottom: 5px;
-  margin: 30px 0;
-  font-size: 20px;
-  font-weight: 400
-}
-.product-image img {
-  width: 90%
-}
-.prod_color li {
-  margin: 0 10px
-}
-.prod_color li p {
-  margin-bottom: 0
-}
-.prod_size li {
-  padding: 0
-}
-.prod_color .color {
-  width: 25px;
-  height: 25px;
-  border: 2px solid rgba(51, 51, 51, 0.28) !important;
-  padding: 2px;
-  border-radius: 50px
-}
-.product_gallery a {
-  width: 100px;
-  height: 100px;
-  float: left;
-  margin: 10px;
-  border: 1px solid #e5e5e5
-}
-.product_gallery a img {
-  width: 100%;
-  margin-top: 15px
-}
-.product_price {
-  margin: 20px 0;
-  padding: 5px 10px;
-  background-color: #FFFFFF;
-  text-align: left;
-  border: 2px dashed #E0E0E0
-}
-.price-tax {
-  font-size: 18px
-}
-.product_social {
-  margin: 20px 0
-}
-.product_social ul li a i {
-  font-size: 35px
-}
-.login {
-  background: #F7F7F7
-}
-.login .fa-paw {
-  font-size: 26px
-}
-a.hiddenanchor {
-  display: none
-}
-.login_wrapper {
-  right: 0px;
-  margin: 0px auto;
-  margin-top: 5%;
-  max-width: 350px;
-  position: relative
-}
-.registration_form,
-.login_form {
-  position: absolute;
-  top: 0px;
-  width: 100%
-}
-.registration_form {
-  z-index: 21;
-  opacity: 0;
-  width: 100%
-}
-.login_form {
-  z-index: 22
-}
-#signup:target ~ .login_wrapper .registration_form,
-#signin:target ~ .login_wrapper .login_form {
-  z-index: 22;
-  animation-name: fadeInLeft;
-  animation-delay: .1s
-}
-#signup:target ~ .login_wrapper .login_form,
-#signin:target ~ .login_wrapper .registration_form {
-  animation-name: fadeOutLeft
-}
-.animate {
-  -webkit-animation-duration: 0.5s;
-  -webkit-animation-timing-function: ease;
-  -webkit-animation-fill-mode: both;
-  -moz-animation-duration: 0.5s;
-  -moz-animation-timing-function: ease;
-  -moz-animation-fill-mode: both;
-  -o-animation-duration: 0.5s;
-  -o-animation-timing-function: ease;
-  -o-animation-fill-mode: both;
-  -ms-animation-duration: 0.5s;
-  -ms-animation-timing-function: ease;
-  -ms-animation-fill-mode: both;
-  animation-duration: 0.5s;
-  animation-timing-function: ease;
-  animation-fill-mode: both
-}
-.login_box {
-  padding: 20px;
-  margin: auto
-}
-.left {
-  float: left
-}
-.alignleft {
-  float: left;
-  margin-right: 15px
-}
-.alignright {
-  float: right;
-  margin-left: 15px
-}
-.clearfix:after,
-form:after {
-  content: ".";
-  display: block;
-  height: 0;
-  clear: both;
-  visibility: hidden
-}
-.login_content {
-  margin: 0 auto;
-  padding: 25px 0 0;
-  position: relative;
-  text-align: center;
-  text-shadow: 0 1px 0 #fff;
-  min-width: 280px
-}
-.login_content a,
-.login_content .btn-default:hover {
-  text-decoration: none
-}
-.login_content a:hover {
-  text-decoration: underline
-}
-.login_content h1 {
-  font: normal 25px Helvetica, Arial, sans-serif;
-  letter-spacing: -0.05em;
-  line-height: 20px;
-  margin: 10px 0 30px
-}
-.login_content h1:before,
-.login_content h1:after {
-  content: "";
-  height: 1px;
-  position: absolute;
-  top: 10px;
-  width: 27%
-}
-.login_content h1:after {
-  background: #7e7e7e;
-  background: linear-gradient(left, #7e7e7e 0%, #fff 100%);
-  right: 0
-}
-.login_content h1:before {
-  background: #7e7e7e;
-  background: linear-gradient(right, #7e7e7e 0%, #fff 100%);
-  left: 0
-}
-.login_content h1:before,
-.login_content h1:after {
-  content: "";
-  height: 1px;
-  position: absolute;
-  top: 10px;
-  width: 20%
-}
-.login_content h1:after {
-  background: #7e7e7e;
-  background: linear-gradient(left, #7e7e7e 0%, #fff 100%);
-  right: 0
-}
-.login_content h1:before {
-  background: #7e7e7e;
-  background: linear-gradient(right, #7e7e7e 0%, #fff 100%);
-  left: 0
-}
-.login_content form {
-  margin: 20px 0;
-  position: relative
-}
-.login_content form input[type="text"],
-.login_content form input[type="email"],
-.login_content form input[type="password"] {
-  border-radius: 3px;
-  -ms-box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset;
-  -o-box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset;
-  box-shadow: 0 1px 0 #fff, 0 -2px 5px rgba(0, 0, 0, 0.08) inset;
-  border: 1px solid #c8c8c8;
-  color: #777;
-  margin: 0 0 20px;
-  width: 100%
-}
-.login_content form input[type="text"]:focus,
-.login_content form input[type="email"]:focus,
-.login_content form input[type="password"]:focus {
-  -ms-box-shadow: 0 0 2px #ed1c24 inset;
-  -o-box-shadow: 0 0 2px #ed1c24 inset;
-  box-shadow: 0 0 2px #A97AAD inset;
-  background-color: #fff;
-  border: 1px solid #A878AF;
-  outline: none
-}
-#username {
-  background-position: 10px 10px !important
-}
-#password {
-  background-position: 10px -53px !important
-}
-.login_content form div a {
-  font-size: 12px;
-  margin: 10px 15px 0 0
-}
-.reset_pass {
-  margin-top: 10px !important
-}
-.login_content div .reset_pass {
-  margin-top: 13px !important;
-  margin-right: 39px;
-  float: right
-}
-.separator {
-  border-top: 1px solid #D8D8D8;
-  margin-top: 10px;
-  padding-top: 10px
-}
-.button {
-  background: #f7f9fa;
-  background: linear-gradient(top, #f7f9fa 0%, #f0f0f0 100%);
-  -ms-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset;
-  -o-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset;
-  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) inset;
-  border-radius: 0 0 5px 5px;
-  border-top: 1px solid #CFD5D9;
-  padding: 15px 0
-}
-.login_content form input[type="submit"],
-#content form .submit {
-  float: left;
-  margin-left: 38px
-}
-.button a {
-  background: url(http://cssdeck.com/uploads/media/items/8/8bcLQqF.png) 0 -112px no-repeat;
-  color: #7E7E7E;
-  font-size: 17px;
-  padding: 2px 0 2px 40px;
-  text-decoration: none;
-  transition: all 0.3s ease
-}
-.button a:hover {
-  background-position: 0 -135px;
-  color: #00aeef
-}
-header {
-  width: 100%
-}
-#nprogress .bar {
-  background: #1ABB9C
-}
-#nprogress .peg {
-  box-shadow: 0 0 10px #1ABB9C, 0 0 5px #1ABB9C
-}
-#nprogress .spinner-icon {
-  border-top-color: #1ABB9C;
-  border-left-color: #1ABB9C
-}
-.editor-wrapper {
-  min-height: 250px;
-  background-color: white;
-  border-collapse: separate;
-  border: 1px solid #ccc;
-  padding: 4px;
-  box-sizing: content-box;
-  box-shadow: rgba(0, 0, 0, 0.07451) 0px 1px 1px 0px inset;
-  border-top-right-radius: 3px;
-  border-bottom-right-radius: 3px;
-  border-bottom-left-radius: 3px;
-  border-top-left-radius: 3px;
-  overflow: scroll;
-  outline: none
-}
-.voiceBtn {
-  width: 20px;
-  color: transparent;
-  background-color: transparent;
-  transform: scale(2, 2);
-  -webkit-transform: scale(2, 2);
-  -moz-transform: scale(2, 2);
-  border: transparent;
-  cursor: pointer;
-  box-shadow: none;
-  -webkit-box-shadow: none
-}
-div[data-role="editor-toolbar"] {
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none
-}
-.dropdown-menu a {
-  cursor: pointer
-}
-.select2-container--default .select2-selection--single,
-.select2-container--default .select2-selection--multiple {
-  background-color: #fff;
-  border: 1px solid #ccc;
-  border-radius: 0;
-  min-height: 38px
-}
-.select2-container--default .select2-selection--single .select2-selection__rendered {
-  color: #73879C;
-  padding-top: 5px
-}
-.select2-container--default .select2-selection--multiple .select2-selection__rendered {
-  padding-top: 3px
-}
-.select2-container--default .select2-selection--single .select2-selection__arrow {
-  height: 36px
-}
-.select2-container--default .select2-selection--multiple .select2-selection__choice,
-.select2-container--default .select2-selection--multiple .select2-selection__clear {
-  margin-top: 2px;
-  border: none;
-  border-radius: 0;
-  padding: 3px 5px
-}
-.select2-container--default.select2-container--focus .select2-selection--multiple {
-  border: 1px solid #ccc
-}
-.switchery {
-  width: 32px;
-  height: 20px
-}
-.switchery>small {
-  width: 20px;
-  height: 20px
-}
-fieldset {
-  border: none;
-  margin: 0;
-  padding: 0
-}
-.cropper .img-container,
-.cropper .img-preview {
-  background-color: #f7f7f7;
-  width: 100%;
-  text-align: center
-}
-.cropper .img-container {
-  min-height: 200px;
-  max-height: 516px;
-  margin-bottom: 20px
-}
-@media (min-width: 768px) {
-  .cropper .img-container {
-    min-height: 516px
-  }
-}
-.cropper .img-container>img {
-  max-width: 100%
-}
-.cropper .docs-preview {
-  margin-right: -15px
-}
-.cropper .img-preview {
-  float: left;
-  margin-right: 10px;
-  margin-bottom: 10px;
-  overflow: hidden
-}
-.cropper .img-preview>img {
-  max-width: 100%
-}
-.cropper .preview-lg {
-  width: 263px;
-  height: 148px
-}
-.cropper .preview-md {
-  width: 139px;
-  height: 78px
-}
-.cropper .preview-sm {
-  width: 69px;
-  height: 39px
-}
-.cropper .preview-xs {
-  width: 35px;
-  height: 20px;
-  margin-right: 0
-}
-.cropper .docs-data>.input-group {
-  margin-bottom: 10px
-}
-.cropper .docs-data>.input-group>label {
-  min-width: 80px
-}
-.cropper .docs-data>.input-group>span {
-  min-width: 50px
-}
-.cropper .docs-buttons>.btn,
-.cropper .docs-buttons>.btn-group,
-.cropper .docs-buttons>.form-control {
-  margin-right: 5px;
-  margin-bottom: 10px
-}
-.cropper .docs-toggles>.btn,
-.cropper .docs-toggles>.btn-group,
-.cropper .docs-toggles>.dropdown {
-  margin-bottom: 10px
-}
-.cropper .docs-tooltip {
-  display: block;
-  margin: -6px -12px;
-  padding: 6px 12px
-}
-.cropper .docs-tooltip>.icon {
-  margin: 0 -3px;
-  vertical-align: top
-}
-.cropper .tooltip-inner {
-  white-space: normal
-}
-.cropper .btn-upload .tooltip-inner,
-.cropper .btn-toggle .tooltip-inner {
-  white-space: nowrap
-}
-.cropper .btn-toggle {
-  padding: 6px
-}
-.cropper .btn-toggle>.docs-tooltip {
-  margin: -6px;
-  padding: 6px
-}
-@media (max-width: 400px) {
-  .cropper .btn-group-crop {
-    margin-right: -15px !important
-  }
-  .cropper .btn-group-crop>.btn {
-    padding-left: 5px;
-    padding-right: 5px
-  }
-  .cropper .btn-group-crop .docs-tooltip {
-    margin-left: -5px;
-    margin-right: -5px;
-    padding-left: 5px;
-    padding-right: 5px
-  }
-}
-.cropper .docs-options .dropdown-menu {
-  width: 100%
-}
-.cropper .docs-options .dropdown-menu>li {
-  padding: 3px 20px
-}
-.cropper .docs-options .dropdown-menu>li:hover {
-  background-color: #f7f7f7
-}
-.cropper .docs-options .dropdown-menu>li>label {
-  display: block
-}
-.cropper .docs-cropped .modal-body {
-  text-align: center
-}
-.cropper .docs-cropped .modal-body>img,
-.cropper .docs-cropped .modal-body>canvas {
-  max-width: 100%
-}
-.cropper .docs-diagram .modal-dialog {
-  max-width: 352px
-}
-.cropper .docs-cropped canvas {
-  max-width: 100%
-}
-.form_wizard .stepContainer {
-  display: block;
-  position: relative;
-  margin: 0;
-  padding: 0;
-  border: 0 solid #CCC;
-  overflow-x: hidden
-}
-.wizard_horizontal ul.wizard_steps {
-  display: table;
-  list-style: none;
-  position: relative;
-  width: 100%;
-  margin: 0 0 20px
-}
-.wizard_horizontal ul.wizard_steps li {
-  display: table-cell;
-  text-align: center
-}
-.wizard_horizontal ul.wizard_steps li a,
-.wizard_horizontal ul.wizard_steps li:hover {
-  display: block;
-  position: relative;
-  -moz-opacity: 1;
-  filter: alpha(opacity=100);
-  opacity: 1;
-  color: #666
-}
-.wizard_horizontal ul.wizard_steps li a:before {
-  content: "";
-  position: absolute;
-  height: 4px;
-  background: #ccc;
-  top: 20px;
-  width: 100%;
-  z-index: 4;
-  left: 0
-}
-.wizard_horizontal ul.wizard_steps li a.disabled .step_no {
-  background: #ccc
-}
-.wizard_horizontal ul.wizard_steps li a .step_no {
-  width: 40px;
-  height: 40px;
-  line-height: 40px;
-  border-radius: 100px;
-  display: block;
-  margin: 0 auto 5px;
-  font-size: 16px;
-  text-align: center;
-  position: relative;
-  z-index: 5
-}
-.wizard_horizontal ul.wizard_steps li a.selected:before,
-.step_no {
-  background: #34495E;
-  color: #fff
-}
-.wizard_horizontal ul.wizard_steps li a.done:before,
-.wizard_horizontal ul.wizard_steps li a.done .step_no {
-  background: #1ABB9C;
-  color: #fff
-}
-.wizard_horizontal ul.wizard_steps li:first-child a:before {
-  left: 50%
-}
-.wizard_horizontal ul.wizard_steps li:last-child a:before {
-  right: 50%;
-  width: 50%;
-  left: auto
-}
-.wizard_verticle .stepContainer {
-  width: 80%;
-  float: left;
-  padding: 0 10px
-}
-.actionBar {
-  width: 100%;
-  border-top: 1px solid #ddd;
-  padding: 10px 5px;
-  text-align: right;
-  margin-top: 10px
-}
-.actionBar .buttonDisabled {
-  cursor: not-allowed;
-  pointer-events: none;
-  opacity: .65;
-  filter: alpha(opacity=65);
-  box-shadow: none
-}
-.actionBar a {
-  margin: 0 3px
-}
-.wizard_verticle .wizard_content {
-  width: 80%;
-  float: left;
-  padding-left: 20px
-}
-.wizard_verticle ul.wizard_steps {
-  display: table;
-  list-style: none;
-  position: relative;
-  width: 20%;
-  float: left;
-  margin: 0 0 20px
-}
-.wizard_verticle ul.wizard_steps li {
-  display: list-item;
-  text-align: center
-}
-.wizard_verticle ul.wizard_steps li a {
-  height: 80px
-}
-.wizard_verticle ul.wizard_steps li a:first-child {
-  margin-top: 20px
-}
-.wizard_verticle ul.wizard_steps li a,
-.wizard_verticle ul.wizard_steps li:hover {
-  display: block;
-  position: relative;
-  -moz-opacity: 1;
-  filter: alpha(opacity=100);
-  opacity: 1;
-  color: #666
-}
-.wizard_verticle ul.wizard_steps li a:before {
-  content: "";
-  position: absolute;
-  height: 100%;
-  background: #ccc;
-  top: 20px;
-  width: 4px;
-  z-index: 4;
-  left: 49%
-}
-.wizard_verticle ul.wizard_steps li a.disabled .step_no {
-  background: #ccc
-}
-.wizard_verticle ul.wizard_steps li a .step_no {
-  width: 40px;
-  height: 40px;
-  line-height: 40px;
-  border-radius: 100px;
-  display: block;
-  margin: 0 auto 5px;
-  font-size: 16px;
-  text-align: center;
-  position: relative;
-  z-index: 5
-}
-.wizard_verticle ul.wizard_steps li a.selected:before,
-.step_no {
-  background: #34495E;
-  color: #fff
-}
-.wizard_verticle ul.wizard_steps li a.done:before,
-.wizard_verticle ul.wizard_steps li a.done .step_no {
-  background: #1ABB9C;
-  color: #fff
-}
-.wizard_verticle ul.wizard_steps li:first-child a:before {
-  left: 49%
-}
-.wizard_verticle ul.wizard_steps li:last-child a:before {
-  left: 49%;
-  left: auto;
-  width: 0
-}
-.form_wizard .loader {
-  display: none
-}
-.form_wizard .msgBox {
-  display: none
-}
-.progress {
-  border-radius: 0
-}
-.progress-bar-info {
-  background-color: #3498DB
-}
-.progress-bar-success {
-  background-color: #26B99A
-}
-.progress_summary .progress {
-  margin: 5px 0 12px !important
-}
-.progress_summary .row {
-  margin-bottom: 5px
-}
-.progress_summary .row .col-xs-2 {
-  padding: 0
-}
-.progress_summary .more_info span {
-  text-align: right;
-  float: right
-}
-.progress_summary .data span {
-  text-align: right;
-  float: right
-}
-.progress_summary p {
-  margin-bottom: 3px;
-  width: 100%
-}
-.progress_title .left {
-  float: left;
-  text-align: left
-}
-.progress_title .right {
-  float: right;
-  text-align: right;
-  font-weight: 300
-}
-.progress.progress_sm {
-  border-radius: 0;
-  margin-bottom: 18px;
-  height: 10px !important
-}
-.progress.progress_sm .progress-bar {
-  height: 10px !important
-}
-.dashboard_graph p {
-  margin: 0 0 4px
-}
-ul.verticle_bars {
-  width: 100%
-}
-ul.verticle_bars li {
-  width: 23%;
-  height: 200px;
-  margin: 0
-}
-.progress.vertical.progress_wide {
-  width: 35px
-}
-.alert-success {
-  color: #ffffff;
-  background-color: rgba(38, 185, 154, 0.88);
-  border-color: rgba(38, 185, 154, 0.88)
-}
-.alert-info {
-  color: #E9EDEF;
-  background-color: rgba(52, 152, 219, 0.88);
-  border-color: rgba(52, 152, 219, 0.88)
-}
-.alert-warning {
-  color: #E9EDEF;
-  background-color: rgba(243, 156, 18, 0.88);
-  border-color: rgba(243, 156, 18, 0.88)
-}
-.alert-danger,
-.alert-error {
-  color: #E9EDEF;
-  background-color: rgba(231, 76, 60, 0.88);
-  border-color: rgba(231, 76, 60, 0.88)
-}
-.ui-pnotify.dark .ui-pnotify-container {
-  color: #E9EDEF;
-  background-color: rgba(52, 73, 94, 0.88);
-  border-color: rgba(52, 73, 94, 0.88)
-}
-.custom-notifications {
-  position: fixed;
-  margin: 15px;
-  right: 0;
-  float: right;
-  width: 400px;
-  z-index: 4000;
-  bottom: 0
-}
-ul.notifications {
-  float: right;
-  display: block;
-  margin-bottom: 7px;
-  padding: 0;
-  width: 100%
-}
-.notifications li {
-  float: right;
-  margin: 3px;
-  width: 36px;
-  box-shadow: 3px 3px 3px rgba(0, 0, 0, 0.3)
-}
-.notifications li:last-child {
-  margin-left: 0
-}
-.notifications a {
-  display: block;
-  text-align: center;
-  text-decoration: none;
-  text-transform: uppercase;
-  padding: 9px 8px
-}
-.tabbed_notifications .text {
-  padding: 5px 15px;
-  height: 140px;
-  border-radius: 7px;
-  box-shadow: 6px 6px 6px rgba(0, 0, 0, 0.3)
-}
-.tabbed_notifications div p {
-  display: inline-block
-}
-.tabbed_notifications h2 {
-  font-weight: bold;
-  text-transform: uppercase;
-  width: 80%;
-  float: left;
-  height: 20px;
-  text-overflow: ellipsis;
-  overflow: hidden;
-  display: block
-}
-.tabbed_notifications .close {
-  padding: 5px;
-  color: #E9EDEF;
-  float: right;
-  opacity: 1
-}
-.fc-state-default {
-  background: #f5f5f5;
-  color: #73879C
-}
-.fc-state-down,
-.fc-state-active {
-  color: #333;
-  background: #ccc
-}
-.dropzone {
-  min-height: 300px;
-  border: 1px solid #e5e5e5
-}
-
-/*
-.x_content {
-    direction: rtl;
-}
-*/
-
-.main_menu .label {
-  line-height: 11px;
-  margin-top: 4px;
-}
-@media (max-width: 460px) {
-  .dataTables_wrapper .col-sm-6 {
-    width: 100%;
-    margin-bottom: 5px;
-  }
-  .dataTables_wrapper .col-sm-6 .dataTables_filter {
-    float: none;
-  }
-}
-
-
-@media (max-width: 767px) {
-  .dataTables_length { float:none; }
-}
-
-.daterangepicker.xdisplay { width:228px; }
-
-.dataTables_wrapper > .row{
-  overflow:auto !important; /*prevent datatables overflowing its container*/
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/styles/variables.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/styles/variables.scss b/traffic_ops/experimental/ui/app/src/styles/variables.scss
deleted file mode 100755
index 3758dad..0000000
--- a/traffic_ops/experimental/ui/app/src/styles/variables.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.
-
-*/
-
-
-/** override bootstrap-sass variables here
-
-/*$screen-xs:                  1024px;
-$screen-sm:                  1280px;
-$screen-md:                  200px;
-$screen-lg:                  2000px;
-
-$container-sm:               1300px;
-$container-md:               1260px;
-$container-lg:               1520px;*/

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/traffic_ops_release.json
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/traffic_ops_release.json b/traffic_ops/experimental/ui/app/src/traffic_ops_release.json
deleted file mode 100644
index 78fc5f3..0000000
--- a/traffic_ops/experimental/ui/app/src/traffic_ops_release.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "Version":"0.1",
-    "Build Number":"1",
-    "Build Date":"2016-01-01 16:25:27"
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/traffic_portal_properties.json
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/traffic_portal_properties.json b/traffic_ops/experimental/ui/app/src/traffic_portal_properties.json
deleted file mode 100644
index a80e7a1..0000000
--- a/traffic_ops/experimental/ui/app/src/traffic_portal_properties.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-  "_comment": "These are the default properties for Traffic Ops. To customize these values, create your own traffic_portal_properties.json and copy to your web root replacing the existing one.",
-  "properties": {
-    "name": "Butt v2",
-    "customMenu": {
-      "_comments": "These are custom items you want to add to the menu. 'items' is an array of hashes where each hash has 'name' (the menu item name), 'embed' (true|false to determine if content is embedded in TP or not), and 'url' (the url of the content)",
-      "items": []
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/bower.json
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/bower.json b/traffic_ops/experimental/ui/bower.json
deleted file mode 100755
index 231beac..0000000
--- a/traffic_ops/experimental/ui/bower.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-    "name": "trafficPortal",
-    "version": "2.0.0",
-    "description": "Traffic Portal",
-    "dependencies": {
-        "angular": "1.6.4",
-        "angular-animate": "1.6.4",
-        "angular-resource": "1.6.4",
-        "angular-route": "1.6.4",
-        "angular-sanitize": "1.6.4",
-        "angular-bootstrap": "0.14.3",
-        "angular-loading-bar": "0.8.0",
-        "angular-ui-router": "0.4.2",
-        "angular-jwt": "0.0.9",
-        "bootstrap-sass-official": "3.3.6",
-        "es5-shim": "4.5.6",
-        "flot": "0.8.3",
-        "flot.tooltip": "0.8.7",
-        "flot-axislabels": "release-2.0.1",
-        "font-awesome": "4.5.0",
-        "jquery": "2.0.0",
-        "json3": "3.3.2",
-        "restangular": "1.5.2"
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/build/Dockerfile
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/build/Dockerfile b/traffic_ops/experimental/ui/build/Dockerfile
deleted file mode 100644
index ccaebc7..0000000
--- a/traffic_ops/experimental/ui/build/Dockerfile
+++ /dev/null
@@ -1,56 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-FROM centos:7
-MAINTAINER Dan Kirkwood
-
-RUN	yum -y install \
-		epel-release \
-		git \
-		rpm-build && \
-	yum -y clean all
-
-ENV GITREPO https://github.com/apache/incubator-trafficcontrol.git
-ENV BRANCH master
-
-WORKDIR /repo
-
-# traffic_ops_v2 specific
-RUN	yum -y install \
-		gcc \
-		libffi-devel \
-		make \
-		nodejs \
-		npm \
-		ruby-devel \
-		rubygems
-
-RUN	gem install compass
-RUN	npm -g install bower grunt-cli
-
-# bower will not run as root by default
-RUN	echo '{ "allow_root": true }' > /root/.bowerrc
-
-###
-
-VOLUME ./artifacts:/artifacts
-
-ADD run-build.sh .
-
-CMD ./run-build.sh traffic_ops_v2 2>&1 | tee /artifacts/build-traffic_ops_v2.log
-
-# vi:syntax=Dockerfile

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/build/README.md
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/build/README.md b/traffic_ops/experimental/ui/build/README.md
deleted file mode 100644
index 7492cd4..0000000
--- a/traffic_ops/experimental/ui/build/README.md
+++ /dev/null
@@ -1,63 +0,0 @@
-# Traffic Ops v2 Installation
-
-### 1. Build w/ Docker
-
-* Download Traffic Control repo
-
-    ```
-    $ git clone https://github.com/apache/incubator-trafficcontrol.git
-    ```
-
-* Build the RPM
-
-    ```
-    $ cd incubator-trafficcontrol/traffic_ops/experimental/ui/build
-    $ sudo docker build -t tov2-image .
-    $ sudo docker run -v $(pwd)/artifacts:/artifacts -e GITREPO=https://github.com/apache/incubator-trafficcontrol.git -e BRANCH=master tov2-image
-    ```
-
-    The rpm will be created the `artifacts` directory.
-
-### 2. Install
-
-* Install the Node.js JavaScript runtime
-
-    ```
-    $ curl --silent --location https://rpm.nodesource.com/setup_6.x | sudo bash -
-    $ sudo yum install -y nodejs
-    ```
-
-* Install the Traffic Ops v2 RPM
-
-    ```
-    $ sudo yum install -y ./artifacts/traffic_ops_v2-[version]-[commits].[sha].x86_64.rpm
-    ```
-
-### 3. Configure
-
-* Configure Traffic Ops v2
-
-    ```
-    $ cd /etc/traffic_ops_v2/conf
-    $ sudo cp config-template.js config.js
-    $ sudo vi config.js (read the inline comments)
-    ```
-
-### 4. Run
-
-* Start Traffic Ops v2
-
-    ```
-    $ sudo service traffic_ops_v2 start
-    ```
-
-* Navigate to Traffic Ops v2
-
-    ```
-    $ http://localhost[:port]
-    ```
-
-#### Notes
-
-    - Traffic Ops v2 consumes the Traffic Ops API, therefore, an instance of Traffic Ops must be running.
-    - This is known to work with CentOS 6.7 and Centos 7 as the host environment.



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html
deleted file mode 100644
index 42600b8..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html
+++ /dev/null
@@ -1,457 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
-            <li class="active">{{deliveryServiceName}}</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <div class="btn-group" role="group" uib-dropdown is-open="keys.isopen">
-                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    <i class="fa fa-key"></i>&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="manageSslKeys()">Manage SSL Keys</a></li>
-                    <li role="menuitem"><a ng-click="manageUrlSigKeys()">Manage URL Sig Keys</a></li>
-                </ul>
-            </div>
-            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
-                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    More&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="viewServers()">View Servers</a></li>
-                    <li role="menuitem"><a ng-click="viewRegexes()">View Regexes</a></li>
-                    <li role="menuitem"><a ng-click="viewJobs()">View Invalidate Content Jobs</a></li>
-                    <li role="menuitem"><a ng-click="viewStaticDnsEntries()">View Static DNS Entries</a></li>
-                </ul>
-            </div>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="deliveryServiceForm" class="form-horizontal form-label-left" novalidate>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.type.id), 'has-feedback': hasError(deliveryServiceForm.type.id)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Content Routing Type *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="type" name="type" class="form-control" ng-model="deliveryService.typeId" ng-options="type.id as type.name for type in types" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.type, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.xmlId), 'has-feedback': hasError(deliveryServiceForm.xmlId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">XML ID *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="xmlId" name="xmlId" type="text" class="form-control" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">No spaces</small>
-                    <span ng-show="hasError(deliveryServiceForm.xmlId)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.displayName), 'has-feedback': hasError(deliveryServiceForm.displayName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Display Name *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="displayName" name="displayName" type="text" class="form-control" ng-model="deliveryService.displayName" ng-required="true" ng-maxlength="48" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.displayName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.active), 'has-feedback': hasError(deliveryServiceForm.active)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Active *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="active" name="active" class="form-control" ng-model="deliveryService.active" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.active, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cdn), 'has-feedback': hasError(deliveryServiceForm.cdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="cdn" name="cdn" class="form-control" ng-model="deliveryService.cdnId" ng-options="cdn.id as cdn.name for cdn in cdns" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cdn, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.protocol), 'has-feedback': hasError(deliveryServiceForm.protocol)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Protocol *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="protocol" name="protocol" class="form-control" ng-model="deliveryService.protocol" ng-options="protocol.value as protocol.label for protocol in protocols" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.protocol, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dscp), 'has-feedback': hasError(deliveryServiceForm.dscp)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">DSCP Tag *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="dscp" name="dscp" class="form-control" ng-model="deliveryService.dscp" ng-options="dcsp.value as dcsp.label for dcsp in dscps" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dscp, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.signed), 'has-feedback': hasError(deliveryServiceForm.signed)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Signed URLs *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="signed" name="signed" class="form-control" ng-model="deliveryService.signed" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.signed, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.qstringIgnore), 'has-feedback': hasError(deliveryServiceForm.qstringIgnore)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Query String Handling *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="qstringIgnore" name="qstringIgnore" class="form-control" ng-model="deliveryService.qstringIgnore" ng-options="qs.value as qs.label for qs in qStrings" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.qstringIgnore, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimit), 'has-feedback': hasError(deliveryServiceForm.geoLimit)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="geoLimit" name="geoLimit" class="form-control" ng-model="deliveryService.geoLimit" ng-options="gl.value as gl.label for gl in geoLimits" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimit, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimitCountries), 'has-feedback': hasError(deliveryServiceForm.geoLimitCountries)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Countries</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="geoLimitCountries" name="geoLimitCountries" type="text" class="form-control" ng-model="deliveryService.geoLimitCountries" ng-maxlength="255" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimitCountries, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.geoLimitCountries)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoProvider), 'has-feedback': hasError(deliveryServiceForm.geoProvider)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Provider *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="geoProvider" name="geoProvider" class="form-control" ng-model="deliveryService.geoProvider" ng-options="gp.value as gp.label for gp in geoProviders" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoProvider, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geolimitRedirectUrl), 'has-feedback': hasError(deliveryServiceForm.geolimitRedirectUrl)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Redirect URL</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="geolimitRedirectUrl" name="geolimitRedirectUrl" type="text" class="form-control" ng-model="deliveryService.geolimitRedirectUrl" ng-maxlength="255" ng-pattern="/^(https?:\/\/)/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geolimitRedirectUrl, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geolimitRedirectUrl, 'pattern')">Must start with http:// or https://</small>
-                    <span ng-show="hasError(deliveryServiceForm.geolimitRedirectUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ipv6RoutingEnabled), 'has-feedback': hasError(deliveryServiceForm.ipv6RoutingEnabled)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">IPv6 Routing Enabled *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="ipv6RoutingEnabled" name="ipv6RoutingEnabled" class="form-control" ng-model="deliveryService.ipv6RoutingEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ipv6RoutingEnabled, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.rangeRequestHandling), 'has-feedback': hasError(deliveryServiceForm.rangeRequestHandling)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Range Request Handling *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="rangeRequestHandling" name="rangeRequestHandling" class="form-control" ng-model="deliveryService.rangeRequestHandling" ng-options="rrh.value as rrh.label for rrh in rrhs" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.rangeRequestHandling, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dnsBypassIp), 'has-feedback': hasError(deliveryServiceForm.dnsBypassIp)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">DNS Bypass IP</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="dnsBypassIp" name="dnsBypassIp" type="text" class="form-control" ng-model="deliveryService.dnsBypassIp" ng-maxlength="45" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dnsBypassIp, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.dnsBypassIp)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dnsBypassIp6), 'has-feedback': hasError(deliveryServiceForm.dnsBypassIp6)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">DNS Bypass IPv6</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="dnsBypassIp6" name="dnsBypassIp6" type="text" class="form-control" ng-model="deliveryService.dnsBypassIp6" ng-maxlength="45" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dnsBypassIp6, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.dnsBypassIp6)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dnsBypassCname), 'has-feedback': hasError(deliveryServiceForm.dnsBypassCname)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">DNS Bypass Cname</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="dnsBypassCname" name="dnsBypassCname" type="text" class="form-control" ng-model="deliveryService.dnsBypassCname" ng-maxlength="255" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dnsBypassCname, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.dnsBypassCname)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dnsBypassTtl), 'has-feedback': hasError(deliveryServiceForm.dnsBypassTtl)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">DNS Bypass TTL</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="dnsBypassTtl" name="dnsBypassTtl" type="text" class="form-control" ng-model="deliveryService.dnsBypassTtl" ng-maxlength="11" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dnsBypassTtl, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.dnsBypassTtl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.maxDNSAnswers), 'has-feedback': hasError(deliveryServiceForm.maxDNSAnswers)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Max DNS Answers</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="maxDNSAnswers" name="maxDNSAnswers" type="text" class="form-control" ng-model="deliveryService.maxDNSAnswers" ng-maxlength="11" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.maxDNSAnswers, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.maxDNSAnswers)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ccrDNSTtl), 'has-feedback': hasError(deliveryServiceForm.ccrDNSTtl)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service DNS TTL</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="ccrDNSTtl" name="ccrDNSTtl" type="text" class="form-control" ng-model="deliveryService.ccrDNSTtl" ng-maxlength="11" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ccrDNSTtl, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.ccrDNSTtl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.orgServerFqdn), 'has-feedback': hasError(deliveryServiceForm.orgServerFqdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Origin Server Base URL *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="orgServerFqdn" name="orgServerFqdn" type="text" class="form-control" ng-model="deliveryService.orgServerFqdn" ng-maxlength="255" ng-pattern="/^(https?:\/\/)/" required autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.orgServerFqdn, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.orgServerFqdn, 'pattern')">Must start with http:// or https://</small>
-                    <span ng-show="hasError(deliveryServiceForm.orgServerFqdn)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.multiSiteOrigin), 'has-feedback': hasError(deliveryServiceForm.multiSiteOrigin)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Use Multi Site Origin Feature *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="multiSiteOrigin" name="multiSiteOrigin" class="form-control" ng-model="deliveryService.multiSiteOrigin" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.multiSiteOrigin, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.profile), 'has-feedback': hasError(deliveryServiceForm.profile)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Profile</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="profile" name="profile" class="form-control" ng-model="deliveryService.profileId" ng-options="profile.id as profile.name for profile in profiles">
-                        <option value="">Select...</option>
-                    </select>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.globalMaxMbps), 'has-feedback': hasError(deliveryServiceForm.globalMaxMbps)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Global Max Mbps</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="globalMaxMbps" name="globalMaxMbps" type="text" class="form-control" ng-model="deliveryService.globalMaxMbps" ng-maxlength="11" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.globalMaxMbps, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.globalMaxMbps)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.globalMaxTps), 'has-feedback': hasError(deliveryServiceForm.globalMaxTps)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Global Max TPS</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="globalMaxTps" name="globalMaxTps" type="text" class="form-control" ng-model="deliveryService.globalMaxTps" ng-maxlength="11" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.globalMaxTps, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.globalMaxTps)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.missLat), 'has-feedback': hasError(deliveryServiceForm.missLat)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Miss Default Latitude</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="missLat" name="missLat" type="text" class="form-control" ng-model="deliveryService.missLat" ng-maxlength="11" ng-pattern="/^[-+]?[0-9]*\.?[0-9]+$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.missLat, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">Invalid coordinate</small>
-                    <span ng-show="hasError(deliveryServiceForm.missLat)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.missLong), 'has-feedback': hasError(deliveryServiceForm.missLong)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Miss Default Longitude</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="missLong" name="missLong" type="text" class="form-control" ng-model="deliveryService.missLong" ng-maxlength="11" ng-pattern="/^[-+]?[0-9]*\.?[0-9]+$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.missLong, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">Invalid coordinate</small>
-                    <span ng-show="hasError(deliveryServiceForm.missLong)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.edgeHeaderRewrite), 'has-feedback': hasError(deliveryServiceForm.edgeHeaderRewrite)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Edge Header Rewrite Rules</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="edgeHeaderRewrite" name="edgeHeaderRewrite" type="text" class="form-control" ng-model="deliveryService.edgeHeaderRewrite" ng-maxlength="2048" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.edgeHeaderRewrite, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.edgeHeaderRewrite)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.midHeaderRewrite), 'has-feedback': hasError(deliveryServiceForm.midHeaderRewrite)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Mid Header Rewrite Rules</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="midHeaderRewrite" name="midHeaderRewrite" type="text" class="form-control" ng-model="deliveryService.midHeaderRewrite" ng-maxlength="2048" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.midHeaderRewrite, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.midHeaderRewrite)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trResponseHeaders), 'has-feedback': hasError(deliveryServiceForm.trResponseHeaders)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Additional Response Headers</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="trResponseHeaders" name="trResponseHeaders" type="text" class="form-control" ng-model="deliveryService.trResponseHeaders" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trResponseHeaders, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.trResponseHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trRequestHeaders), 'has-feedback': hasError(deliveryServiceForm.trRequestHeaders)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Log Request Headers</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="trRequestHeaders" name="trRequestHeaders" type="text" class="form-control" ng-model="deliveryService.trRequestHeaders" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trRequestHeaders, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.trRequestHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.regexRemap), 'has-feedback': hasError(deliveryServiceForm.regexRemap)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Regex remap expression</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="regexRemap" name="regexRemap" type="text" class="form-control" ng-model="deliveryService.regexRemap" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.regexRemap, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.regexRemap)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cacheurl), 'has-feedback': hasError(deliveryServiceForm.cacheurl)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Cache URL expression</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="cacheurl" name="cacheurl" type="text" class="form-control" ng-model="deliveryService.cacheurl" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cacheurl, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.cacheurl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.remapText), 'has-feedback': hasError(deliveryServiceForm.remapText)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Raw remap text</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="remapText" name="remapText" type="text" class="form-control" ng-model="deliveryService.remapText" ng-maxlength="2048" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.remapText, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.remapText)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc), 'has-feedback': hasError(deliveryServiceForm.longDesc)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="longDesc" name="longDesc" type="text" class="form-control" ng-model="deliveryService.longDesc" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.longDesc)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc1), 'has-feedback': hasError(deliveryServiceForm.longDesc1)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 1</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="longDesc1" name="longDesc1" type="text" class="form-control" ng-model="deliveryService.longDesc1" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc1, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.longDesc1)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc2), 'has-feedback': hasError(deliveryServiceForm.longDesc2)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 2</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="longDesc2" name="longDesc2" type="text" class="form-control" ng-model="deliveryService.longDesc2" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc2, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.longDesc2)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.infoUrl), 'has-feedback': hasError(deliveryServiceForm.infoUrl)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Info URL</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="infoUrl" name="infoUrl" type="text" class="form-control" ng-model="deliveryService.infoUrl" ng-maxlength="255" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.infoUrl, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.infoUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.checkPath), 'has-feedback': hasError(deliveryServiceForm.checkPath)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Check Path</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="checkPath" name="checkPath" type="text" class="form-control" ng-model="deliveryService.checkPath" ng-maxlength="255" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.checkPath, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.checkPath)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.originShield), 'has-feedback': hasError(deliveryServiceForm.originShield)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Origin Shield (Pipe Delimited String)</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="originShield" name="originShield" type="text" class="form-control" ng-model="deliveryService.originShield" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.originShield, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.originShield)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.sslKeyVersion), 'has-feedback': hasError(deliveryServiceForm.sslKeyVersion)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">SSL Key Version</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="sslKeyVersion" name="sslKeyVersion" type="text" class="form-control" ng-model="deliveryService.sslKeyVersion" ng-maxlength="11" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.sslKeyVersion, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.sslKeyVersion)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.regionalGeoBlocking), 'has-feedback': hasError(deliveryServiceForm.regionalGeoBlocking)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Regional Geoblocking *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="regionalGeoBlocking" name="regionalGeoBlocking" class="form-control" ng-model="deliveryService.regionalGeoBlocking" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.regionalGeoBlocking, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.logsEnabled), 'has-feedback': hasError(deliveryServiceForm.logsEnabled)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Logs Enabled *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="logsEnabled" name="logsEnabled" class="form-control" ng-model="deliveryService.logsEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.logsEnabled, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(deliveryService)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html
deleted file mode 100644
index 8d26395..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html
+++ /dev/null
@@ -1,420 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
-            <li class="active">{{deliveryServiceName}}</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <div class="btn-group" role="group" uib-dropdown is-open="keys.isopen">
-                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    <i class="fa fa-key"></i>&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="manageSslKeys()">Manage SSL Keys</a></li>
-                    <li role="menuitem"><a ng-click="manageUrlSigKeys()">Manage URL Sig Keys</a></li>
-                </ul>
-            </div>
-            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
-                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    More&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="viewServers()">View Servers</a></li>
-                    <li role="menuitem"><a ng-click="viewRegexes()">View Regexes</a></li>
-                    <li role="menuitem"><a ng-click="viewJobs()">View Invalidate Content Jobs</a></li>
-                    <li role="menuitem"><a ng-click="viewStaticDnsEntries()">View Static DNS Entries</a></li>
-                </ul>
-            </div>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="deliveryServiceForm" class="form-horizontal form-label-left" novalidate>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.type.id), 'has-feedback': hasError(deliveryServiceForm.type.id)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Content Routing Type *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="type" name="type" class="form-control" ng-model="deliveryService.typeId" ng-options="type.id as type.name for type in types" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.type, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.xmlId), 'has-feedback': hasError(deliveryServiceForm.xmlId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">XML ID *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="xmlId" name="xmlId" type="text" class="form-control" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">No spaces</small>
-                    <span ng-show="hasError(deliveryServiceForm.xmlId)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.displayName), 'has-feedback': hasError(deliveryServiceForm.displayName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Display Name *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="displayName" name="displayName" type="text" class="form-control" ng-model="deliveryService.displayName" ng-required="true" ng-maxlength="48" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.displayName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.active), 'has-feedback': hasError(deliveryServiceForm.active)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Active *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="active" name="active" class="form-control" ng-model="deliveryService.active" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.active, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cdn), 'has-feedback': hasError(deliveryServiceForm.cdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="cdn" name="cdn" class="form-control" ng-model="deliveryService.cdnId" ng-options="cdn.id as cdn.name for cdn in cdns" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cdn, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.protocol), 'has-feedback': hasError(deliveryServiceForm.protocol)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Protocol *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="protocol" name="protocol" class="form-control" ng-model="deliveryService.protocol" ng-options="protocol.value as protocol.label for protocol in protocols" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.protocol, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.dscp), 'has-feedback': hasError(deliveryServiceForm.dscp)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">DSCP Tag *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="dscp" name="dscp" class="form-control" ng-model="deliveryService.dscp" ng-options="dcsp.value as dcsp.label for dcsp in dscps" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.dscp, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.signed), 'has-feedback': hasError(deliveryServiceForm.signed)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Signed URLs *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="signed" name="signed" class="form-control" ng-model="deliveryService.signed" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.signed, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.qstringIgnore), 'has-feedback': hasError(deliveryServiceForm.qstringIgnore)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Query String Handling *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="qstringIgnore" name="qstringIgnore" class="form-control" ng-model="deliveryService.qstringIgnore" ng-options="qs.value as qs.label for qs in qStrings" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.qstringIgnore, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimit), 'has-feedback': hasError(deliveryServiceForm.geoLimit)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="geoLimit" name="geoLimit" class="form-control" ng-model="deliveryService.geoLimit" ng-options="gl.value as gl.label for gl in geoLimits" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimit, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoLimitCountries), 'has-feedback': hasError(deliveryServiceForm.geoLimitCountries)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Countries</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="geoLimitCountries" name="geoLimitCountries" type="text" class="form-control" ng-model="deliveryService.geoLimitCountries" ng-maxlength="255" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoLimitCountries, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.geoLimitCountries)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoProvider), 'has-feedback': hasError(deliveryServiceForm.geoProvider)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Provider *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="geoProvider" name="geoProvider" class="form-control" ng-model="deliveryService.geoProvider" ng-options="gp.value as gp.label for gp in geoProviders" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoProvider, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geolimitRedirectUrl), 'has-feedback': hasError(deliveryServiceForm.geolimitRedirectUrl)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Limit Redirect URL</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="geolimitRedirectUrl" name="geolimitRedirectUrl" type="text" class="form-control" ng-model="deliveryService.geolimitRedirectUrl" ng-maxlength="255" ng-pattern="/^(https?:\/\/)/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geolimitRedirectUrl, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geolimitRedirectUrl, 'pattern')">Must start with http:// or https://</small>
-                    <span ng-show="hasError(deliveryServiceForm.geolimitRedirectUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.httpBypassFqdn), 'has-feedback': hasError(deliveryServiceForm.httpBypassFqdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">HTTP Bypass FQDN</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="httpBypassFqdn" name="httpBypassFqdn" type="text" class="form-control" ng-model="deliveryService.httpBypassFqdn" ng-maxlength="255" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.httpBypassFqdn, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.httpBypassFqdn)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.initialDispersion), 'has-feedback': hasError(deliveryServiceForm.initialDispersion)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Initial Dispersion *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="initialDispersion" name="initialDispersion" class="form-control" ng-model="deliveryService.initialDispersion" ng-options="disp.value as disp.label for disp in dispersions" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.initialDispersion, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ipv6RoutingEnabled), 'has-feedback': hasError(deliveryServiceForm.ipv6RoutingEnabled)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">IPv6 Routing Enabled *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="ipv6RoutingEnabled" name="ipv6RoutingEnabled" class="form-control" ng-model="deliveryService.ipv6RoutingEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ipv6RoutingEnabled, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.rangeRequestHandling), 'has-feedback': hasError(deliveryServiceForm.rangeRequestHandling)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Range Request Handling *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="rangeRequestHandling" name="rangeRequestHandling" class="form-control" ng-model="deliveryService.rangeRequestHandling" ng-options="rrh.value as rrh.label for rrh in rrhs" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.rangeRequestHandling, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.orgServerFqdn), 'has-feedback': hasError(deliveryServiceForm.orgServerFqdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Origin Server Base URL *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="orgServerFqdn" name="orgServerFqdn" type="text" class="form-control" ng-model="deliveryService.orgServerFqdn" ng-maxlength="255" ng-pattern="/^(https?:\/\/)/" required autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.orgServerFqdn, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.orgServerFqdn, 'pattern')">Must start with http:// or https://</small>
-                    <span ng-show="hasError(deliveryServiceForm.orgServerFqdn)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.multiSiteOrigin), 'has-feedback': hasError(deliveryServiceForm.multiSiteOrigin)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Use Multi Site Origin Feature *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="multiSiteOrigin" name="multiSiteOrigin" class="form-control" ng-model="deliveryService.multiSiteOrigin" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.multiSiteOrigin, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.profile), 'has-feedback': hasError(deliveryServiceForm.profile)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Profile</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="profile" name="profile" class="form-control" ng-model="deliveryService.profileId" ng-options="profile.id as profile.name for profile in profiles">
-                        <option value="">Select...</option>
-                    </select>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.globalMaxMbps), 'has-feedback': hasError(deliveryServiceForm.globalMaxMbps)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Global Max Mbps</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="globalMaxMbps" name="globalMaxMbps" type="text" class="form-control" ng-model="deliveryService.globalMaxMbps" ng-maxlength="11" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.globalMaxMbps, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.globalMaxMbps)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.globalMaxTps), 'has-feedback': hasError(deliveryServiceForm.globalMaxTps)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Global Max TPS</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="globalMaxTps" name="globalMaxTps" type="text" class="form-control" ng-model="deliveryService.globalMaxTps" ng-maxlength="11" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.globalMaxTps, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.globalMaxTps)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.missLat), 'has-feedback': hasError(deliveryServiceForm.missLat)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Miss Default Latitude</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="missLat" name="missLat" type="text" class="form-control" ng-model="deliveryService.missLat" ng-maxlength="11" ng-pattern="/^[-+]?[0-9]*\.?[0-9]+$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.missLat, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">Invalid coordinate</small>
-                    <span ng-show="hasError(deliveryServiceForm.missLat)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.missLong), 'has-feedback': hasError(deliveryServiceForm.missLong)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Miss Default Longitude</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="missLong" name="missLong" type="text" class="form-control" ng-model="deliveryService.missLong" ng-maxlength="11" ng-pattern="/^[-+]?[0-9]*\.?[0-9]+$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.missLong, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">Invalid coordinate</small>
-                    <span ng-show="hasError(deliveryServiceForm.missLong)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.edgeHeaderRewrite), 'has-feedback': hasError(deliveryServiceForm.edgeHeaderRewrite)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Edge Header Rewrite Rules</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="edgeHeaderRewrite" name="edgeHeaderRewrite" type="text" class="form-control" ng-model="deliveryService.edgeHeaderRewrite" ng-maxlength="2048" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.edgeHeaderRewrite, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.edgeHeaderRewrite)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.midHeaderRewrite), 'has-feedback': hasError(deliveryServiceForm.midHeaderRewrite)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Mid Header Rewrite Rules</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="midHeaderRewrite" name="midHeaderRewrite" type="text" class="form-control" ng-model="deliveryService.midHeaderRewrite" ng-maxlength="2048" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.midHeaderRewrite, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.midHeaderRewrite)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trResponseHeaders), 'has-feedback': hasError(deliveryServiceForm.trResponseHeaders)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Additional Response Headers</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="trResponseHeaders" name="trResponseHeaders" type="text" class="form-control" ng-model="deliveryService.trResponseHeaders" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trResponseHeaders, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.trResponseHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trRequestHeaders), 'has-feedback': hasError(deliveryServiceForm.trRequestHeaders)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Log Request Headers</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="trRequestHeaders" name="trRequestHeaders" type="text" class="form-control" ng-model="deliveryService.trRequestHeaders" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trRequestHeaders, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.trRequestHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.regexRemap), 'has-feedback': hasError(deliveryServiceForm.regexRemap)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Regex remap expression</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="regexRemap" name="regexRemap" type="text" class="form-control" ng-model="deliveryService.regexRemap" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.regexRemap, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.regexRemap)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cacheurl), 'has-feedback': hasError(deliveryServiceForm.cacheurl)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Cache URL expression</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="cacheurl" name="cacheurl" type="text" class="form-control" ng-model="deliveryService.cacheurl" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cacheurl, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.cacheurl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.remapText), 'has-feedback': hasError(deliveryServiceForm.remapText)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Raw remap text</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="remapText" name="remapText" type="text" class="form-control" ng-model="deliveryService.remapText" ng-maxlength="2048" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.remapText, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.remapText)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc), 'has-feedback': hasError(deliveryServiceForm.longDesc)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="longDesc" name="longDesc" type="text" class="form-control" ng-model="deliveryService.longDesc" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.longDesc)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc1), 'has-feedback': hasError(deliveryServiceForm.longDesc1)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 1</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="longDesc1" name="longDesc1" type="text" class="form-control" ng-model="deliveryService.longDesc1" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc1, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.longDesc1)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc2), 'has-feedback': hasError(deliveryServiceForm.longDesc2)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 2</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="longDesc2" name="longDesc2" type="text" class="form-control" ng-model="deliveryService.longDesc2" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc2, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.longDesc2)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.infoUrl), 'has-feedback': hasError(deliveryServiceForm.infoUrl)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Info URL</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="infoUrl" name="infoUrl" type="text" class="form-control" ng-model="deliveryService.infoUrl" ng-maxlength="255" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.infoUrl, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.infoUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.checkPath), 'has-feedback': hasError(deliveryServiceForm.checkPath)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Check Path</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="checkPath" name="checkPath" type="text" class="form-control" ng-model="deliveryService.checkPath" ng-maxlength="255" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.checkPath, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.checkPath)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.originShield), 'has-feedback': hasError(deliveryServiceForm.originShield)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Origin Shield (Pipe Delimited String)</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="originShield" name="originShield" type="text" class="form-control" ng-model="deliveryService.originShield" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.originShield, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.originShield)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.sslKeyVersion), 'has-feedback': hasError(deliveryServiceForm.sslKeyVersion)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">SSL Key Version</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="sslKeyVersion" name="sslKeyVersion" type="text" class="form-control" ng-model="deliveryService.sslKeyVersion" ng-maxlength="11" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.sslKeyVersion, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.sslKeyVersion)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.regionalGeoBlocking), 'has-feedback': hasError(deliveryServiceForm.regionalGeoBlocking)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Regional Geoblocking *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="regionalGeoBlocking" name="regionalGeoBlocking" class="form-control" ng-model="deliveryService.regionalGeoBlocking" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.regionalGeoBlocking, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.logsEnabled), 'has-feedback': hasError(deliveryServiceForm.logsEnabled)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Logs Enabled *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="logsEnabled" name="logsEnabled" class="form-control" ng-model="deliveryService.logsEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.logsEnabled, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(deliveryService)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/directives/match/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/directives/match/index.js b/traffic_portal/app/src/common/directives/match/index.js
index 2abd130..a272219 100644
--- a/traffic_portal/app/src/common/directives/match/index.js
+++ b/traffic_portal/app/src/common/directives/match/index.js
@@ -1,20 +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.
  */
 
+//application directives
 module.exports = angular.module('trafficPortal.directives.match',[])
     .directive('match', require('./MatchDirective'))
 ;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/directives/rcSubmit/RCSubmitDirective.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/directives/rcSubmit/RCSubmitDirective.js b/traffic_portal/app/src/common/directives/rcSubmit/RCSubmitDirective.js
deleted file mode 100644
index be42077..0000000
--- a/traffic_portal/app/src/common/directives/rcSubmit/RCSubmitDirective.js
+++ /dev/null
@@ -1,91 +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 rcSubmitDirective = {
-    'rcSubmit': ['$parse', function ($parse) {
-        return {
-            restrict: 'A',
-            require: ['rcSubmit', '?form'],
-            controller: ['$scope', function ($scope) {
-
-                var formController = null;
-                var attemptHandlers = [];
-
-                this.attempted = false;
-
-                this.onAttempt = function(handler) {
-                    attemptHandlers.push(handler);
-                };
-
-                this.setAttempted = function() {
-                    this.attempted = true;
-
-                    angular.forEach(attemptHandlers, function (handler) {
-                        handler();
-                    });
-                };
-
-                this.setFormController = function(controller) {
-                    formController = controller;
-                };
-
-                this.needsAttention = function (fieldModelController) {
-                    if (!formController) return false;
-
-                    if (fieldModelController) {
-                        return fieldModelController.$invalid &&
-                            (fieldModelController.$dirty || this.attempted);
-                    } else {
-                        return formController && formController.$invalid &&
-                            (formController.$dirty || this.attempted);
-                    }
-                };
-            }],
-            compile: function(cElement, cAttributes, transclude) {
-                return {
-                    pre: function(scope, formElement, attributes, controllers) {
-
-                        var submitController = controllers[0];
-                        var formController = (controllers.length > 1) ? controllers[1] : null;
-
-                        submitController.setFormController(formController);
-
-                        scope.rc = scope.rc || {};
-                        scope.rc[attributes.name] = submitController;
-                    },
-                    post: function(scope, formElement, attributes, controllers) {
-
-                        var submitController = controllers[0];
-                        var formController = (controllers.length > 1) ? controllers[1] : null;
-                        var fn = $parse(attributes.rcSubmit);
-
-                        formElement.bind('submit', function () {
-                            submitController.setAttempted();
-                            if (!scope.$$phase) scope.$apply();
-
-                            if (!formController.$valid) return false;
-
-                            scope.$apply(function() {
-                                fn(scope, {$event:event});
-                            });
-                        });
-                    }
-                };
-            }
-        };
-    }]
-};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/directives/rcSubmit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/directives/rcSubmit/index.js b/traffic_portal/app/src/common/directives/rcSubmit/index.js
deleted file mode 100644
index a5ca41c..0000000
--- a/traffic_portal/app/src/common/directives/rcSubmit/index.js
+++ /dev/null
@@ -1,19 +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.directives.rcSubmit',[])
-    .directive('rcSubmit', require('./RCSubmitDirective'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/directives/rcVerifySet/RCVerifySetDirective.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/directives/rcVerifySet/RCVerifySetDirective.js b/traffic_portal/app/src/common/directives/rcVerifySet/RCVerifySetDirective.js
deleted file mode 100644
index ae9f86a..0000000
--- a/traffic_portal/app/src/common/directives/rcVerifySet/RCVerifySetDirective.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.
-
- */
-
-var rcVerifySetDirective = {
-    'rcVerifySet': function () {
-        return {
-            restrict: 'A',
-            require: ['^rcSubmit', 'ngModel'],
-            link: function (scope, element, attributes, controllers) {
-                var submitController = controllers[0];
-                var modelController = controllers[1];
-
-                submitController.onAttempt(function() {
-                    modelController.$setViewValue(element.val());
-                });
-            }
-        };
-    }
-};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/directives/rcVerifySet/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/directives/rcVerifySet/index.js b/traffic_portal/app/src/common/directives/rcVerifySet/index.js
deleted file mode 100644
index d9131f1..0000000
--- a/traffic_portal/app/src/common/directives/rcVerifySet/index.js
+++ /dev/null
@@ -1,19 +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.directives.rcVerifySet',[])
-    .directive('rcVerifySet', require('./RCVerifySetDirective'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/directives/selectOnClick/SelectOnClickDirective.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/directives/selectOnClick/SelectOnClickDirective.js b/traffic_portal/app/src/common/directives/selectOnClick/SelectOnClickDirective.js
deleted file mode 100644
index fdd154b..0000000
--- a/traffic_portal/app/src/common/directives/selectOnClick/SelectOnClickDirective.js
+++ /dev/null
@@ -1,29 +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 SelectOnClickDirective = function() {
-    return {
-        restrict: 'A',
-        link: function (scope, element, attrs) {
-            element.on('click', function () {
-                this.select();
-            });
-        }
-    };
-};
-
-module.exports = SelectOnClickDirective;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/directives/selectOnClick/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/directives/selectOnClick/index.js b/traffic_portal/app/src/common/directives/selectOnClick/index.js
deleted file mode 100644
index ad45830..0000000
--- a/traffic_portal/app/src/common/directives/selectOnClick/index.js
+++ /dev/null
@@ -1,19 +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.directives.selectOnClick',[])
-    .directive('selectOnClick', require('./SelectOnClickDirective'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/filters/DateRangeFilter.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/filters/DateRangeFilter.js b/traffic_portal/app/src/common/filters/DateRangeFilter.js
deleted file mode 100644
index b5f9d1c..0000000
--- a/traffic_portal/app/src/common/filters/DateRangeFilter.js
+++ /dev/null
@@ -1,32 +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 DateRangeFilter = function() {
-    return function(items, dateRange) {
-        if (_.isUndefined(dateRange)) return items;
-        var filteredItems = _.filter(items, function(item) {
-            return (
-                ( moment(item.date).isAfter(dateRange.start, 'day') || moment(item.date).isSame(dateRange.start, 'day') ) &&
-                ( moment(item.date).isBefore(dateRange.end, 'day') || moment(item.date).isSame(dateRange.end, 'day') )
-            );
-        });
-        return filteredItems;
-    };
-};
-
-DateRangeFilter.$inject = [];
-module.exports = DateRangeFilter;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/filters/OffsetFilter.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/filters/OffsetFilter.js b/traffic_portal/app/src/common/filters/OffsetFilter.js
index 0e0e9c0..8f9a5a8 100644
--- a/traffic_portal/app/src/common/filters/OffsetFilter.js
+++ b/traffic_portal/app/src/common/filters/OffsetFilter.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.
  */
 
 var OffsetFilter = function() {
@@ -24,5 +26,5 @@ var OffsetFilter = function() {
     };
 };
 
-OffsetFilter.$inject = [];
+OffsetFilter.$inject = ['$log'];
 module.exports = OffsetFilter;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/filters/PartitionFilter.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/filters/PartitionFilter.js b/traffic_portal/app/src/common/filters/PartitionFilter.js
deleted file mode 100644
index d3f03af..0000000
--- a/traffic_portal/app/src/common/filters/PartitionFilter.js
+++ /dev/null
@@ -1,37 +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 PartitionFilter = function() {
-    var cache = {};
-    return function(arr, size) {
-        if (!arr) { return; }
-        var newArr = [];
-        for (var i=0; i<arr.length; i+=size) {
-            newArr.push(arr.slice(i, i+size));
-        }
-        var arrString = JSON.stringify(arr);
-        var fromCache = cache[arrString+size];
-        if (JSON.stringify(fromCache) === JSON.stringify(newArr)) {
-            return fromCache;
-        }
-        cache[arrString+size] = newArr;
-        return newArr;
-    };
-};
-
-PartitionFilter.$inject = [];
-module.exports = PartitionFilter;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/filters/PercentFilter.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/filters/PercentFilter.js b/traffic_portal/app/src/common/filters/PercentFilter.js
index 3f871e3..fba2de1 100644
--- a/traffic_portal/app/src/common/filters/PercentFilter.js
+++ b/traffic_portal/app/src/common/filters/PercentFilter.js
@@ -1,32 +1,34 @@
 /*
-
-
- 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 PercentFilter = function() {
-    return function(input) {
-        input = parseFloat(input);
-        input *= 100;
-        if(input % 1 === 0) {
-            input = input.toFixed(0);
-        }
-        else {
-            input = input.toFixed(2);
-        }
-        return input + '%';
-    };
+	return function(input) {
+		input = parseFloat(input);
+		input *= 100;
+		if(input % 1 === 0) {
+			input = input.toFixed(0);
+		}
+		else {
+			input = input.toFixed(2);
+		}
+		return input + '%';
+	};
 };
 
 PercentFilter.$inject = [];

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/filters/UnitsFilter.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/filters/UnitsFilter.js b/traffic_portal/app/src/common/filters/UnitsFilter.js
deleted file mode 100644
index eff8a8d..0000000
--- a/traffic_portal/app/src/common/filters/UnitsFilter.js
+++ /dev/null
@@ -1,26 +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 UnitsFilter = function(numberUtils) {
-    return function(kilobits, prettify) {
-        var friendlyUnit = numberUtils.shrink(kilobits);
-        return (prettify) ? numberUtils.addCommas(friendlyUnit[0]) + ' ' + friendlyUnit[1] : friendlyUnit[0];
-    };
-};
-
-UnitsFilter.$inject = ['numberUtils'];
-module.exports = UnitsFilter;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/filters/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/filters/index.js b/traffic_portal/app/src/common/filters/index.js
old mode 100755
new mode 100644
index 0422370..5604d10
--- a/traffic_portal/app/src/common/filters/index.js
+++ b/traffic_portal/app/src/common/filters/index.js
@@ -1,25 +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.filters', [])
-    //filters
-    .filter('dateRangeFilter', require('./DateRangeFilter'))
     .filter('offsetFilter', require('./OffsetFilter'))
-    .filter('partitionFilter', require('./PartitionFilter'))
-    .filter('percentFilter', require('./PercentFilter'))
-    .filter('unitsFilter', require('./UnitsFilter'))
+	.filter('percentFilter', require('./PercentFilter'))
 ;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/models/AuthModel.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/models/AuthModel.js b/traffic_portal/app/src/common/models/AuthModel.js
deleted file mode 100644
index ac61e9a..0000000
--- a/traffic_portal/app/src/common/models/AuthModel.js
+++ /dev/null
@@ -1,21 +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 AuthModel = function() {};
-
-AuthModel.$inject = [];
-module.exports = AuthModel;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/models/ChangeLogModel.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/models/ChangeLogModel.js b/traffic_portal/app/src/common/models/ChangeLogModel.js
new file mode 100644
index 0000000..48c7b81
--- /dev/null
+++ b/traffic_portal/app/src/common/models/ChangeLogModel.js
@@ -0,0 +1,73 @@
+/*
+ * 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 ChangeLogModel = function($rootScope, $interval, changeLogService, userModel) {
+
+	var newLogCount = 0,
+		pollingIntervalInSecs = 30,
+		changeLogInterval;
+
+	this.newLogCount = function() {
+		return newLogCount;
+	};
+
+	var createChangeLogInterval = function() {
+		killChangeLogInterval();
+		changeLogInterval = $interval(function() { getNewLogCount() }, (pollingIntervalInSecs*1000)); // every X minutes
+	};
+
+	var killChangeLogInterval = function() {
+		if (angular.isDefined(changeLogInterval)) {
+			$interval.cancel(changeLogInterval);
+			changeLogInterval = undefined;
+		}
+	};
+
+	var getNewLogCount = function() {
+		changeLogService.getNewLogCount()
+			.then(function(result) {
+				newLogCount = result.data.response.newLogcount;
+			});
+	};
+
+	$rootScope.$on('authService::login', function() {
+		getNewLogCount();
+		createChangeLogInterval();
+	});
+
+	$rootScope.$on('authService::logout', function() {
+		killChangeLogInterval();
+	});
+
+	$rootScope.$on('changeLogService::getChangeLogs', function() {
+		newLogCount = 0;
+	});
+
+	var init = function () {
+		if (userModel.loaded) {
+			getNewLogCount();
+			createChangeLogInterval();
+		}
+	};
+	init();
+
+};
+
+ChangeLogModel.$inject = ['$rootScope', '$interval', 'changeLogService', 'userModel'];
+module.exports = ChangeLogModel;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/models/ChartModel.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/models/ChartModel.js b/traffic_portal/app/src/common/models/ChartModel.js
deleted file mode 100644
index 6a7c74f..0000000
--- a/traffic_portal/app/src/common/models/ChartModel.js
+++ /dev/null
@@ -1,138 +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 ChartModel = function($rootScope, $location, $interval, messageModel) {
-
-    var chart,
-        model = this;
-
-    var autoRefreshInterval;
-
-    var increment = 1,
-        unit = 'm';
-
-    var createAutoRefreshInterval = function() {
-        killAutoRefreshInterval();
-        autoRefreshInterval = $interval(function() { rollDates() }, (increment*60*1000)); // every X minutes
-    };
-
-    var killAutoRefreshInterval = function() {
-        if (angular.isDefined(autoRefreshInterval)) {
-            $interval.cancel(autoRefreshInterval);
-            autoRefreshInterval = undefined;
-        }
-    };
-
-    var rollDates = function() {
-        var locationStart = $location.search().start,
-            locationEnd = $location.search().end;
-
-        model.chart.start = moment(model.chart.start).add(increment, unit);
-        model.chart.end = moment(model.chart.end).add(increment, unit);
-
-        if (locationStart) {
-            $location.search('start', model.chart.start.format());
-        }
-
-        if (locationEnd) {
-            $location.search('end', model.chart.end.format());
-        }
-
-        $rootScope.$broadcast('chartModel::dateRoll', { start: model.chart.start, end: model.chart.end });
-    };
-
-    this.resetChart = function() {
-        var start = $location.search().start,
-            end = $location.search().end;
-
-        chart = {};
-        chart.start = moment().subtract(1, 'd');
-        chart.end = moment();
-        chart.autoRefresh = true;
-
-        if (angular.isDefined(start) && angular.isDefined(end)) {
-            if (moment(start).isValid() && moment(end).isValid()) {
-                chart.start = moment(start);
-                chart.end =  moment(end);
-                chart.autoRefresh = false;
-            } else {
-                messageModel.setMessages([ { level: 'error', text: 'Invalid date format detected. Reverting to default.' } ], true);
-            }
-        }
-
-        if (chart.autoRefresh) {
-            createAutoRefreshInterval();
-        } else {
-            killAutoRefreshInterval();
-        }
-
-        var rangeParams = model.calculateRange(chart.start, chart.end);
-        chart.range = chart.end.diff(chart.start, rangeParams.interval) + rangeParams.abbrev;
-        if (!rangeParams.exact) {
-            chart.range = '~' + chart.range;
-        }
-
-        this.chart = chart;
-    };
-
-    this.changeDates = function(start, end) {
-        $location.search('start', start.format());
-        $location.search('end', end.format());
-        $rootScope.$broadcast('chartModel::dateChange', { start: start, end: end });
-    };
-
-    this.calculateRange = function(start, end) {
-        // if greater than 1d, use day, if greater than 1hr, use hr, else minute
-        var rangeParams = {};
-        if (end.diff(start, 'days', true) >= 1) {
-            rangeParams = { interval: 'days', abbrev: 'd', exact: (end.diff(start, 'days', true) % 1) == 0 };
-        } else if (end.diff(start, 'hours', true) >= 1) {
-            rangeParams = { interval: 'hours', abbrev: 'h', exact: (end.diff(start, 'hours', true) % 1) == 0 };
-        } else {
-            rangeParams = { interval: 'minutes', abbrev: 'm', exact: (end.diff(start, 'minutes', true) % 1) == 0 };
-        }
-        return rangeParams;
-    };
-
-    $rootScope.$watch(
-        function() { return model.chart.autoRefresh; },
-        function(newValue, oldValue) {
-            if (newValue !== oldValue) {
-                if (newValue) {
-                    createAutoRefreshInterval();
-                } else {
-                    killAutoRefreshInterval();
-                }
-            }
-        }
-    );
-
-    $rootScope.$watch('online', function(newStatus) {
-        if (newStatus === false) {
-            model.chart.autoRefresh = false;
-        }
-    });
-
-    var init = function () {
-        model.resetChart();
-    };
-    init();
-
-};
-
-ChartModel.$inject = ['$rootScope', '$location', '$interval', 'messageModel'];
-module.exports = ChartModel;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/models/DeliveryServicesModel.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/models/DeliveryServicesModel.js b/traffic_portal/app/src/common/models/DeliveryServicesModel.js
deleted file mode 100644
index 260541f..0000000
--- a/traffic_portal/app/src/common/models/DeliveryServicesModel.js
+++ /dev/null
@@ -1,45 +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 DeliveryServicesModel = function() {
-
-    var model = this;
-
-    var deliveryServices = [];
-    var loaded = false;
-
-    this.deliveryServices = deliveryServices;
-    this.loaded = loaded;
-
-    this.getDeliveryService = function(dsId) {
-        return _.find(model.deliveryServices, function(ds){ return parseInt(ds.id) == parseInt(dsId) });
-    };
-
-    this.setDeliveryServices = function(deliveryServicesData) {
-        this.deliveryServices = deliveryServicesData;
-        this.loaded = true;
-    };
-
-    this.resetDeliveryServices = function() {
-        this.deliveryServices = [];
-        this.loaded = false;
-    };
-
-};
-
-DeliveryServicesModel.$inject = [];
-module.exports = DeliveryServicesModel;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/models/MessageModel.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/models/MessageModel.js b/traffic_portal/app/src/common/models/MessageModel.js
index ca0d007..279602b 100644
--- a/traffic_portal/app/src/common/models/MessageModel.js
+++ b/traffic_portal/app/src/common/models/MessageModel.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.
  */
 
 var MessageModel = function($rootScope) {

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/models/PropertiesModel.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/models/PropertiesModel.js b/traffic_portal/app/src/common/models/PropertiesModel.js
index 32c8a73..5720a18 100644
--- a/traffic_portal/app/src/common/models/PropertiesModel.js
+++ b/traffic_portal/app/src/common/models/PropertiesModel.js
@@ -13,17 +13,17 @@
  See the License for the specific language governing permissions and
  limitations under the License.
 
- */
+*/
 
 var PropertiesModel = function() {
 
-    this.properties = {};
-    this.loaded = false;
+	this.properties = {};
+	this.loaded = false;
 
-    this.setProperties = function(properties) {
-        this.properties = properties;
-        this.loaded = true;
-    };
+	this.setProperties = function(properties) {
+		this.properties = properties;
+		this.loaded = true;
+	};
 
 };
 

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/models/UserModel.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/models/UserModel.js b/traffic_portal/app/src/common/models/UserModel.js
old mode 100755
new mode 100644
index 07f39c2..bf1c624
--- a/traffic_portal/app/src/common/models/UserModel.js
+++ b/traffic_portal/app/src/common/models/UserModel.js
@@ -1,46 +1,42 @@
 /*
-
-
- 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 UserModel = function($rootScope, messageModel) {
+var UserModel = function($rootScope) {
+
+    this.loaded = false;
 
-    var user = {};
-    user.loaded = false;
-    this.user = user;
+    this.user = {};
 
     this.setUser = function(userData) {
-        user.loaded = true;
-        user = angular.extend(user, userData);
-        if (user.newUser) {
-            user.username = ''; // new users were given a temp username that needs to be ditched
-        }
-        if (!user.localUser) {
-            messageModel.setMessages([ { level: 'success', text: 'Logged in as read-only user.' } ], false);
-        }
-        $rootScope.$broadcast('userModel::userUpdated', user);
+        this.loaded = true;
+        this.user = userData;
+        $rootScope.$broadcast('userModel::userUpdated', this.user);
     };
 
     this.resetUser = function() {
-        user = {};
-        user.loaded = false;
-        this.user = user;
-        $rootScope.$broadcast('userModel::userUpdated', user);
+        this.loaded = false;
+        this.userId = 0;
+        this.user = {};
+        $rootScope.$broadcast('userModel::userUpdated', this.user);
     };
 
 };
 
-UserModel.$inject = ['$rootScope', 'messageModel'];
-module.exports = UserModel;
\ No newline at end of file
+UserModel.$inject = ['$rootScope'];
+module.exports = UserModel;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/models/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/models/index.js b/traffic_portal/app/src/common/models/index.js
old mode 100755
new mode 100644
index 873c311..7c35171
--- a/traffic_portal/app/src/common/models/index.js
+++ b/traffic_portal/app/src/common/models/index.js
@@ -1,24 +1,24 @@
 /*
-
-
- 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.models', [])
-    .service('authModel', require('./AuthModel'))
-    .service('chartModel', require('./ChartModel'))
-    .service('deliveryServicesModel', require('./DeliveryServicesModel'))
+    .service('changeLogModel', require('./ChangeLogModel'))
     .service('messageModel', require('./MessageModel'))
-    .service('propertiesModel', require('./PropertiesModel'))
-    .service('userModel', require('./UserModel'));
+	.service('propertiesModel', require('./PropertiesModel'))
+	.service('userModel', require('./UserModel'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/cacheGroups/CacheGroupsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/cacheGroups/CacheGroupsController.js b/traffic_portal/app/src/common/modules/cacheGroups/CacheGroupsController.js
deleted file mode 100644
index 93e94fa..0000000
--- a/traffic_portal/app/src/common/modules/cacheGroups/CacheGroupsController.js
+++ /dev/null
@@ -1,83 +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 CacheGroupsController = function(entityId, service, showDownload, $scope, $rootScope, $interval, jsonUtils, messageModel) {
-
-    var locationsInterval;
-
-    var getLocations = function(showTimeoutError) {
-        if (!$rootScope.online) return;
-
-        var ignoreLoadingBar = true;
-        service.getCacheGroupHealth(entityId, ignoreLoadingBar, showTimeoutError)
-            .then(
-            function(response) {
-                $scope.locationHealth = response;
-            },
-            function(fault) {
-                // do nothing
-            }).finally(function() {
-                $scope.loaded = true;
-            });
-    };
-
-    $scope.loaded = false;
-
-    $scope.showDownload = showDownload;
-
-    $scope.locationHealth = {
-        totalOnline: 0,
-        totalOffline: 0,
-        locations: []
-    };
-
-    // pagination
-    $scope.currentLocationPage = 1;
-    $scope.locationsPerPage = 10;
-
-    $scope.onlinePercent = function(location) {
-        return location.online / (location.online + location.offline);
-    };
-
-    $scope.downloadCaches = function() {
-        service.getServers(entityId, false)
-            .then(
-                function(response) {
-                    jsonUtils.convertToCSV(response, 'Caches', ['hostName', 'domainName', 'type', 'cachegroup', 'ipAddress', 'ip6Address']);
-                },
-                function(fault) {
-                    messageModel.setMessages([ { level: 'error', text: 'Failed to download cache servers.' } ], false);
-                }
-            );
-    };
-
-    $scope.$on("$destroy", function() {
-        if (angular.isDefined(locationsInterval)) {
-            $interval.cancel(locationsInterval);
-            locationsInterval = undefined;
-        }
-    });
-
-    var init = function () {
-        getLocations(true);
-        locationsInterval = $interval(function() { getLocations(false) }, 60 * 1000);
-    };
-    init();
-};
-
-CacheGroupsController.$inject = ['entityId', 'service', 'showDownload', '$scope', '$rootScope', '$interval', 'jsonUtils', 'messageModel'];
-module.exports = CacheGroupsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/cacheGroups/_cacheGroups.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/cacheGroups/_cacheGroups.scss b/traffic_portal/app/src/common/modules/cacheGroups/_cacheGroups.scss
deleted file mode 100644
index 01c8d51..0000000
--- a/traffic_portal/app/src/common/modules/cacheGroups/_cacheGroups.scss
+++ /dev/null
@@ -1,74 +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.
-
-*/
-
-#cache-groups-outer-container {
-
-  #cacheGroupsOverallHealth {
-
-    position: relative;
-
-    .download-caches-file {
-      position: absolute;
-      top: 10px;
-      right: 20px;
-    }
-
-  }
-
-  #cacheGroupsContainer {
-    max-height: 452px;
-    margin-bottom: 0;
-
-    .list-group-item {
-      background-color: transparent;
-    }
-
-    .cache-group-health {
-      height: 45px;
-
-      .cache-groups-table {
-        margin-top: -10px;
-        border-style: none;
-
-        td {
-          border-top: none !important;
-          padding: 12px 8px !important;
-        }
-
-      }
-
-    }
-
-  }
-
-  .cache-groups-pagination {
-    margin: 0 0 10px 0;
-    float: left;
-  }
-
-  .cache-group-search-form {
-    float: right;
-    width: 250px;
-    margin-bottom: 10px;
-  }
-
-}
-
-#cacheGroupsLoadingContainer {
-  height: 555px;
-  background-color: transparent;
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/cacheGroups/cacheGroups.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/cacheGroups/cacheGroups.tpl.html b/traffic_portal/app/src/common/modules/cacheGroups/cacheGroups.tpl.html
deleted file mode 100644
index 0db1915..0000000
--- a/traffic_portal/app/src/common/modules/cacheGroups/cacheGroups.tpl.html
+++ /dev/null
@@ -1,55 +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="cache-groups-outer-container" ng-show="loaded">
-    <div id="cacheGroupsOverallHealth">
-        <h4 class="cache-groups-online">Cache Groups <small>{{locationHealth.totalOnline/(locationHealth.totalOnline + locationHealth.totalOffline) | percentFilter}} online</small></h4>
-        <i class="download-caches-file fa fa-download fa-lg" title="Download Cache Servers" ng-click="downloadCaches()" ng-show="showDownload"></i>
-    </div>
-    <div id="cacheGroupsContainer">
-        <div class="alert alert-info" ng-show="(locationHealth.cachegroups | filter:search:strict).length == 0">
-            No matching cache groups
-        </div>
-        <div class="list-group">
-            <a class="cache-group-health list-group-item" ng-repeat="location in locationHealth.cachegroups | orderBy:[onlinePercent, 'name'] | filter:search:strict | offsetFilter:(currentLocationPage-1)*locationsPerPage | limitTo:locationsPerPage">
-                <div class="row">
-                    <table class="cache-groups-table table">
-                        <tbody>
-                        <tr>
-                            <td class="col-lg-4 col-md-4 col-sm-4">{{location.name}}</td>
-                            <td class="col-lg-4 col-md-4 col-sm-4">{{location.online/(location.online + location.offline) | percentFilter}} Online</td>
-                            <td class="col-lg-4 col-md-4 col-sm-4">{{location.online}} Servers Online | {{location.offline}} Servers Offline</td>
-                        </tr>
-                        </tbody>
-                    </table>
-                </div>
-            </a>
-        </div>
-    </div>
-    <div>
-        <div ng-show="(locationHealth.cachegroups | filter:search:strict).length > 0">
-            <uib-pagination class="cache-groups-pagination pagination-md" boundary-links="true" max-size="2" total-items="(locationHealth.cachegroups | filter:search:strict).length" items-per-page="locationsPerPage" ng-model="currentLocationPage" previous-text="&lsaquo;" next-text="&rsaquo;" first-text="&laquo;" last-text="&raquo;"></uib-pagination>
-        </div>
-        <div class="input-group cache-group-search-form">
-            <input type="text" class="filter-input form-control" placeholder="Filter cache groups..." ng-model="search.name">
-            <span class="filter-input-group-btn input-group-btn">
-                <button class="btn btn-default" type="button"><i class="fa fa-search"></i></button>
-            </span>
-        </div>
-    </div>
-</div>
-<div id="cacheGroupsLoadingContainer" class="jumbotron loading-text" ng-show="!loaded">Loading cache groups...</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/cacheGroups/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/cacheGroups/index.js b/traffic_portal/app/src/common/modules/cacheGroups/index.js
deleted file mode 100644
index 7c15e75..0000000
--- a/traffic_portal/app/src/common/modules/cacheGroups/index.js
+++ /dev/null
@@ -1,19 +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.cacheGroups', [])
-    .controller('CacheGroupsController', require('./CacheGroupsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/_chart.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/_chart.scss b/traffic_portal/app/src/common/modules/chart/_chart.scss
deleted file mode 100644
index 31e8284..0000000
--- a/traffic_portal/app/src/common/modules/chart/_chart.scss
+++ /dev/null
@@ -1,89 +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.
-
-*/
-
-.metrics {
-  .header {
-    padding: 10px;
-    margin-top: 20px;
-    margin-bottom: 0px;
-  }
-  .summary-hr {
-    margin-top: 5px;
-    margin-bottom: 5px;
-  }
-}
-
-.show-summary-header {
-  height: 10px;
-}
-
-.show-summary {
-  float: right;
-}
-
-.hide-summary {
-  position: absolute;
-  top: 35px;
-  right: 25px;
-}
-
-.summary-metrics {
-  font-size: 13px;
-  padding: 10px;
-
-  table {
-    margin-bottom: 0px;
-  }
-
-  .total {
-    text-transform: uppercase;
-  }
-
-}
-
-.nav > li > a:hover, .nav > li > a:focus {
-  text-decoration: underline;
-  background-color: transparent;
-}
-
-.nav-pills > li.header {
-  text-align: center;
-  color: #fff;
-  background-color: #428bca;
-  padding: 22px;
-  font-size: 16px;
-}
-
-.nav-pills > li > a {
-  border-radius: 0px;
-}
-
-.nav-stacked > li {
-  margin-top: 0px !important;
-  margin-left: 0;
-  border-bottom:1px solid #A8A8A8;
-  border-left:1px solid #A8A8A8;
-  border-right:1px solid #A8A8A8;
-  &:first-child {
-    border-top:1px solid #A8A8A8;
-    border-bottom:2px solid #A8A8A8;
-  }
-}
-
-.selected-chart {
-  border-right:4px solid #428bca;
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/ChartBandwidthPerSecondController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/ChartBandwidthPerSecondController.js b/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/ChartBandwidthPerSecondController.js
deleted file mode 100644
index f5221a9..0000000
--- a/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/ChartBandwidthPerSecondController.js
+++ /dev/null
@@ -1,224 +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 ChartBandwidthPerSecondController = function(entity, showSummary, $rootScope, $scope, $uibModal, $q, $timeout, $filter, dateUtils, numberUtils, messageModel, propertiesModel, statsService) {
-
-    $scope.chartName = propertiesModel.properties.charts.bandwidthPerSecond.name;
-
-    var chartDatesChanged = false,
-        chartStart,
-        chartEnd;
-
-    var summaryStart,
-        summaryEnd;
-
-    var chartRangeTimer;
-
-    var loadBandwidth = function(start, end) {
-        if (!entity || !chartDatesChanged) return;
-        chartDatesChanged = false;
-        $scope.bandwidthChartDates = {
-            start: start,
-            end: end
-        };
-        getBandwidth(start, end);
-        $scope.refreshBpsSummaryMetrics(0);
-    };
-
-    var getBandwidth = function(start, end) {
-
-        var exclude = '',
-            ignoreLoadingBar = true,
-            showError = true,
-            promises = [];
-
-        // edge bandwidth
-        promises.push(statsService.getEdgeBandwidth(entity, start, end, $scope.bandwidthChartInterval, exclude, ignoreLoadingBar, showError));
-
-        $q.all(promises)
-            .then(
-                function(responses) {
-                    // set chart data
-                    var edgeBandwidthChartData = buildEdgeBandwidthChartData(responses[0], start, false);
-
-                    $timeout(function () {
-                        buildBandwidthChart(edgeBandwidthChartData);
-                    }, 100);
-                },
-                function(fault) {
-                    buildBandwidthChart([]); // build an empty chart
-                }).finally(function() {
-                    $scope.bandwidthLoaded = true;
-                });
-    };
-
-    var buildEdgeBandwidthChartData = function(result, start, incremental) {
-        var normalizedChartData = [],
-            summary = result.summary,
-            series = result.series;
-
-        if (angular.isDefined(series)) {
-            if (!incremental && angular.isDefined(summary)) {
-                $scope.unitSize = numberUtils.shrink(summary.average)[1];
-            }
-            _.each(series.values, function(seriesItem) {
-                if (moment(seriesItem[0]).isSame(start) || moment(seriesItem[0]).isAfter(start)) {
-                    if (_.isNumber(seriesItem[1]) || !incremental) {
-                        normalizedChartData.push([ moment(seriesItem[0]).valueOf(), numberUtils.convertTo(seriesItem[1], $scope.unitSize) ]); // converts data to appropriate unit
-                    }
-                }
-            });
-        }
-
-        return normalizedChartData;
-    };
-
-    var buildBandwidthChart = function(edgeBandwidthChartData) {
-
-        var options = {
-            xaxis: {
-                mode: "time",
-                timezone: "browser",
-                twelveHourClock: true
-            },
-            yaxes: [
-                {
-                    position: "left",
-                    axisLabel: $scope.unitSize + "ps",
-                    axisLabelUseCanvas: true,
-                    axisLabelFontSizePixels: 12,
-                    axisLabelFontFamily: 'Verdana, Arial',
-                    axisLabelPadding: 3
-                }
-            ],
-            grid: { hoverable: true },
-            tooltip: {
-                show: true,
-                content: function(label, xval, yval, flotItem){
-                    var tooltipString = dateUtils.dateFormat(xval, "ddd mmm d yyyy h:MM:ss tt (Z)") + '<br>';
-                    tooltipString += '<span>' + label + ': ' + $filter('number')(yval, 2) + ' ' + $scope.unitSize + 'ps</span><br>'
-                    return tooltipString;
-                }
-            }
-        };
-
-        $.plot($("#bps-chart"), [ { label: "Edge", data: edgeBandwidthChartData } ], options);
-
-    };
-
-    var updateChartDates = function(start, end) {
-        $scope.dateRangeText = dateUtils.dateFormat(start.toDate(), "ddd mmm d yyyy h:MM tt (Z)") + ' to ' + dateUtils.dateFormat(end.toDate(), "ddd mmm d yyyy h:MM tt (Z)");
-    };
-
-    var getSummaryMetrics = function(start, end) {
-
-        var exclude = 'series',
-            ignoreLoadingBar = true,
-            showError = false,
-            promises = [];
-
-        // edge summary
-        promises.push(statsService.getEdgeBandwidthSummary(entity, start, end, $scope.bandwidthChartInterval, exclude, ignoreLoadingBar, showError));
-
-        $q.all(promises)
-            .then(
-                function(responses) {
-                    var edgeSummary = responses[0].summary;
-                    if (angular.isDefined(edgeSummary)) {
-                        $scope.bpsEdgeSummary = edgeSummary;
-                    } else {
-                        $scope.resetEdgeSummary();
-                    }
-                },
-                function(fault) {
-                    $scope.resetEdgeSummary();
-                }).finally(function() {
-                    $scope.updatingBpsSummaryMetrics = false;
-                });
-    };
-
-    var onDateChange = function(args) {
-        chartDatesChanged = true;
-        chartStart = args.start;
-        chartEnd = args.end;
-        summaryStart = args.start;
-        summaryEnd = args.end;
-        updateChartDates(chartStart, chartEnd);
-        loadBandwidth(chartStart, chartEnd);
-    };
-
-    $scope.showSummary = showSummary;
-
-    $scope.updatingBpsSummaryMetrics = false;
-
-    $scope.bandwidthLoaded = false;
-
-    $scope.bandwidthChartInterval = '60s';
-
-    $scope.unitSize = 'Kb';
-
-    $scope.ratio = numberUtils.ratio;
-
-    $scope.resetEdgeSummary = function() {
-        $timeout(function(){
-            $scope.bpsEdgeSummary = {
-                max: 0,
-                min: 0,
-                totalBytes: 0,
-                average: 0,
-                fifthPercentile: 0,
-                ninetyFifthPercentile: 0,
-                ninetyEighthPercentile: 0
-            };
-        });
-    };
-    $scope.resetEdgeSummary();
-
-    $scope.refreshBpsSummaryMetrics = function(delay) {
-        if (!$scope.showSummary) return; // don't bother. summary hidden...
-
-        $timeout(function() { $scope.updatingBpsSummaryMetrics = true; });
-        if (chartRangeTimer) {
-            $timeout.cancel(chartRangeTimer);
-        }
-        chartRangeTimer = $timeout(function () {
-            getSummaryMetrics(summaryStart, summaryEnd);
-        }, delay);
-    };
-
-    $scope.hideSummaryMetrics = function() {
-        $scope.showSummary = false;
-        $scope.resetEdgeSummary();
-    };
-
-    $scope.showSummaryMetrics = function() {
-        $scope.showSummary = true;
-        $scope.refreshBpsSummaryMetrics(0);
-    };
-
-    $scope.$on('chartModel::dateChange', function(event, args) {
-        onDateChange(args);
-    });
-
-    $scope.$on('chartModel::dateRoll', function(event, args) {
-        onDateChange(args);
-    });
-
-};
-
-ChartBandwidthPerSecondController.$inject = ['entity', 'showSummary', '$rootScope', '$scope', '$uibModal', '$q', '$timeout', '$filter', 'dateUtils', 'numberUtils', 'messageModel', 'propertiesModel', 'statsService'];
-module.exports = ChartBandwidthPerSecondController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/_chart.bandwidthPerSecond.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/_chart.bandwidthPerSecond.scss b/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/_chart.bandwidthPerSecond.scss
deleted file mode 100644
index 6eddf96..0000000
--- a/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/_chart.bandwidthPerSecond.scss
+++ /dev/null
@@ -1,40 +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.
-
-*/
-
-#bpsChartContainer {
-  position: relative;
-  text-align: center;
-  background-color: transparent;
-  padding: 30px 60px;
-
-  #bps-loading, #bps-chart {
-    height: 400px;
-    min-width: 310px;
-  }
-
-  #bps-loading {
-    padding-top: 40px;
-  }
-
-  #bps-metrics {
-    .header {
-      margin-bottom: 0;
-    }
-  }
-
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/chart.bandwidthPerSecond.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/chart.bandwidthPerSecond.tpl.html b/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/chart.bandwidthPerSecond.tpl.html
deleted file mode 100644
index 9848a81..0000000
--- a/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/chart.bandwidthPerSecond.tpl.html
+++ /dev/null
@@ -1,66 +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="chart-container">
-    <div id="bpsChartContainer">
-        <h6>{{chartName}} ({{unitSize}}ps)</h6>
-        <div id="bps-loading" ng-show="!bandwidthLoaded">
-            <div class="loading-text">Loading bandwidth...</div>
-        </div>
-        <div id="bps-chart" ng-show="bandwidthLoaded"></div>
-    </div>
-    <h6 ng-show="!showSummary" class="show-summary-header"><small class="show-summary">[ <a ng-click="showSummaryMetrics()">show summary metrics</a> ]</small></h6>
-    <div id="bps-metrics" ng-show="showSummary" class="row metrics">
-        <div class="col-sm-12 col-md-12">
-            <h6 class="header">
-                <div>{{chartName}} Summary Metrics
-                    <small ng-show="updatingBpsSummaryMetrics">[ calculating <i class="fa fa-spin fa-spinner fa-fw"></i> ]</small>
-                    <small ng-show="!updatingBpsSummaryMetrics" class="summary-refresh">[ <a ng-click="refreshBpsSummaryMetrics(0)">refresh</a> ]</small>
-                    <small class="hide-summary">[ <a ng-click="hideSummaryMetrics()">hide summary metrics</a> ]</small>
-                </div>
-                <hr class="summary-hr">
-                <div><small>{{dateRangeText}}</small></div>
-            </h6>
-            <div class="summary-metrics">
-                <table class="table table-condensed">
-                    <thead>
-                    <tr>
-                        <th>Server Type</th>
-                        <th>Delivered</th>
-                        <th>95th percentile</th>
-                        <th>Max</th>
-                        <th>Min</th>
-                        <th>Avg</th>
-                        <th>Peak-to-Avg</th>
-                    </tr>
-                    </thead>
-                    <tbody>
-                    <tr>
-                        <td>Edge</td>
-                        <td class="total">{{bpsEdgeSummary.totalBytes | unitsFilter:true}}</td>
-                        <td>{{bpsEdgeSummary.ninetyFifthPercentile | unitsFilter:true}}ps</td>
-                        <td>{{bpsEdgeSummary.max | unitsFilter:true}}ps</td>
-                        <td>{{bpsEdgeSummary.min | unitsFilter:true}}ps</td>
-                        <td>{{bpsEdgeSummary.average | unitsFilter:true}}ps</td>
-                        <td>{{ratio(bpsEdgeSummary.max, bpsEdgeSummary.average)}}</td>
-                    </tr>
-                    </tbody>
-                </table>
-            </div>
-        </div>
-    </div>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/index.js b/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/index.js
deleted file mode 100644
index 2ced45d..0000000
--- a/traffic_portal/app/src/common/modules/chart/bandwidthPerSecond/index.js
+++ /dev/null
@@ -1,19 +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.chart.bandwidthPerSecond', [])
-    .controller('ChartBandwidthPerSecondController', require('./ChartBandwidthPerSecondController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/capacity/ChartCapacityController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/capacity/ChartCapacityController.js b/traffic_portal/app/src/common/modules/chart/capacity/ChartCapacityController.js
deleted file mode 100644
index deb664f..0000000
--- a/traffic_portal/app/src/common/modules/chart/capacity/ChartCapacityController.js
+++ /dev/null
@@ -1,117 +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 ChartCapacityController = function(entityId, service, $rootScope, $scope, $interval, $filter) {
-
-    var capacityInterval,
-        capacityLoaded = false;
-
-    var getCapacity = function(showTimeoutError) {
-        if (!$rootScope.online) return;
-
-        var ignoreLoadingBar = true;
-        service.getCapacity(entityId, ignoreLoadingBar, showTimeoutError)
-            .then(
-            function(response) {
-                capacityLoaded = true;
-                var maintenancePercent = Math.round(response.maintenancePercent * 100) / 100,
-                    unavailablePercent = Math.round(response.unavailablePercent * 100) / 100,
-                    availablePercent = Math.round(response.availablePercent * 100) / 100,
-                    utilizedPercent = Math.round(response.utilizedPercent * 100) / 100;
-
-                var data = [];
-
-                if (maintenancePercent > 0) {
-                    data.push({
-                        label: "Maintenance",
-                        color: '#cccccc',
-                        data: [ [ maintenancePercent, 1 ] ]
-                    });
-                }
-                if (unavailablePercent > 0) {
-                    data.push({
-                        label: "Down",
-                        color: '#a94442',
-                        data: [ [ unavailablePercent, 1 ] ]
-                    });
-                }
-                if (availablePercent > 0) {
-                    data.push({
-                        label: "Available",
-                        color: '#91ca32',
-                        data: [ [ availablePercent, 1 ] ]
-                    });
-                }
-                if (utilizedPercent > 0) {
-                    data.push({
-                        label: "Utilized",
-                        color: '#357ebd',
-                        data: [ [ utilizedPercent, 1 ] ]
-                    });
-                }
-
-                buildCapacityChart(data);
-            });
-    };
-
-    var buildCapacityChart = function(data) {
-
-        var options = {
-            series: {
-                stack: true,
-                lines: {show: false, steps: false },
-                bars: {
-                    show: true,
-                    horizontal: true,
-                    barWidth: 0.9,
-                    align: 'center'
-                }
-            },
-            grid: {
-                borderWidth: 0,
-                hoverable: true
-            },
-            tooltip: {
-                show: true,
-                content: function(label, xval, yval, flotItem){
-                    return '<span>' + label + ': ' + $filter('number')(xval, 2) + '%</span><br>';
-                }
-            },
-            yaxis: {
-                ticks: [[ 1,'%' ]]
-            }
-        };
-
-        $.plot($("#capacity-chart"), data, options);
-    };
-
-    angular.element(document).ready(function () {
-        getCapacity(true);
-        capacityInterval = $interval(function() { getCapacity(false) }, 5 * 60 * 1000); // every 5 mins capacity will refresh
-    });
-
-    $scope.$on("$destroy", function() {
-        if (angular.isDefined(capacityInterval)) {
-            $interval.cancel(capacityInterval);
-            capacityInterval = undefined;
-        }
-    });
-
-};
-
-ChartCapacityController.$inject = ['entityId', 'service', '$rootScope', '$scope', '$interval', '$filter'];
-module.exports = ChartCapacityController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/capacity/_chart.capacity.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/capacity/_chart.capacity.scss b/traffic_portal/app/src/common/modules/chart/capacity/_chart.capacity.scss
deleted file mode 100644
index 5fee086..0000000
--- a/traffic_portal/app/src/common/modules/chart/capacity/_chart.capacity.scss
+++ /dev/null
@@ -1,25 +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.
-
-*/
-
-#capacityChartContainer {
-  text-align: center;
-}
-
-#capacity-chart {
-  height: 200px;
-  width: 100%;
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/capacity/chart.capacity.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/capacity/chart.capacity.tpl.html b/traffic_portal/app/src/common/modules/chart/capacity/chart.capacity.tpl.html
deleted file mode 100644
index b5b1ca7..0000000
--- a/traffic_portal/app/src/common/modules/chart/capacity/chart.capacity.tpl.html
+++ /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.
-
--->
-
-<div id="capacityChartContainer">
-    <h6>Overall Capacity %</h6>
-    <div id="capacity-chart"></div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/capacity/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/capacity/index.js b/traffic_portal/app/src/common/modules/chart/capacity/index.js
deleted file mode 100644
index b60e0db..0000000
--- a/traffic_portal/app/src/common/modules/chart/capacity/index.js
+++ /dev/null
@@ -1,19 +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.chart.capacity', [])
-    .controller('ChartCapacityController', require('./ChartCapacityController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/dates/ChartDatesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/dates/ChartDatesController.js b/traffic_portal/app/src/common/modules/chart/dates/ChartDatesController.js
deleted file mode 100644
index f0bc83e..0000000
--- a/traffic_portal/app/src/common/modules/chart/dates/ChartDatesController.js
+++ /dev/null
@@ -1,139 +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 ChartDatesController = function(customLabel, showAutoRefreshBtn, $scope, $location, $timeout, chartModel, messageModel) {
-
-    var setRange = function() {
-        var rangeParams = chartModel.calculateRange($scope.chartData.start, $scope.chartData.end);
-        $scope.tempChartData.range = $scope.chartData.end.diff($scope.chartData.start, rangeParams.interval) + rangeParams.abbrev;
-        if (!rangeParams.exact) {
-            $scope.tempChartData.range = '~' + $scope.tempChartData.range;
-        }
-        $scope.chartData.range = $scope.tempChartData.range;
-    };
-
-    var createNowBtn = function() {
-        var $nowBtn = $('<button type="button" class="dates-now-btn btn btn-block action-btn">Now</button>');
-        $nowBtn.click(function () {
-            angular.element(document.getElementById('rangeInput')).scope().setEndToNow();
-        });
-        $nowBtn.appendTo($('.end-dropdown .datetimepicker'));
-    };
-
-    $scope.chartData = chartModel.chart;
-
-    $scope.tempChartData = {
-        range: $scope.chartData.range
-    };
-
-    $scope.customLabel = customLabel;
-
-    $scope.showAutoRefreshBtn = showAutoRefreshBtn;
-
-    $scope.closeStart = function() {
-        $scope.startDropdown = {
-            isopen: false
-        };
-    };
-    $scope.closeStart();
-
-    $scope.closeEnd = function() {
-        $scope.endDropdown = {
-            isopen: false
-        };
-    };
-    $scope.closeEnd();
-
-    $scope.setStart = function(newDate, oldDate) {
-        if (moment(newDate).isAfter()) {
-            $scope.chartData.start = moment(oldDate);
-            messageModel.setMessages([ { level: 'error', text: "Can't set start date to the future." } ], false);
-        } else {
-            $scope.chartData.start = moment(newDate);
-            setRange();
-        }
-    };
-
-    $scope.setEnd = function(newDate, oldDate) {
-        if (moment(newDate).isAfter()) {
-            $scope.chartData.end = moment(oldDate);
-            messageModel.setMessages([ { level: 'error', text: "Can't set end date to the future." } ], false);
-        } else {
-            $scope.chartData.end = moment(newDate);
-            setRange();
-        }
-    };
-
-    $scope.setEndToNow = function() {
-        $scope.chartData.end = moment();
-        setRange();
-    };
-
-    $scope.toggleAutoRefresh = function() {
-        $scope.chartData.autoRefresh = !$scope.chartData.autoRefresh;
-        if ($scope.chartData.autoRefresh) {
-            $scope.applyRange(); // applying the range moves it to current
-        }
-    };
-
-    $scope.revertRange = function() {
-        $scope.tempChartData.range = $scope.chartData.range;
-    };
-
-    $scope.applyRange = function() {
-
-        var regex = /(\d+)([h|d|w|m|M]$)/, // range must be in the format 1m, 1h, 2d, 3w, 4M
-            params = $scope.tempChartData.range.match(regex);
-
-        if (params && params.length == 3) {
-            $scope.chartData.start = moment().subtract(params[1], params[2]);
-            $scope.chartData.end = moment();
-            $scope.chartData.range = $scope.tempChartData.range;
-            $scope.changeDates($scope.chartData.start, $scope.chartData.end);
-            $scope.chartData.autoRefresh = true && $scope.showAutoRefreshBtn; // showAutoRefreshBtn trumps all. if no show, no autorefresh...EVER!
-        } else {
-            messageModel.setMessages([ { level: 'error', text: "Invalid date range. Valid increments are 'm' (minute), 'h' (hour), 'd' (day), 'w' (week) or 'M' (month). Example: '30m', '12h', '3d', '3w', '3M'" } ], false);
-        }
-
-        $timeout(function () {
-            $('#rangeInput').blur(); // need to blur input to hide popover and for some reason a delay helps
-        }, 500);
-
-    };
-
-    $scope.changeDates = function(start, end) {
-        if (!start.isValid() || !end.isValid()) {
-            messageModel.setMessages([ { level: 'error', text: 'Invalid date format detected. Please fix.' } ], false);
-        } else {
-            chartModel.changeDates(start, end);
-        }
-    };
-
-    angular.element(document).ready(function () {
-        $scope.changeDates(chartModel.chart.start, chartModel.chart.end);
-        createNowBtn();
-    });
-
-    var init = function () {
-        $scope.chartData.autoRefresh = $scope.showAutoRefreshBtn && $scope.chartData.autoRefresh;
-    };
-    init();
-
-};
-
-ChartDatesController.$inject = ['customLabel', 'showAutoRefreshBtn', '$scope', '$location', '$timeout', 'chartModel', 'messageModel'];
-module.exports = ChartDatesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/dates/_chart.dates.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/dates/_chart.dates.scss b/traffic_portal/app/src/common/modules/chart/dates/_chart.dates.scss
deleted file mode 100644
index 6bdf3f4..0000000
--- a/traffic_portal/app/src/common/modules/chart/dates/_chart.dates.scss
+++ /dev/null
@@ -1,68 +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.
-
-*/
-
-#chartDatesForm {
-  text-align: center;
-  padding: 10px 0px;
-  margin: 0;
-  border: 1px solid #A8A8A8;
-
-  .input-group-addon {
-    background-color: transparent;
-  }
-
-  .pause-btn, .play-btn, .apply-btn {
-    border-radius: 0 !important;
-  }
-
-  .apply-btn {
-    margin-left: -1px;
-  }
-
-  .chart-range-input {
-    width: 75px !important;
-    margin-left: -1px;
-    cursor:auto;
-  }
-
-  .date-text {
-    cursor: pointer !important;
-    width: 210px !important;
-  }
-
-  .input-group {
-    margin-bottom: 0;
-  }
-
-  .input-group-addon {
-    font-size: 12px;
-  }
-
-  .dates-btn:focus {
-    outline: none;
-  }
-
-  .start-dropdown, .end-dropdown {
-    display: inline-block;
-  }
-
-  .dates-now-btn {
-    width: 310px;
-    margin-left: 5px;
-  }
-
-}


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/DialogSelectController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/DialogSelectController.js b/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/DialogSelectController.js
deleted file mode 100644
index 84ac0e9..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/DialogSelectController.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var DialogSelectController = function(params, collection, $scope, $uibModalInstance) {
-
-	$scope.params = params;
-
-	$scope.collection = collection;
-
-	$scope.selectedItemId = null;
-
-	$scope.select = function() {
-		var selectedItem = _.find(collection, function(item){ return parseInt(item.id) == parseInt($scope.selectedItemId) });
-		$uibModalInstance.close(selectedItem);
-	};
-
-	$scope.cancel = function () {
-		$uibModalInstance.dismiss('cancel');
-	};
-
-};
-
-DialogSelectController.$inject = ['params', 'collection', '$scope', '$uibModalInstance'];
-module.exports = DialogSelectController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/dialog.select.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/dialog.select.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/dialog.select.tpl.html
deleted file mode 100644
index 568935d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/dialog.select.tpl.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="modal-header">
-    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-    <h4 class="modal-title">{{::params.title}}</h4>
-</div>
-<div class="modal-body">
-    <p>{{::params.message}}</p>
-    <form name="selectForm" novalidate>
-        <select id="cdn" name="cdn" class="form-control" ng-model="selectedItemId" ng-options="item.id as item.name for item in collection" required>
-            <option value="">Select...</option>
-        </select>
-    </form>
-</div>
-<div class="modal-footer">
-    <button class="btn btn-link" ng-click="cancel()">Cancel</button>
-    <button class="btn btn-primary" ng-disabled="selectForm.$invalid" ng-click="select()">Submit</button>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/index.js b/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/index.js
deleted file mode 100644
index 56480ac..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.dialog.select', [])
-	.controller('DialogSelectController', require('./DialogSelectController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/status/DialogSelectStatusController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/status/DialogSelectStatusController.js b/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/status/DialogSelectStatusController.js
deleted file mode 100644
index 6bdf02e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/status/DialogSelectStatusController.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var DialogSelectStatusController = function(server, statuses, $scope, $uibModalInstance) {
-
-	$scope.server = server;
-
-	$scope.statuses = statuses;
-
-	$scope.selectedStatusId = null;
-
-	$scope.status = {
-		id: null,
-		name: null,
-		offlineReason: null
-	};
-
-	$scope.select = function() {
-		var selectedStatus = _.find(statuses, function(status){ return parseInt(status.id) == parseInt($scope.selectedStatusId) });
-		$scope.status.id = selectedStatus.id;
-		$scope.status.name = selectedStatus.name;
-		$uibModalInstance.close($scope.status);
-	};
-
-	$scope.needsUpdates = function(server) {
-		return (server.type.indexOf('EDGE') != -1) || (server.type.indexOf('MID') != -1);
-	};
-
-	$scope.cancel = function () {
-		$uibModalInstance.dismiss('cancel');
-	};
-
-	$scope.offline = function () {
-		var selectedStatus = _.find(statuses, function(status){ return parseInt(status.id) == parseInt($scope.selectedStatusId) });
-		return selectedStatus && (selectedStatus.name == "ADMIN_DOWN" || selectedStatus.name == "OFFLINE");
-	};
-
-};
-
-DialogSelectStatusController.$inject = ['server', 'statuses', '$scope', '$uibModalInstance'];
-module.exports = DialogSelectStatusController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/status/dialog.select.status.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/status/dialog.select.status.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/status/dialog.select.status.tpl.html
deleted file mode 100644
index 335a190..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/status/dialog.select.status.tpl.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="modal-header">
-    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-    <h4 class="modal-title">Update {{::server.hostName}} status</h4>
-    <h5 ng-if="needsUpdates(server)">Note: Config file updates will be queued on ALL child caches</h5>
-</div>
-<div class="modal-body">
-    <form name="statusForm" novalidate>
-        <div class="row">
-            <div class="col-sm-12 col-md-12">
-                <div class="form-group" ng-class="{'has-error': hasError(statusForm.status), 'has-feedback': hasError(statusForm.status)}">
-                    <label class="control-label" for="status">Status *
-                        <small class="input-error" ng-show="hasPropertyError(statusForm.status, 'required')">Required</small>
-                    </label>
-                    <select id="status" name="status" class="form-control" ng-model="selectedStatusId" ng-options="status.id as status.name for status in statuses" required>
-                        <option value="">Select...</option>
-                    </select>
-                </div>
-            </div>
-        </div>
-        <div class="row" ng-show="offline()">
-            <div class="col-sm-12 col-md-12">
-                <div class="form-group" ng-class="{'has-error': hasError(statusForm.offlineReason), 'has-feedback': hasError(statusForm.offlineReason)}">
-                    <label class="control-label" for="offlineReason">Offline Reason *
-                        <small class="input-error" ng-show="hasPropertyError(statusForm.offlineReason, 'maxlength')">Too Long</small>
-                    </label>
-                    <input id="offlineReason" name="offlineReason" type="text" class="form-control" ng-model="status.offlineReason" ng-maxlength="256" ng-required="offline()" autofocus>
-                    <span ng-show="hasError(statusForm.offlineReason)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-        </div>
-    </form>
-</div>
-<div class="modal-footer">
-    <button class="btn action-btn" ng-click="cancel()">Cancel</button>
-    <button class="btn btn-link" ng-disabled="statusForm.$invalid" ng-click="select()">Submit</button>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/status/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/status/index.js b/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/status/index.js
deleted file mode 100644
index e1e5f4d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/select/status/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.dialog.select.status', [])
-	.controller('DialogSelectStatusController', require('./DialogSelectStatusController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/asn/FormASNController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/asn/FormASNController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/asn/FormASNController.js
deleted file mode 100644
index 85f1475..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/asn/FormASNController.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormASNController = function(asn, $scope, formUtils, locationUtils, cacheGroupService) {
-
-    var getCacheGroups = function() {
-        cacheGroupService.getCacheGroups()
-            .then(function(result) {
-                $scope.cachegroups = result;
-            });
-    };
-
-    $scope.asn = asn;
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-    var init = function () {
-        getCacheGroups();
-    };
-    init();
-
-};
-
-FormASNController.$inject = ['asn', '$scope', 'formUtils', 'locationUtils', 'cacheGroupService'];
-module.exports = FormASNController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/asn/edit/FormEditASNController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/asn/edit/FormEditASNController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/asn/edit/FormEditASNController.js
deleted file mode 100644
index e2ac23e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/asn/edit/FormEditASNController.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditASNController = function(asn, $scope, $controller, $uibModal, $anchorScroll, locationUtils, asnService) {
-
-    // extends the FormASNController to inherit common methods
-    angular.extend(this, $controller('FormASNController', { asn: asn, $scope: $scope }));
-
-    var deleteASN = function(asn) {
-        asnService.deleteASN(asn.id)
-            .then(function() {
-                locationUtils.navigateToPath('/admin/asns');
-            });
-    };
-
-    $scope.asnName = angular.copy(asn.asn);
-
-    $scope.settings = {
-        isNew: false,
-        saveLabel: 'Update'
-    };
-
-    $scope.save = function(asn) {
-        asnService.updateASN(asn).
-            then(function() {
-                $scope.asnName = angular.copy(asn.asn);
-                $anchorScroll(); // scrolls window to top
-            });
-    };
-
-    $scope.confirmDelete = function(asn) {
-        var params = {
-            title: 'Delete ASN: ' + asn.asn,
-            key: asn.asn.toString()
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-            controller: 'DialogDeleteController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                }
-            }
-        });
-        modalInstance.result.then(function() {
-            deleteASN(asn);
-        }, function () {
-            // do nothing
-        });
-    };
-
-};
-
-FormEditASNController.$inject = ['asn', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'asnService'];
-module.exports = FormEditASNController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/asn/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/asn/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/asn/edit/index.js
deleted file mode 100644
index 9ab1012..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/asn/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.asn.edit', [])
-    .controller('FormEditASNController', require('./FormEditASNController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/asn/form.asn.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/asn/form.asn.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/asn/form.asn.tpl.html
deleted file mode 100644
index 6ba8a69..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/asn/form.asn.tpl.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb">
-            <li><a ng-click="navigateToPath('/admin/asns')">ASNs</a></li>
-            <li class="active">{{asnName}}</li>
-        </ol>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="asnForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(asnForm.asn), 'has-feedback': hasError(asnForm.asn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">ASN *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="asn" name="asn" type="text" class="form-control" ng-model="asn.asn" ng-required="true" ng-maxlength="11" ng-pattern="/^\d+$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(asnForm.asn, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(asnForm.asn, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(asnForm.asn, 'pattern')">Number</small>
-                    <span ng-show="hasError(asnForm.asn)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(asnForm.cachegroup), 'has-feedback': hasError(asnForm.cachegroup)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Cache Group *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="cachegroup" name="cachegroup" class="form-control" ng-model="asn.cachegroupId" ng-options="cachegroup.id as cachegroup.name for cachegroup in cachegroups" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(asnForm.cachegroup, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(asn)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="asnForm.$pristine || asnForm.$invalid" ng-click="save(asn)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/asn/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/asn/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/asn/index.js
deleted file mode 100644
index 5139e03..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/asn/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.asn', [])
-    .controller('FormASNController', require('./FormASNController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/asn/new/FormNewASNController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/asn/new/FormNewASNController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/asn/new/FormNewASNController.js
deleted file mode 100644
index a6b8790..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/asn/new/FormNewASNController.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewASNController = function(asn, $scope, $controller, asnService) {
-
-    // extends the FormASNController to inherit common methods
-    angular.extend(this, $controller('FormASNController', { asn: asn, $scope: $scope }));
-
-    $scope.asnName = 'New';
-
-    $scope.settings = {
-        isNew: true,
-        saveLabel: 'Create'
-    };
-
-    $scope.save = function(asn) {
-        asnService.createASN(asn);
-    };
-
-};
-
-FormNewASNController.$inject = ['asn', '$scope', '$controller', 'asnService'];
-module.exports = FormNewASNController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/asn/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/asn/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/asn/new/index.js
deleted file mode 100644
index 345328d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/asn/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.asn.new', [])
-    .controller('FormNewASNController', require('./FormNewASNController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js
deleted file mode 100644
index 5eb334d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormCacheGroupController = function(cacheGroup, $scope, $location, formUtils, locationUtils, cacheGroupService, typeService) {
-
-    var getCacheGroups = function() {
-        cacheGroupService.getCacheGroups()
-            .then(function(result) {
-                $scope.cacheGroups = result;
-            });
-    };
-
-    var getTypes = function() {
-        typeService.getTypes({ useInTable: 'cachegroup' })
-            .then(function(result) {
-                $scope.types = result;
-            });
-    };
-
-    $scope.cacheGroup = cacheGroup;
-
-    $scope.viewAsns = function() {
-        $location.path($location.path() + '/asns');
-    };
-
-    $scope.viewParams = function() {
-        $location.path($location.path() + '/parameters');
-    };
-
-    $scope.viewServers = function() {
-        $location.path($location.path() + '/servers');
-    };
-
-    $scope.viewStaticDnsEntries = function() {
-        $location.path($location.path() + '/static-dns-entries');
-    };
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-    var init = function () {
-        getCacheGroups();
-        getTypes();
-    };
-    init();
-
-};
-
-FormCacheGroupController.$inject = ['cacheGroup', '$scope', '$location', 'formUtils', 'locationUtils', 'cacheGroupService', 'typeService'];
-module.exports = FormCacheGroupController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/edit/FormEditCacheGroupController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/edit/FormEditCacheGroupController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/edit/FormEditCacheGroupController.js
deleted file mode 100644
index e32e016..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/edit/FormEditCacheGroupController.js
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditCacheGroupController = function(cacheGroup, $scope, $controller, $uibModal, $anchorScroll, locationUtils, cacheGroupService) {
-
-    // extends the FormCacheGroupController to inherit common methods
-    angular.extend(this, $controller('FormCacheGroupController', { cacheGroup: cacheGroup, $scope: $scope }));
-
-    $scope.cacheGroupName = angular.copy(cacheGroup.name);
-
-    $scope.settings = {
-        isNew: false,
-        saveLabel: 'Update'
-    };
-
-    var deleteCacheGroup = function(cacheGroup) {
-        cacheGroupService.deleteCacheGroup(cacheGroup.id)
-            .then(function() {
-                locationUtils.navigateToPath('/configure/cache-groups');
-            });
-    };
-
-    var queueServerUpdates = function(cacheGroup, cdnId) {
-        cacheGroupService.queueServerUpdates(cacheGroup.id, cdnId);
-    };
-
-    var clearServerUpdates = function(cacheGroup, cdnId) {
-        cacheGroupService.clearServerUpdates(cacheGroup.id, cdnId);
-    };
-
-    $scope.save = function(cacheGroup) {
-        cacheGroupService.updateCacheGroup(cacheGroup).
-            then(function() {
-                $scope.cacheGroupName = angular.copy(cacheGroup.name);
-                $anchorScroll(); // scrolls window to top
-            });
-    };
-
-    $scope.confirmDelete = function(cacheGroup) {
-        var params = {
-            title: 'Delete Cache Group: ' + cacheGroup.name,
-            key: cacheGroup.name
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-            controller: 'DialogDeleteController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                }
-            }
-        });
-        modalInstance.result.then(function() {
-            deleteCacheGroup(cacheGroup);
-        }, function () {
-            // do nothing
-        });
-    };
-
-    $scope.confirmQueueServerUpdates = function(cacheGroup) {
-        var params = {
-            title: 'Queue Server Updates: ' + cacheGroup.name,
-            message: "Please select a CDN"
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
-            controller: 'DialogSelectController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                },
-                collection: function(cdnService) {
-                    return cdnService.getCDNs();
-                }
-            }
-        });
-        modalInstance.result.then(function(cdn) {
-            queueServerUpdates(cacheGroup, cdn.id);
-        }, function () {
-            // do nothing
-        });
-    };
-
-    $scope.confirmClearServerUpdates = function(cacheGroup) {
-        var params = {
-            title: 'Clear Server Updates: ' + cacheGroup.name,
-            message: "Please select a CDN"
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
-            controller: 'DialogSelectController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                },
-                collection: function(cdnService) {
-                    return cdnService.getCDNs();
-                }
-            }
-        });
-        modalInstance.result.then(function(cdn) {
-            clearServerUpdates(cacheGroup, cdn.id);
-        }, function () {
-            // do nothing
-        });
-    };
-
-};
-
-FormEditCacheGroupController.$inject = ['cacheGroup', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'cacheGroupService'];
-module.exports = FormEditCacheGroupController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/edit/index.js
deleted file mode 100644
index 836befe..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.cacheGroup.edit', [])
-    .controller('FormEditCacheGroupController', require('./FormEditCacheGroupController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html
deleted file mode 100644
index 2965029..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html
+++ /dev/null
@@ -1,123 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/cache-groups')">Cache Groups</a></li>
-            <li class="active">{{cacheGroupName}}</li>
-        </ol>
-        <div class="pull-right" ng-show="!settings.isNew">
-            <div class="btn-group" role="group" uib-dropdown is-open="queue.isopen">
-                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    Queue Updates&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="confirmQueueServerUpdates(cacheGroup)"><i class="fa fa-flag"></i>&nbsp;&nbsp;Queue {{cacheGroupName}} Server Updates</a></li>
-                    <li role="menuitem"><a ng-click="confirmClearServerUpdates(cacheGroup)"><i class="fa fa-ban"></i>&nbsp;&nbsp;Clear {{cacheGroupName}} Server Updates</a></li>
-                </ul>
-            </div>
-            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
-                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    More&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="viewAsns()">View ASNs</a></li>
-                    <li role="menuitem"><a ng-click="viewParams()">View Parameters</a></li>
-                    <li role="menuitem"><a ng-click="viewServers()">View Servers</a></li>
-                    <li role="menuitem"><a ng-click="viewStaticDnsEntries()">View Static DNS Entries</a></li>
-                </ul>
-            </div>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="cacheGroupForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(cacheGroupForm.name), 'has-feedback': hasError(cacheGroupForm.name)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Name *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="name" name="name" type="text" class="form-control" ng-model="cacheGroup.name" ng-required="true" ng-maxlength="45" ng-pattern="/^\S*$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.name, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.name, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.name, 'pattern')">No spaces</small>
-                    <span ng-show="hasError(cacheGroupForm.name)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(cacheGroupForm.shortName), 'has-feedback': hasError(cacheGroupForm.shortName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Short Name *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="shortName" name="shortName" type="text" class="form-control" ng-model="cacheGroup.shortName" ng-required="true" ng-maxlength="255" ng-pattern="/^\S*$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.shortName, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.shortName, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.shortName, 'pattern')">No spaces</small>
-                    <span ng-show="hasError(cacheGroupForm.shortName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(cacheGroupForm.latitude), 'has-feedback': hasError(cacheGroupForm.latitude)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Latitude *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="latitude" name="latitude" type="text" class="form-control" ng-model="cacheGroup.latitude" ng-pattern="/^[-+]?[0-9]*\.?[0-9]+$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.latitude, 'pattern')">Invalid coordinate</small>
-                    <span ng-show="hasError(cacheGroupForm.latitude)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(cacheGroupForm.longitude), 'has-feedback': hasError(cacheGroupForm.longitude)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Longitude *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="longitude" name="longitude" type="text" class="form-control" ng-model="cacheGroup.longitude" ng-pattern="/^[-+]?[0-9]*\.?[0-9]+$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.longitude, 'pattern')">Invalid coordinate</small>
-                    <span ng-show="hasError(cacheGroupForm.longitude)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(cacheGroupForm.type), 'has-feedback': hasError(cacheGroupForm.type)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Type *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="type" name="type" class="form-control" ng-model="cacheGroup.typeId" ng-options="type.id as type.name for type in types" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.type, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(cacheGroupForm.parentCacheGroup), 'has-feedback': hasError(cacheGroupForm.parentCacheGroup)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Parent Cache Group *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="parentCacheGroup" name="parentCacheGroup" class="form-control" ng-model="cacheGroup.parentCachegroupId" ng-options="cacheGroup.id as cacheGroup.name for cacheGroup in cacheGroups" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.parentCacheGroup, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="form-group">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Secondary Parent Cache Group</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="secondaryParentCacheGroup" name="secondaryParentCacheGroup" class="form-control" ng-model="cacheGroup.secondaryParentCachegroupId" ng-options="cacheGroup.id as cacheGroup.name for cacheGroup in cacheGroups">
-                        <option value="">Select...</option>
-                    </select>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(cacheGroup)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="cacheGroupForm.$pristine || cacheGroupForm.$invalid" ng-click="save(cacheGroup)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/index.js
deleted file mode 100644
index 5446dfa..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.cacheGroup', [])
-    .controller('FormCacheGroupController', require('./FormCacheGroupController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/new/FormNewCacheGroupController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/new/FormNewCacheGroupController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/new/FormNewCacheGroupController.js
deleted file mode 100644
index 6f5896f..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/new/FormNewCacheGroupController.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewCacheGroupController = function(cacheGroup, $scope, $controller, cacheGroupService) {
-
-    // extends the FormCacheGroupController to inherit common methods
-    angular.extend(this, $controller('FormCacheGroupController', { cacheGroup: cacheGroup, $scope: $scope }));
-
-    $scope.cacheGroupName = 'New';
-
-    $scope.settings = {
-        isNew: true,
-        saveLabel: 'Create'
-    };
-
-    $scope.save = function(cacheGroup) {
-        cacheGroupService.createCacheGroup(cacheGroup);
-    };
-
-};
-
-FormNewCacheGroupController.$inject = ['cacheGroup', '$scope', '$controller', 'cacheGroupService'];
-module.exports = FormNewCacheGroupController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/new/index.js
deleted file mode 100644
index 5c238c0..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cacheGroup/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.cacheGroup.new', [])
-    .controller('FormNewCacheGroupController', require('./FormNewCacheGroupController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/FormCDNController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/FormCDNController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/FormCDNController.js
deleted file mode 100644
index c628ff7..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/FormCDNController.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormCDNController = function(cdn, $scope, $location, formUtils, stringUtils, locationUtils, cdnService) {
-
-    $scope.cdn = cdn;
-
-    $scope.falseTrue = [
-        { value: false, label: 'false' },
-        { value: true, label: 'true' }
-    ];
-
-    $scope.manageDNSSEC = function() {
-        alert('not hooked up yet: manageDNSSEC for CDN');
-    };
-
-    $scope.manageSSL = function() {
-        alert('not hooked up yet: manageSSL for cdn');
-    };
-
-    $scope.queueServerUpdates = function(cdn) {
-        cdnService.queueServerUpdates(cdn.id);
-    };
-
-    $scope.clearServerUpdates = function(cdn) {
-        cdnService.clearServerUpdates(cdn.id);
-    };
-
-    $scope.viewConfig = function() {
-        $location.path($location.path() + '/config/changes');
-    };
-
-    $scope.viewProfiles = function() {
-        $location.path($location.path() + '/profiles');
-    };
-
-    $scope.viewServers = function() {
-        $location.path($location.path() + '/servers');
-    };
-
-    $scope.viewDeliveryServices = function() {
-        $location.path($location.path() + '/delivery-services');
-    };
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-};
-
-FormCDNController.$inject = ['cdn', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils', 'cdnService'];
-module.exports = FormCDNController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/edit/FormEditCDNController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/edit/FormEditCDNController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/edit/FormEditCDNController.js
deleted file mode 100644
index 701fc59..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/edit/FormEditCDNController.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditCDNController = function(cdn, $scope, $controller, $uibModal, $anchorScroll, locationUtils, cdnService) {
-
-    // extends the FormCDNController to inherit common methods
-    angular.extend(this, $controller('FormCDNController', { cdn: cdn, $scope: $scope }));
-
-    var deleteCDN = function(cdn) {
-        cdnService.deleteCDN(cdn.id)
-            .then(function() {
-                locationUtils.navigateToPath('/admin/cdns');
-            });
-    };
-
-    $scope.cdnName = angular.copy(cdn.name);
-
-    $scope.settings = {
-        isNew: false,
-        saveLabel: 'Update'
-    };
-
-    $scope.save = function(cdn) {
-        cdnService.updateCDN(cdn).
-            then(function() {
-                $scope.cdnName = angular.copy(cdn.name);
-                $anchorScroll(); // scrolls window to top
-            });
-    };
-
-    $scope.confirmDelete = function(cdn) {
-        var params = {
-            title: 'Delete CDN: ' + cdn.name,
-            key: cdn.name
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-            controller: 'DialogDeleteController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                }
-            }
-        });
-        modalInstance.result.then(function() {
-            deleteCDN(cdn);
-        }, function () {
-            // do nothing
-        });
-    };
-
-};
-
-FormEditCDNController.$inject = ['cdn', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'cdnService'];
-module.exports = FormEditCDNController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/edit/index.js
deleted file mode 100644
index 09e4942..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.cdn.edit', [])
-    .controller('FormEditCDNController', require('./FormEditCDNController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/form.cdn.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/form.cdn.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/form.cdn.tpl.html
deleted file mode 100644
index b3d6f0d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/form.cdn.tpl.html
+++ /dev/null
@@ -1,89 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/cdns')">CDNs</a></li>
-            <li class="active">{{cdnName}}</li>
-        </ol>
-        <div class="pull-right" ng-show="!settings.isNew">
-            <button class="btn btn-primary" title="Diff CDN Snapshot" ng-click="viewConfig()"><i class="fa fa-camera"></i>&nbsp;&nbsp;Diff CDN Config Snapshot</button>
-            <div class="btn-group" role="group" uib-dropdown is-open="queue.isopen">
-                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    Queue Updates&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="queueServerUpdates(cdn)">Queue {{cdn.name}} Server Updates</a></li>
-                    <li role="menuitem"><a ng-click="clearServerUpdates(cdn)">Clear {{cdn.name}} Server Updates</a></li>
-                </ul>
-            </div>
-            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
-                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    More&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="manageDNSSEC()">Manage DNSSEC Keys</a></li>
-                    <li role="menuitem"><a ng-click="manageSSL()">Manage SSL Keys</a></li>
-                    <li class="divider"></li>
-                    <li role="menuitem"><a ng-click="viewDeliveryServices()">View Delivery Services</a></li>
-                    <li role="menuitem"><a ng-click="viewProfiles()">View Profiles</a></li>
-                    <li role="menuitem"><a ng-click="viewServers()">View Servers</a></li>
-                </ul>
-            </div>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="cdnForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(cdnForm.name), 'has-feedback': hasError(cdnForm.name)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Name *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="name" name="name" type="text" class="form-control" ng-model="cdn.name" ng-required="true" ng-maxlength="45" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(cdnForm.name, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(cdnForm.name, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(cdnForm.name)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(cdnForm.domainName), 'has-feedback': hasError(cdnForm.domainName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Domain *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="domainName" name="domainName" type="text" class="form-control" ng-model="cdn.domainName" ng-required="true" ng-maxlength="255" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(cdnForm.domainName, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(cdnForm.domainName, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(cdnForm.domainName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(cdnForm.dnssecEnabled), 'has-feedback': hasError(cdnForm.dnssecEnabled)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">DNSSEC Enabled *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="dnssecEnabled" name="dnssecEnabled" class="form-control" ng-model="cdn.dnssecEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(cdnForm.dnssecEnabled, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(cdn)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="cdnForm.$pristine || cdnForm.$invalid" ng-click="save(cdn)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/index.js
deleted file mode 100644
index ab98f1a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.cdn', [])
-    .controller('FormCDNController', require('./FormCDNController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/new/FormNewCDNController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/new/FormNewCDNController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/new/FormNewCDNController.js
deleted file mode 100644
index 10feead..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/new/FormNewCDNController.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewCDNController = function(cdn, $scope, $controller, cdnService) {
-
-    // extends the FormCDNController to inherit common methods
-    angular.extend(this, $controller('FormCDNController', { cdn: cdn, $scope: $scope }));
-
-    $scope.cdnName = 'New';
-
-    $scope.settings = {
-        isNew: true,
-        saveLabel: 'Create'
-    };
-
-    $scope.save = function(cdn) {
-        cdnService.createCDN(cdn)
-    };
-
-};
-
-FormNewCDNController.$inject = ['cdn', '$scope', '$controller', 'cdnService'];
-module.exports = FormNewCDNController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/new/index.js
deleted file mode 100644
index 4566629..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/cdn/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.cdn.new', [])
-    .controller('FormNewCDNController', require('./FormNewCDNController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
deleted file mode 100644
index 69d0b89..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormDeliveryServiceController = function(deliveryService, types, $scope, $location, formUtils, locationUtils, cdnService, profileService, typeService) {
-
-    var getCDNs = function() {
-        cdnService.getCDNs()
-            .then(function(result) {
-                $scope.cdns = result;
-            });
-    };
-
-    var getProfiles = function() {
-        profileService.getProfiles()
-            .then(function(result) {
-                $scope.profiles = _.filter(result, function(profile) {
-                    return profile.type == 'DS_PROFILE';
-                });
-            });
-    };
-
-    $scope.deliveryService = deliveryService;
-
-    $scope.types = types;
-
-    $scope.falseTrue = [
-        { value: false, label: 'false' },
-        { value: true, label: 'true' }
-    ];
-
-    $scope.protocols = [
-        { value: 0, label: '0 - HTTP' },
-        { value: 1, label: '1 - HTTPS' },
-        { value: 2, label: '2 - HTTP AND HTTPS' },
-        { value: 3, label: '3 - HTTP TO HTTPS' }
-    ];
-
-    $scope.qStrings = [
-        { value: 0, label: '0 - use qstring in cache key, and pass up' },
-        { value: 1, label: '1 - ignore in cache key, and pass up' },
-        { value: 2, label: '2 - drop at edge' }
-    ];
-
-    $scope.geoLimits = [
-        { value: 0, label: '0 - None' },
-        { value: 1, label: '1 - CZF only' },
-        { value: 2, label: '2 - CZF + Country Code(s)' }
-    ];
-
-    $scope.geoProviders = [
-        { value: 0, label: '0 - Maxmind (Default)' },
-        { value: 1, label: '1 - Neustar' }
-    ];
-
-    $scope.dscps = [
-        { value: 0, label: '0  - Best Effort' },
-        { value: 10, label: '10 - AF11' },
-        { value: 12, label: '12 - AF12' },
-        { value: 14, label: '14 - AF13' },
-        { value: 18, label: '18  - AF21' },
-        { value: 20, label: '20  - AF22' },
-        { value: 22, label: '22  - AF23' },
-        { value: 26, label: '26  - AF31' },
-        { value: 28, label: '28  - AF32' },
-        { value: 30, label: '30  - AF33' },
-        { value: 34, label: '34  - AF41' },
-        { value: 36, label: '36  - AF42' },
-        { value: 37, label: '37  - ' },
-        { value: 38, label: '38  - AF43' },
-        { value: 8, label: '8  - CS1' },
-        { value: 16, label: '16  - CS2' },
-        { value: 24, label: '24  - CS3' },
-        { value: 32, label: '32  - CS4' },
-        { value: 40, label: '40  - CS5' },
-        { value: 48, label: '48  - CS6' },
-        { value: 56, label: '56  - CS7' }
-    ];
-
-    $scope.dispersions = [
-        { value: 1, label: '1 - OFF' },
-        { value: 2, label: '2' },
-        { value: 3, label: '3' },
-        { value: 4, label: '4' },
-        { value: 5, label: '5' },
-        { value: 6, label: '6' },
-        { value: 7, label: '7' },
-        { value: 8, label: '8' },
-        { value: 9, label: '9' },
-        { value: 10, label: '10' }
-    ];
-
-    $scope.rrhs = [
-        { value: 0, label: "0 - Don't cache" },
-        { value: 1, label: "1 - Use background_fetch plugin" },
-        { value: 2, label: "2 - Use cache_range_requests plugin" }
-    ];
-
-    $scope.msoAlgos = [
-        { value: 0, label: "0 - Consistent Hash" },
-        { value: 1, label: "1 - Primary/Backup" },
-        { value: 2, label: "2 - Strict Round Robin" },
-        { value: 3, label: "3 - IP-based Round Robin" },
-        { value: 4, label: "4 - Latch on Failover" }
-    ];
-
-    $scope.viewServers = function() {
-        $location.path($location.path() + '/servers');
-    };
-
-    $scope.viewRegexes = function() {
-        $location.path($location.path() + '/regexes');
-    };
-
-    $scope.viewJobs = function() {
-        $location.path($location.path() + '/jobs');
-    };
-
-    $scope.manageSslKeys = function() {
-        alert('not hooked up yet: manageSslKeys for DS');
-    };
-
-    $scope.manageUrlSigKeys = function() {
-        alert('not hooked up yet: manageUrlSigKeys for DS');
-    };
-
-    $scope.viewStaticDnsEntries = function() {
-        $location.path($location.path() + '/static-dns-entries');
-    };
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-    var init = function () {
-        getCDNs();
-        getProfiles();
-    };
-    init();
-
-};
-
-FormDeliveryServiceController.$inject = ['deliveryService', 'types', '$scope', '$location', 'formUtils', 'locationUtils', 'cdnService', 'profileService', 'typeService'];
-module.exports = FormDeliveryServiceController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/edit/FormEditDeliveryServiceController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/edit/FormEditDeliveryServiceController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/edit/FormEditDeliveryServiceController.js
deleted file mode 100644
index ba5b257..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/edit/FormEditDeliveryServiceController.js
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditDeliveryServiceController = function(deliveryService, type, types, $scope, $controller, $uibModal, $anchorScroll, locationUtils, deliveryServiceService) {
-
-	var filteredTypes = _.filter(types, function(currentType) {
-		return currentType.name.indexOf(type) != -1;
-	});
-
-	// extends the FormDeliveryServiceController to inherit common methods
-	angular.extend(this, $controller('FormDeliveryServiceController', { deliveryService: deliveryService, types: filteredTypes, $scope: $scope }));
-
-	var deleteDeliveryService = function(deliveryService) {
-		deliveryServiceService.deleteDeliveryService(deliveryService.id)
-			.then(function() {
-				locationUtils.navigateToPath('/configure/delivery-services');
-			});
-	};
-
-	$scope.deliveryServiceName = angular.copy(deliveryService.displayName);
-
-	$scope.settings = {
-		isNew: false,
-		saveLabel: 'Update'
-	};
-
-	$scope.save = function(deliveryService) {
-		deliveryServiceService.updateDeliveryService(deliveryService).
-		then(function() {
-			$scope.deliveryServiceName = angular.copy(deliveryService.displayName);
-			$anchorScroll(); // scrolls window to top
-		});
-	};
-
-	$scope.confirmDelete = function(deliveryService) {
-		var params = {
-			title: 'Delete Delivery Service: ' + deliveryService.displayName,
-			key: deliveryService.xmlId
-		};
-		var modalInstance = $uibModal.open({
-			templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-			controller: 'DialogDeleteController',
-			size: 'md',
-			resolve: {
-				params: function () {
-					return params;
-				}
-			}
-		});
-		modalInstance.result.then(function() {
-			deleteDeliveryService(deliveryService);
-		}, function () {
-			// do nothing
-		});
-	};
-
-};
-
-FormEditDeliveryServiceController.$inject = ['deliveryService', 'type', 'types', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'deliveryServiceService'];
-module.exports = FormEditDeliveryServiceController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/edit/index.js
deleted file mode 100644
index 88eb073..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.deliveryService.edit', [])
-	.controller('FormEditDeliveryServiceController', require('./FormEditDeliveryServiceController'));


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/public/home/HomeController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/home/HomeController.js b/traffic_portal/app/src/modules/public/home/HomeController.js
deleted file mode 100644
index c4458a6..0000000
--- a/traffic_portal/app/src/modules/public/home/HomeController.js
+++ /dev/null
@@ -1,47 +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 HomeController = function($scope, $uibModal, propertiesModel, authService, userService) {
-
-    $scope.sections = propertiesModel.properties.home.sections;
-
-    $scope.credentials = {
-        username: '',
-        password: ''
-    };
-
-    $scope.login = function(credentials) {
-        authService.login(credentials.username, credentials.password);
-    };
-
-    $scope.resetPassword = function() {
-
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/reset/dialog.reset.tpl.html',
-            controller: 'DialogResetController'
-        });
-
-        modalInstance.result.then(function(email) {
-            userService.resetPassword(email);
-        }, function () {
-        });
-    };
-
-};
-
-HomeController.$inject = ['$scope', '$uibModal', 'propertiesModel', 'authService', 'userService'];
-module.exports = HomeController;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/public/home/_home.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/home/_home.scss b/traffic_portal/app/src/modules/public/home/_home.scss
deleted file mode 100644
index 8e1e043..0000000
--- a/traffic_portal/app/src/modules/public/home/_home.scss
+++ /dev/null
@@ -1,63 +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.
-
-*/
-
-#homeContainer {
-  -webkit-border-radius: 6px;
-  -moz-border-radius: 6px;
-  border-radius: 6px;
-  margin: 40px 0;
-  background-color: #D3D3D3;
-  opacity: 0.95;
-  color: #333333;
-  padding: 50px;
-
-  .login-panel {
-    margin: 0 50px 0 10px;
-
-    .panel-body {
-      background-color: transparent;
-    }
-
-    input {
-      font-size: 14.88px;
-      line-height: 2;
-      outline: 0;
-      border: 1px solid #b8b8b8;
-      -webkit-appearance: none;
-      border-radius: 0;
-      padding: 0 10px;
-      width: 100%;
-      background-color: #e5e5e5;
-      color: black;
-    }
-
-  }
-
-  h4 {
-    color: #333333;
-    margin-top: 0;
-  }
-
-}
-
-@media all and (max-width: 991px) {
-  #homeContainer {
-    .login-panel {
-      margin: 0 0 50px 0;
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/public/home/home.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/home/home.tpl.html b/traffic_portal/app/src/modules/public/home/home.tpl.html
deleted file mode 100644
index 13c6cb0..0000000
--- a/traffic_portal/app/src/modules/public/home/home.tpl.html
+++ /dev/null
@@ -1,49 +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="homeContainer">
-    <div class="row">
-        <div class="col-lg-6 col-md-6 col-sm-12">
-            <div class="login-panel panel panel-default">
-                <div class="panel-body">
-                    <form name="loginForm" role="form" ng-submit="login(credentials)" novalidate>
-                        <div class="form-group">
-                            <div class="input-group">
-                                <span class="input-group-addon"><i class="fa fa-user fa-fw"></i></span>
-                                <input id="username" name="username" type="text" class="form-control" autocomplete="off" placeholder="Username" ng-model="credentials.username" rc-verify-set autofocus required>
-                            </div>
-                        </div>
-                        <div class="form-group">
-                            <div class="input-group">
-                                <span class="input-group-addon"><i class="fa fa-key fa-fw"></i></span>
-                                <input id="password" name="password" type="password" class="form-control" autocomplete="off" placeholder="Password" ng-model="credentials.password" rc-verify-set required>
-                            </div>
-                        </div>
-                        <button type="submit" class="action-btn btn" ng-disabled="loginForm.$invalid">Log in &nbsp;&nbsp;<i class="fa fa-chevron-circle-right fa-lg"></i></button>
-                        <button type="button" class="btn btn-link" ng-click="resetPassword()">Reset Password</button>
-                    </form>
-                </div>
-            </div>
-        </div>
-        <div class="col-lg-6 col-md-6 col-sm-12">
-            <div ng-repeat="section in sections">
-                <h4>{{section.header}}</h4>
-                <p>{{section.description}}</p>
-            </div>
-        </div>
-    </div>
-</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/home/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/home/index.js b/traffic_portal/app/src/modules/public/home/index.js
deleted file mode 100644
index 75a33e0..0000000
--- a/traffic_portal/app/src/modules/public/home/index.js
+++ /dev/null
@@ -1,34 +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.home', [])
-    .controller('HomeController', require('./HomeController'))
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.public.home', {
-                url: '',
-                abstract: true,
-                views: {
-                    publicContent: {
-                        templateUrl: 'modules/public/home/home.tpl.html',
-                        controller: 'HomeController'
-                    }
-                }
-            })
-        ;
-        $urlRouterProvider.otherwise('/');
-    });
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/public/home/landing/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/home/landing/index.js b/traffic_portal/app/src/modules/public/home/landing/index.js
deleted file mode 100644
index 0a90e0a..0000000
--- a/traffic_portal/app/src/modules/public/home/landing/index.js
+++ /dev/null
@@ -1,26 +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.home.landing', [])
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.public.home.landing', {
-                url: ''
-            })
-        ;
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/public/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/index.js b/traffic_portal/app/src/modules/public/index.js
index 5bd8b70..1e6bdd1 100644
--- a/traffic_portal/app/src/modules/public/index.js
+++ b/traffic_portal/app/src/modules/public/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.public', [])
@@ -22,6 +24,10 @@ module.exports = angular.module('trafficPortal.public', [])
                 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,10 +38,6 @@ module.exports = angular.module('trafficPortal.public', [])
                     },
                     content: {
                         templateUrl: 'modules/public/public.tpl.html'
-                    },
-                    footer: {
-                        templateUrl: 'common/modules/footer/footer.tpl.html',
-                        controller: 'FooterController'
                     }
                 }
             });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/public/login/LoginController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/login/LoginController.js b/traffic_portal/app/src/modules/public/login/LoginController.js
new file mode 100644
index 0000000..f8e1282
--- /dev/null
+++ b/traffic_portal/app/src/modules/public/login/LoginController.js
@@ -0,0 +1,49 @@
+/*
+ * 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 LoginController = function($scope, $log, $uibModal, authService) {
+
+    $scope.credentials = {
+        username: '',
+        password: ''
+    };
+
+    $scope.login = function(credentials) {
+        authService.login(credentials.username, credentials.password);
+    };
+
+    $scope.resetPassword = function() {
+
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/reset/dialog.reset.tpl.html',
+            controller: 'DialogResetController'
+        });
+
+        modalInstance.result.then(function(email) {
+            authService.resetPassword(email);
+        }, function () {
+        });
+    };
+
+    var init = function() {};
+    init();
+};
+
+LoginController.$inject = ['$scope', '$log', '$uibModal', 'authService'];
+module.exports = LoginController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/public/login/_login.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/login/_login.scss b/traffic_portal/app/src/modules/public/login/_login.scss
new file mode 100644
index 0000000..d57b9c6
--- /dev/null
+++ b/traffic_portal/app/src/modules/public/login/_login.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/public/login/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/login/index.js b/traffic_portal/app/src/modules/public/login/index.js
new file mode 100644
index 0000000..3c7ce96
--- /dev/null
+++ b/traffic_portal/app/src/modules/public/login/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.public.login', [])
+    .controller('LoginController', require('./LoginController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.public.login', {
+                url: '',
+                views: {
+                    publicContent: {
+                        templateUrl: 'modules/public/login/login.tpl.html',
+                        controller: 'LoginController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/public/login/login.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/login/login.tpl.html b/traffic_portal/app/src/modules/public/login/login.tpl.html
new file mode 100644
index 0000000..a2a1c0f
--- /dev/null
+++ b/traffic_portal/app/src/modules/public/login/login.tpl.html
@@ -0,0 +1,53 @@
+<!--
+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.
+-->
+
+<section id="loginContainer">
+    <div class="col-md-12 col-sm-12 col-xs-12">
+        <div class="x_panel">
+            <div class="x_title">
+                <h2>Login</h2>
+                <div class="clearfix"></div>
+            </div>
+            <div class="x_content">
+                <br>
+                <form name="loginForm" role="form" ng-submit="login(credentials)" class="form-horizontal form-label-left" novalidate>
+                    <div class="form-group">
+                        <label class="control-label col-md-3 col-sm-3 col-xs-12" for="username">Username <span class="required">*</span></label>
+                        <div class="col-md-6 col-sm-6 col-xs-12">
+                            <input id="username" name="username" type="text" class="form-control" autocomplete="off" ng-model="credentials.username" autofocus required>
+                        </div>
+                    </div>
+                    <div class="form-group">
+                        <label class="control-label col-md-3 col-sm-3 col-xs-12" for="password">Password <span class="required">*</span></label>
+                        <div class="col-md-6 col-sm-6 col-xs-12">
+                            <input id="password" name="password" type="password" class="form-control" autocomplete="off" ng-model="credentials.password" required>
+                        </div>
+                    </div>
+                    <div class="ln_solid"></div>
+                    <div class="form-group">
+                        <div class="col-md-6 col-sm-6 col-xs-12 col-md-offset-3">
+                            <button type="submit" class="btn btn-primary" ng-disabled="loginForm.$invalid">Log in &nbsp;&nbsp;<i class="fa fa-chevron-circle-right"></i></button>
+                            <button type="button" class="btn btn-link" ng-click="resetPassword()">Reset Password</button>
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</section>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/public/public.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/public/public.tpl.html b/traffic_portal/app/src/modules/public/public.tpl.html
index cc9b0ef..254b9e4 100644
--- a/traffic_portal/app/src/modules/public/public.tpl.html
+++ b/traffic_portal/app/src/modules/public/public.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="publicContainer">

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/package.json
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/package.json b/traffic_portal/app/src/package.json
index 389fd03..afbc830 100644
--- a/traffic_portal/app/src/package.json
+++ b/traffic_portal/app/src/package.json
@@ -1,6 +1,5 @@
 {
-    "name": "trafficPortal",
-    "description": "Traffic Portal",
+    "name": "traffic_portal",
     "dependencies": {
         "forever": "0.15.1",
         "morgan": "1.7.0",
@@ -8,9 +7,10 @@
         "connect-modrewrite": "0.8.5",
         "connect-timeout": "1.7.0",
         "ssl-root-cas": "1.1.10",
-        "express": "4.13.4"
+        "express": "4.13.4",
+        "requirejs": "2.1.22"
     },
     "engines": {
-        "node": ">=0.12.0"
+        "node": "0.11.14"
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/robots.txt
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/robots.txt b/traffic_portal/app/src/robots.txt
index 9f135a2..1f3cd1a 100755
--- a/traffic_portal/app/src/robots.txt
+++ b/traffic_portal/app/src/robots.txt
@@ -1,4 +1,3 @@
-# robotstxt.org
 #
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -13,5 +12,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 #
+# robotstxt.org
 
 User-agent: *

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/scripts/config.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/scripts/config.js b/traffic_portal/app/src/scripts/config.js
new file mode 100644
index 0000000..6abbc71
--- /dev/null
+++ b/traffic_portal/app/src/scripts/config.js
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// this is the config the TO UI uses
+
+"use strict";
+
+angular.module('config', [])
+
+.constant('ENV', { api: { root:'/api/1.2/' } })
+
+;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/scripts/shared-libs.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/scripts/shared-libs.js b/traffic_portal/app/src/scripts/shared-libs.js
old mode 100755
new mode 100644
index da55075..06c68f2
--- a/traffic_portal/app/src/scripts/shared-libs.js
+++ b/traffic_portal/app/src/scripts/shared-libs.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.
  */
 
 /**
@@ -27,6 +29,9 @@ require('angular-route');
 require('angular-sanitize');
 require('angular-ui-router');
 
+// angular jwt
+require('angular-jwt');
+
 // angular loading bar
 require('loading-bar');
 
@@ -34,12 +39,15 @@ require('loading-bar');
 require('ui-bootstrap');
 require('ui-bootstrap-tpls');
 
+// restangular
+require('restangular');
+
 // jquery
 require('jquery');
-//require('jquery-ui');
 
 // flot charts
 require('jquery-flot');
+require('jquery-flot-pie');
 require('jquery-flot-stack');
 require('jquery-flot-time');
 require('jquery-flot-tooltip');

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/styles/main.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/styles/main.scss b/traffic_portal/app/src/styles/main.scss
index 2d1f62e..752f7bd 100755
--- a/traffic_portal/app/src/styles/main.scss
+++ b/traffic_portal/app/src/styles/main.scss
@@ -14,154 +14,107 @@
  limitations under the License.
 
 */
+@charset "utf-8";
+
+$fa-font-path: "../assets/fonts";
 
 @import url(//fonts.googleapis.com/css?family=Lato:300,400,700,900,400italic);
 
 @import "variables";
 @import "bootstrap-sass-official/assets/stylesheets/bootstrap";
+@import "font-awesome/scss/font-awesome";
 
 // common
-@import "../common/modules/cacheGroups/cacheGroups";
-@import "../common/modules/chart/chart";
-@import "../common/modules/chart/bandwidthPerSecond/chart.bandwidthPerSecond";
-@import "../common/modules/chart/capacity/chart.capacity";
-@import "../common/modules/chart/dates/chart.dates";
-@import "../common/modules/chart/httpStatus/chart.httpStatus";
-@import "../common/modules/chart/routing/chart.routing";
-@import "../common/modules/chart/transactionsPerSecond/chart.transactionsPerSecond";
-@import "../common/modules/deliveryService/config/edit/deliveryService.config.edit";
-@import "../common/modules/dates/dates";
 @import "../common/modules/dialog/confirm/dialog.confirm";
 @import "../common/modules/dialog/reset/dialog.reset";
+@import "../common/modules/form/user/form.user";
 @import "../common/modules/header/header";
 @import "../common/modules/message/message";
-@import "../common/modules/release/version/release.version";
-@import "../common/modules/tools/purge/tools.purge";
+@import "../common/modules/navigation/navigation";
+@import "../common/modules/table/table";
+@import "../common/modules/release/release";
+@import "../common/modules/widget/capacity/widget.capacity";
+@import "../common/modules/widget/cacheGroups/widget.cacheGroups";
+@import "../common/modules/widget/cdnChart/widget.cdnChart";
+@import "../common/modules/widget/routing/widget.routing";
 
 // public
-@import "../modules/public/home/home";
-@import "../modules/public/about/about";
+@import "../modules/public/login/login";
 
 // private
 
-// collateral
-@import "../modules/private/collateral/collateral";
-
-// dashboard
-@import "../modules/private/dashboard/dashboard";
-@import "../modules/private/dashboard/overview/deliveryServices/dashboard.deliveryServices";
-
-// delivery service
-@import "../modules/private/deliveryService/deliveryService";
-@import "../modules/private/deliveryService/new/deliveryService.new";
-@import "../modules/private/deliveryService/view/deliveryService.view";
-@import "../modules/private/deliveryService/view/overview/deliveryService.view.overview";
-@import "../modules/private/deliveryService/view/charts/deliveryService.view.charts";
-
 // user
 @import "../modules/private/user/user";
-@import "../modules/private/user/edit/user.edit";
-@import "../modules/private/user/register/user.register";
-@import "../modules/private/user/reset/user.reset";
 
-html {
-//  for sticky footer
-  position: relative;
-  min-height: 100%;
-}
+// admin
+@import "../modules/private/admin/admin";
+@import "../modules/private/admin/cdns/config/config";
+@import "../modules/private/admin/regions/regions";
+@import "../modules/private/admin/tenants/tenants";
+@import "../modules/private/admin/users/users";
 
-body {
-  font-family: 'Lato', sans-serif;
-  font-size: 16px;
-  margin-bottom: 170px; //  for sticky footer
-}
+// configure
+@import "../modules/private/configure/configure";
+@import "../modules/private/configure/cacheGroups/cacheGroups";
+@import "../modules/private/configure/deliveryServices/deliveryServices";
+@import "../modules/private/configure/servers/servers";
 
-h1, h2, h3, h4, h5, h6 {
-  line-height: 1.2;
-  font-weight: 700;
-}
+// custom
+@import "../modules/private/custom/custom";
 
-h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {
-  color: inherit;
-}
-
-h1 {
-  font-size: 40px;
-}
-
-h2 {
-  font-size: 32px;
-}
-
-h3 {
-  font-size: 30px;
-}
-
-h4 {
-  font-size: 24px;
-}
+// monitor
+@import "../modules/private/monitor/monitor";
 
-h5 {
-  font-size: 20px;
-}
+// dashboard
+@import "../modules/private/monitor/dashboard/dashboard";
 
-h6 {
-  font-size: 16px;
-}
+// map
+@import "../modules/private/monitor/map/map";
 
-p {
-  font-size: 16px;
-  line-height: 22px;
-  margin: 5px 0 25px 0;
+[ng-click] {
+  cursor: pointer;
 }
 
-ul li, ol li {
-  font-size: 16px;
-  line-height: 1.5;
+html {
   position: relative;
+  min-height: 100%;
 }
 
-a:focus, button:focus {
-  outline: none !important;
+body {
+  color: #73879C;
+  background: #F7F7F7;
+  font-family: 'Lato', sans-serif;
+  font-size: 13px;
 }
 
-.navbar {
-  border-radius: 0;
-  margin-bottom: 0;
+body .container.body .main-content {
+  background: #F7F7F7;
 }
 
-.navbar-nav > li {
-  margin-right: 5px;
+body.nav-md .container.body .main-content {
+  padding: 10px 20px 0;
 }
 
-.navbar-collapse {
-  padding-left: 0px;
-  margin-left: -10px !important;
+body.nav-sm .container.body .main-content {
+  padding: 10px 20px;
+  margin-left: 70px;
+  z-index: 2;
 }
 
-.nav-pills > li.header {
-  padding: 22px;
+.container {
+  width: 100%;
+  padding: 0
 }
 
-.jumbotron {
-  text-align: center;
-  border: 1px solid #A8A8A8;
-  background-color: #fff;
-  border-radius: 0 !important;
-
-  .btn {
-    font-size: 21px;
-    padding: 14px 24px;
+.column-title {
+  a {
+    color: white;
   }
 }
 
-.panel, .form-control, .list-group-item, .btn-default {
-  background-color: transparent;
-}
-
-.panel-heading {
-  border-radius: 0;
-  padding: 15px;
+.dropdown-menu-right {
+  left: auto !important; // Reset the default from `.dropdown-menu`
+  right: 0 !important;
 }
 
 .input-error {
@@ -169,181 +122,33 @@ a:focus, button:focus {
   font-weight: bold;
 }
 
-.breadcrumb {
-  background-color: transparent;
-  text-transform: uppercase;
+.x_title {
+  border-bottom: 2px solid #E6E9ED;
+  padding: 1px 5px 6px;
   margin-bottom: 10px;
 
-  li {
-    margin-top: 10px;
-  }
-
-  .btn {
-    padding-left: 0px;
-  }
-}
-
-.date-text[disabled] {
-  background-color: transparent;
-}
-
-.modal-title {
-  color: #ffffff;
-}
-
-.pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus, .pagination > li > a, .pagination > li > span {
-  background-color: transparent;
-}
-
-.dropdown {
-  .btn-link {
-    text-decoration: none;
-  }
-}
-
-[ng-click] {
-  cursor: pointer;
-}
-
-.modal-header {
-  background-color: #222;
-  border-color: #090909;
-  color: #999;
-}
-
-.loading-text {
-  color: #999;
-  font-size: 12px;
-  font-weight: bold;
-}
-
-.btn-last {
-  border-bottom-left-radius: 0;
-  border-top-left-radius: 0;
-  border-bottom-right-radius: 4px !important;
-  border-top-right-radius: 4px !important;
-}
-
-.list-group-item, table {
-  .description, small {
-    font-size: 11px;
-    color: #999;
-  }
-  .badge {
-    float: right;
-  }
-}
-
-#footer {
-//  for sticky footer
-background: black;
-height: 170px;
-position: absolute;
-bottom: 0;
-width: 100%;
-border-top: 2px solid #706f6f;
-margin-top: 40px;
-
-.footer-bottom {
-padding-top: 40px;
-padding-bottom: 40px;
-color: #706f6f;
-font-weight: bold;
-
-.menu-list {
-  float: left;
-
-  li {
+  .breadcrumb {
+    padding: 8px 15px 4px 0;
+    margin-bottom: 0;
     list-style: none;
+    background-color: white;
+    border-radius: 0;
+    font-size: 24px;
   }
 
-  > li {
-    float: left;
-    padding-right: 50px;
-    margin-right: 50px;
+  button {
+    margin: 8px 6px 4px 0;
   }
 
-  > li:last-child {
-    margin-right: 0;
+  .btn-group {
+    margin-top: -4px;
   }
 
 }
 
-a {
-  color: #706f6f;
-  text-decoration: none;
-  line-height: 1.5;
-  font-weight: bold;
-}
-
-}
-
-}
-
-.scrollable::-webkit-scrollbar {
--webkit-appearance: none;
-}
-
-.scrollable::-webkit-scrollbar:vertical {
-width: 11px;
-}
-
-.scrollable::-webkit-scrollbar:horizontal {
-height: 11px;
-}
-
-.scrollable::-webkit-scrollbar-thumb {
-border-radius: 8px;
-border: 2px solid white; /* should match background, can't be transparent */
-  background-color: rgba(0, 0, 0, .5);
-}
-
-@media (max-width: 991px) {
-
-  .navbar-header {
-    float: none;
-  }
-
-  .navbar-toggle {
-    display: block;
-  }
-
-  .navbar-collapse {
-    border-top: 1px solid transparent;
-    box-shadow: inset 0 1px 0 rgba(255,255,255,0.1);
-  }
-
-  .navbar-collapse.collapse {
-    display: none !important;
-  }
-
-  .navbar-nav {
-    float: none !important;
-    margin: 7.5px -15px;
-  }
-
-  .navbar-nav > li {
-    float: none;
-  }
-
-  .navbar-nav > li > a {
-    padding-top: 10px;
-    padding-bottom: 10px;
-  }
-
-  .navbar-text {
-    float: none;
-    margin: 15px 0;
-  }
-
-  /* since 3.1.0 */
-  .navbar-collapse.collapse.in {
-    display: block !important;
+@media(min-width:992px) {
+  body.nav-md .container.body .main-content {
+    margin-left: 230px;
   }
-
-  .collapsing {
-    overflow: hidden !important;
-  }
-
 }
 



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js
deleted file mode 100644
index f27aaad..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableDeliveryServiceServersController = function(deliveryService, servers, $scope, $state, $uibModal, locationUtils, serverUtils, deliveryServiceService) {
-
-	$scope.deliveryService = deliveryService;
-
-	$scope.servers = servers;
-
-	$scope.removeServer = function(dsId, serverId) {
-		deliveryServiceService.deleteDeliveryServiceServer(dsId, serverId)
-			.then(
-				function() {
-					$scope.refresh();
-				}
-			);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.selectServers = function() {
-		var modalInstance = $uibModal.open({
-			templateUrl: 'common/modules/table/deliveryServiceServers/table.dsServersUnassigned.tpl.html',
-			controller: 'TableDSServersUnassignedController',
-			size: 'lg',
-			resolve: {
-				deliveryService: function() {
-					return deliveryService;
-				},
-				eligibleServers: function(serverService) {
-					return serverService.getEligibleDeliveryServiceServers(deliveryService.id);
-				},
-				assignedServers: function() {
-					return servers;
-				}
-			}
-		});
-		modalInstance.result.then(function(selectedServerIds) {
-			deliveryServiceService.assignDeliveryServiceServers(deliveryService.id, selectedServerIds)
-				.then(
-					function() {
-						$scope.refresh();
-					}
-				);
-		}, function () {
-			// do nothing
-		});
-	};
-
-
-	$scope.isOffline = serverUtils.isOffline;
-
-	$scope.offlineReason = serverUtils.offlineReason;
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#serversTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableDeliveryServiceServersController.$inject = ['deliveryService', 'servers', '$scope', '$state', '$uibModal', 'locationUtils', 'serverUtils', 'deliveryServiceService'];
-module.exports = TableDeliveryServiceServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/index.js
deleted file mode 100644
index 029d37b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.deliveryServiceServers', [])
-	.controller('TableDeliveryServiceServersController', require('./TableDeliveryServiceServersController'))
-	.controller('TableDSServersUnassignedController', require('./TableDSServersUnassignedController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html
deleted file mode 100644
index b93bb32..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
-            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
-            <li class="active">Servers</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Link Servers to Delivery Service" ng-click="selectServers()"><i class="fa fa-link"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="serversTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>Update?</th>
-                <th>hostName</th>
-                <th>domainName</th>
-                <th>ipAddress</th>
-                <th>ip6Address</th>
-                <th>status</th>
-                <th>type</th>
-                <th>profile</th>
-                <th>cdn</th>
-                <th>cachegroup</th>
-                <th></th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-repeat="server in ::servers" ng-class="::{'active': server.updPending}">
-                <td class="update-column">
-                    <i class="fa fa-flag" ng-if="server.updPending"></i>
-                    <i class="fa fa-ban" ng-if="!server.updPending"></i>
-                </td>
-                <td>{{::server.hostName}}</td>
-                <td>{{::server.domainName}}</td>
-                <td>{{::server.ipAddress}}</td>
-                <td>{{::server.ip6Address}}</td>
-                <td>
-                    <span ng-if="!isOffline(server.status)">{{::server.status}}</span>
-                    <span ng-if="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
-                </td>
-                <td>{{::server.type}}</td>
-                <td>{{::server.profile}}</td>
-                <td>{{::server.cdnName}}</td>
-                <td>{{::server.cachegroup}}</td>
-                <td><button type="button" class="btn btn-link" title="Unlink Server from Delivery Service" ng-click="removeServer(deliveryService.id, server.id)"><i class="fa fa-chain-broken"></i></button></td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/table.dsServersUnassigned.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/table.dsServersUnassigned.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/table.dsServersUnassigned.tpl.html
deleted file mode 100644
index 7c15cf1..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/table.dsServersUnassigned.tpl.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-
-
-<div class="modal-header">
-    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-    <h3 class="modal-title">Assign Servers to {{::deliveryService.xmlId}}</h3>
-</div>
-<div class="modal-body">
-    <table id="dsServersUnassignedTable" class="table responsive-utilities jambo_table" style="table-layout:fixed; width:100%;">
-        <thead>
-        <tr class="headings">
-            <th style="padding-left: 10px;"><input type="checkbox" ng-click="selectAll($event)" ng-checked="allSelected()"></th>
-            <th>hostName</th>
-            <th>cachegroup</th>
-            <th>profile</th>
-        </tr>
-        </thead>
-        <tbody>
-        <tr ng-repeat="server in ::selectedServers">
-            <td><input type="checkbox" ng-click="updateServers($event, server.id)" ng-checked="server.selected"></td>
-            <td>{{::server.hostName}}</td>
-            <td>{{::server.cachegroup}}</td>
-            <td>{{::server.profile}}</td>
-        </tr>
-        </tbody>
-    </table>
-</div>
-<div class="modal-footer">
-    <button class="btn btn-link" ng-click="cancel()">cancel</button>
-    <button class="btn btn-primary" ng-click="submit()">Submit</button>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceStaticDnsEntries/TableDeliveryServiceStaticDnsEntriesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceStaticDnsEntries/TableDeliveryServiceStaticDnsEntriesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceStaticDnsEntries/TableDeliveryServiceStaticDnsEntriesController.js
deleted file mode 100644
index 99f191d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceStaticDnsEntries/TableDeliveryServiceStaticDnsEntriesController.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableDeliveryServiceStaticDnsEntriesController = function(deliveryService, staticDnsEntries, $scope, $state, locationUtils) {
-
-	$scope.deliveryService = deliveryService;
-
-	$scope.staticDnsEntries = staticDnsEntries;
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#staticDnsEntriesTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableDeliveryServiceStaticDnsEntriesController.$inject = ['deliveryService', 'staticDnsEntries', '$scope', '$state', 'locationUtils'];
-module.exports = TableDeliveryServiceStaticDnsEntriesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceStaticDnsEntries/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceStaticDnsEntries/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceStaticDnsEntries/index.js
deleted file mode 100644
index 8de9a14..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceStaticDnsEntries/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.deliveryServiceStaticDnsEntries', [])
-	.controller('TableDeliveryServiceStaticDnsEntriesController', require('./TableDeliveryServiceStaticDnsEntriesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceStaticDnsEntries/table.deliveryServiceStaticDnsEntries.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceStaticDnsEntries/table.deliveryServiceStaticDnsEntries.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceStaticDnsEntries/table.deliveryServiceStaticDnsEntries.tpl.html
deleted file mode 100644
index 1396158..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceStaticDnsEntries/table.deliveryServiceStaticDnsEntries.tpl.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
-            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
-            <li class="active">Static DNS Entries</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="staticDnsEntriesTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>host</th>
-                <th>address</th>
-                <th>type</th>
-                <th>ttl</th>
-                <th>deliveryservice</th>
-                <th>cachegroup</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-repeat="staticDnsEntry in ::staticDnsEntries">
-                <td>{{::staticDnsEntry.host}}</td>
-                <td>{{::staticDnsEntry.address}}</td>
-                <td>{{::staticDnsEntry.type}}</td>
-                <td>{{::staticDnsEntry.ttl}}</td>
-                <td>{{::staticDnsEntry.deliveryservice}}</td>
-                <td>{{::staticDnsEntry.cachegroup}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceUsers/TableDeliveryServiceUsersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceUsers/TableDeliveryServiceUsersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceUsers/TableDeliveryServiceUsersController.js
deleted file mode 100644
index f16131f..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceUsers/TableDeliveryServiceUsersController.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableDeliveryServiceUsersController = function(deliveryService, users, $scope, $state, locationUtils) {
-
-	$scope.deliveryService = deliveryService;
-
-	$scope.users = users;
-
-	$scope.addUser = function() {
-		alert('not hooked up yet: addUser to ds');
-	};
-
-	$scope.removeUser = function() {
-		alert('not hooked up yet: removeUser from ds');
-	};
-
-	$scope.isAdmin = function(user) {
-		return user.role == 4;
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#usersTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableDeliveryServiceUsersController.$inject = ['deliveryService', 'users', '$scope', '$state', 'locationUtils'];
-module.exports = TableDeliveryServiceUsersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceUsers/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceUsers/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceUsers/index.js
deleted file mode 100644
index 6cf5b1e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceUsers/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.deliveryServiceUsers', [])
-	.controller('TableDeliveryServiceUsersController', require('./TableDeliveryServiceUsersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceUsers/table.deliveryServiceUsers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceUsers/table.deliveryServiceUsers.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceUsers/table.deliveryServiceUsers.tpl.html
deleted file mode 100644
index 2e9a21e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceUsers/table.deliveryServiceUsers.tpl.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
-            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
-            <li class="active">Users</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-            <button class="btn btn-primary" ng-click="addUser()">Add</button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="usersTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>Full Name</th>
-                <th>Username</th>
-                <th>Email</th>
-                <th>Role</th>
-                <th></th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editUser(user.id)" ng-repeat="user in ::users">
-                <td>{{::user.fullName}}</td>
-                <td>{{::user.username}}</td>
-                <td>{{::user.email}}</td>
-                <td>{{::user.rolename}}</td>
-                <td><button type="button" class="btn btn-link" title="Remove from Delivery Service" ng-click="removeUser()" ng-hide="isAdmin(user)"><i class="fa fa-trash-o"></i></button></td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServices/TableDeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServices/TableDeliveryServicesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServices/TableDeliveryServicesController.js
deleted file mode 100644
index 44d82f8..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServices/TableDeliveryServicesController.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableDeliveryServicesController = function(deliveryServices, $scope, $state, $uibModal, locationUtils) {
-
-    $scope.deliveryServices = deliveryServices;
-
-    $scope.editDeliveryService = function(ds) {
-        var path = '/configure/delivery-services/' + ds.id + '?type=' + ds.type;
-        locationUtils.navigateToPath(path);
-    };
-
-    var createDeliveryService = function(typeName) {
-        var path = '/configure/delivery-services/new?type=' + typeName;
-        locationUtils.navigateToPath(path);
-    };
-
-    $scope.refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-    $scope.selectDSType = function() {
-        var params = {
-            title: 'Create Delivery Service',
-            message: "Please select a content routing type"
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
-            controller: 'DialogSelectController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                },
-                collection: function(typeService) {
-                    return typeService.getTypes( { useInTable: 'deliveryservice'} );
-                }
-            }
-        });
-        modalInstance.result.then(function(type) {
-            createDeliveryService(type.name);
-        }, function () {
-            // do nothing
-        });
-    };
-
-    angular.element(document).ready(function () {
-        $('#deliveryServicesTable').dataTable({
-            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-            "iDisplayLength": 25,
-            "aaSorting": []
-        });
-    });
-
-};
-
-TableDeliveryServicesController.$inject = ['deliveryServices', '$scope', '$state', '$uibModal', 'locationUtils'];
-module.exports = TableDeliveryServicesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServices/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServices/index.js
deleted file mode 100644
index 9e75882..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServices/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.deliveryServices', [])
-    .controller('TableDeliveryServicesController', require('./TableDeliveryServicesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServices/table.deliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServices/table.deliveryServices.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServices/table.deliveryServices.tpl.html
deleted file mode 100644
index 3b97e89..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServices/table.deliveryServices.tpl.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">Delivery Services</li>
-        </ol>
-        <div class="pull-right" role="group" ng-if="!settings.isNew">
-            <button class="btn btn-primary" title="Create Delivery Service" ng-click="selectDSType()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="deliveryServicesTable" class="table responsive-utilities jambo_table">
-            <thead>
-                <tr class="headings">
-                    <th>xmlId</th>
-                    <th>orgServerFqdn</th>
-                    <th>active</th>
-                    <th>type</th>
-                    <th>protocol</th>
-                    <th>cdn</th>
-                    <th>ipv6RoutingEnabled</th>
-                    <th>dscp</th>
-                    <th>signed</th>
-                    <th>qstringIgnore</th>
-                </tr>
-            </thead>
-            <tbody>
-                <tr ng-click="editDeliveryService(deliveryService)" ng-repeat="deliveryService in ::deliveryServices">
-                    <td>{{::deliveryService.xmlId}}</td>
-                    <td>{{::deliveryService.orgServerFqdn}}</td>
-                    <td>{{::deliveryService.active}}</td>
-                    <td>{{::deliveryService.type}}</td>
-                    <td>{{::deliveryService.protocol}}</td>
-                    <td>{{::deliveryService.cdnName}}</td>
-                    <td>{{::deliveryService.ipv6RoutingEnabled}}</td>
-                    <td>{{::deliveryService.dscp}}</td>
-                    <td>{{::deliveryService.signed}}</td>
-                    <td>{{::deliveryService.qstringIgnore}}</td>
-                </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/TableDivisionRegionsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/TableDivisionRegionsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/TableDivisionRegionsController.js
deleted file mode 100644
index e953251..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/TableDivisionRegionsController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableDivisionRegionsController = function(division, divisionRegions, $scope, $state, locationUtils) {
-
-	$scope.division = division;
-
-	$scope.divisionRegions = divisionRegions;
-
-	$scope.editRegion = function(id) {
-		locationUtils.navigateToPath('/admin/regions/' + id);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#regionsTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableDivisionRegionsController.$inject = ['division', 'divisionRegions', '$scope', '$state', 'locationUtils'];
-module.exports = TableDivisionRegionsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/index.js
deleted file mode 100644
index 785d4e9..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.divisionRegions', [])
-	.controller('TableDivisionRegionsController', require('./TableDivisionRegionsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/table.divisionRegions.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/table.divisionRegions.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/table.divisionRegions.tpl.html
deleted file mode 100644
index 6f9ad6c..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/divisionRegions/table.divisionRegions.tpl.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/divisions')">Divisions</a></li>
-            <li><a ng-click="navigateToPath('/admin/divisions/' + division.id)">{{::division.name}}</a></li>
-            <li class="active">Regions</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="regionsTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>name</th>
-                <th>division</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editRegion(region.id)" ng-repeat="region in ::divisionRegions">
-                <td>{{::region.name}}</td>
-                <td>{{::region.divisionName}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/divisions/TableDivisionsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/divisions/TableDivisionsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/divisions/TableDivisionsController.js
deleted file mode 100644
index b4e5831..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/divisions/TableDivisionsController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableDivisionsController = function(divisions, $scope, $state, locationUtils) {
-
-    $scope.divisions = divisions;
-
-    $scope.editDivision = function(id) {
-        locationUtils.navigateToPath('/admin/divisions/' + id);
-    };
-
-    $scope.createDivision = function() {
-        locationUtils.navigateToPath('/admin/divisions/new');
-    };
-
-    $scope.refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-    angular.element(document).ready(function () {
-        $('#divisionsTable').dataTable({
-            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-            "iDisplayLength": 25,
-            "aaSorting": []
-        });
-    });
-
-};
-
-TableDivisionsController.$inject = ['divisions', '$scope', '$state', 'locationUtils'];
-module.exports = TableDivisionsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/divisions/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/divisions/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/divisions/index.js
deleted file mode 100644
index 946f6b4..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/divisions/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.divisions', [])
-    .controller('TableDivisionsController', require('./TableDivisionsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/divisions/table.divisions.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/divisions/table.divisions.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/divisions/table.divisions.tpl.html
deleted file mode 100644
index 47e1e4b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/divisions/table.divisions.tpl.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">Divisions</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Create Division" ng-click="createDivision()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="divisionsTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>name</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editDivision(division.id)" ng-repeat="division in ::divisions">
-                <td>{{::division.name}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/TableJobsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/TableJobsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/TableJobsController.js
deleted file mode 100644
index 4b708d4..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/TableJobsController.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableJobsController = function(jobs, $scope, $state, locationUtils) {
-
-	$scope.jobs = jobs;
-
-	$scope.createJob = function() {
-		locationUtils.navigateToPath('/admin/jobs/new');
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	angular.element(document).ready(function () {
-		$('#jobsTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableJobsController.$inject = ['jobs', '$scope', '$state', 'locationUtils'];
-module.exports = TableJobsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/index.js
deleted file mode 100644
index 65cc604..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.jobs', [])
-	.controller('TableJobsController', require('./TableJobsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/table.jobs.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/table.jobs.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/table.jobs.tpl.html
deleted file mode 100644
index e7de6fc..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/jobs/table.jobs.tpl.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">Invalidate Content Jobs</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <button class="btn btn-primary" title="Create Invalidate Content Job" ng-click="createJob()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="jobsTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>deliveryService</th>
-                <th>assetUrl</th>
-                <th>parameters</th>
-                <th>start</th>
-                <th>createdBy</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-repeat="job in ::jobs">
-                <td>{{::job.deliveryService}}</td>
-                <td>{{::job.assetUrl}}</td>
-                <td>{{::job.parameters}}</td>
-                <td>{{::job.startTime}}</td>
-                <td>{{::job.createdBy}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/parameterCacheGroups/TableParameterCacheGroupsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterCacheGroups/TableParameterCacheGroupsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/parameterCacheGroups/TableParameterCacheGroupsController.js
deleted file mode 100644
index fc3dbea..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterCacheGroups/TableParameterCacheGroupsController.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableParameterCacheGroupsController = function(parameter, cacheGroups, $scope, $state, locationUtils) {
-
-	$scope.parameter = parameter;
-
-	$scope.cacheGroups = cacheGroups;
-
-	$scope.addCacheGroup = function() {
-		alert('not hooked up yet: add cg to parameter');
-	};
-
-	$scope.removeCacheGroup = function() {
-		alert('not hooked up yet: remove cg from parameter');
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#cacheGroupsTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableParameterCacheGroupsController.$inject = ['parameter', 'cacheGroups', '$scope', '$state', 'locationUtils'];
-module.exports = TableParameterCacheGroupsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/parameterCacheGroups/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterCacheGroups/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/parameterCacheGroups/index.js
deleted file mode 100644
index 69f34a9..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterCacheGroups/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.parameterCacheGroups', [])
-	.controller('TableParameterCacheGroupsController', require('./TableParameterCacheGroupsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/parameterCacheGroups/table.parameterCacheGroups.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterCacheGroups/table.parameterCacheGroups.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/parameterCacheGroups/table.parameterCacheGroups.tpl.html
deleted file mode 100644
index 575b75b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterCacheGroups/table.parameterCacheGroups.tpl.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/parameters')">Parameters</a></li>
-            <li><a ng-click="navigateToPath('/admin/parameters/' + parameter.id)">{{::parameter.name}}</a></li>
-            <li class="active">Cache Groups</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Add Cache Group" ng-click="addCacheGroup()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="cacheGroupsTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>name</th>
-                <th>shortName</th>
-                <th>type</th>
-                <th>latitude</th>
-                <th>longitude</th>
-                <th></th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-repeat="cacheGroup in ::cacheGroups">
-                <td>{{::cacheGroup.name}}</td>
-                <td>{{::cacheGroup.shortName}}</td>
-                <td>{{::cacheGroup.typeName}}</td>
-                <td>{{::cacheGroup.latitude}}</td>
-                <td>{{::cacheGroup.longitude}}</td>
-                <td><button type="button" class="btn btn-link" title="Remove Cache Group" ng-click="removeCacheGroup()"><i class="fa fa-trash-o"></i></button></td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/TableParamProfilesUnassignedController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/TableParamProfilesUnassignedController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/TableParamProfilesUnassignedController.js
deleted file mode 100644
index 2aa585b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/TableParamProfilesUnassignedController.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableParamProfilesUnassignedController = function(parameter, profiles, $scope, $uibModalInstance) {
-
-	var selectedProfiles = [];
-
-	$scope.parameter = parameter;
-
-	$scope.unassignedProfiles = profiles;
-
-	var addProfile = function(profileId) {
-		if (_.indexOf(selectedProfiles, profileId) == -1) {
-			selectedProfiles.push(profileId);
-		}
-	};
-
-	var removeProfile = function(profileId) {
-		selectedProfiles = _.without(selectedProfiles, profileId);
-	};
-
-	$scope.updateProfiles = function($event, profileId) {
-		var checkbox = $event.target;
-		if (checkbox.checked) {
-			addProfile(profileId);
-		} else {
-			removeProfile(profileId);
-		}
-	};
-
-	$scope.submit = function() {
-		$uibModalInstance.close(selectedProfiles);
-	};
-
-	$scope.cancel = function () {
-		$uibModalInstance.dismiss('cancel');
-	};
-
-	angular.element(document).ready(function () {
-		$('#paramProfilesUnassignedTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"order": [[ 1, 'asc' ]],
-			"columnDefs": [
-				{ "width": "5%", "targets": 0 }
-			]
-		});
-	});
-
-};
-
-TableParamProfilesUnassignedController.$inject = ['parameter', 'profiles', '$scope', '$uibModalInstance'];
-module.exports = TableParamProfilesUnassignedController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/TableParameterProfilesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/TableParameterProfilesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/TableParameterProfilesController.js
deleted file mode 100644
index 3fb44f6..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/TableParameterProfilesController.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableParameterProfilesController = function(parameter, parameterProfiles, $scope, $state, $uibModal, locationUtils, profileParameterService) {
-
-	$scope.parameter = parameter;
-
-	$scope.parameterProfiles = parameterProfiles;
-
-	$scope.addProfile = function() {
-		alert('not hooked up yet: add profile to parameter');
-	};
-
-	$scope.removeProfile = function(profileId) {
-		profileParameterService.unlinkProfileParameter(profileId, parameter.id)
-			.then(
-				function() {
-					$scope.refresh();
-				}
-			);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.selectProfiles = function() {
-		var modalInstance = $uibModal.open({
-			templateUrl: 'common/modules/table/parameterProfiles/table.paramProfilesUnassigned.tpl.html',
-			controller: 'TableParamProfilesUnassignedController',
-			size: 'lg',
-			resolve: {
-				parameter: function() {
-					return parameter;
-				},
-				profiles: function(profileService) {
-					return profileService.getParamUnassignedProfiles(parameter.id);
-				}
-			}
-		});
-		modalInstance.result.then(function(selectedProfiles) {
-			var massagedArray = [];
-			for (i = 0; i < selectedProfiles.length; i++) {
-				massagedArray.push( { parameterId: parameter.id, profileId: selectedProfiles[i] } );
-			}
-			profileParameterService.linkProfileParameters(massagedArray)
-				.then(
-					function() {
-						$scope.refresh();
-					}
-				);
-		}, function () {
-			// do nothing
-		});
-	};
-
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#parameterProfilesTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableParameterProfilesController.$inject = ['parameter', 'parameterProfiles', '$scope', '$state', '$uibModal', 'locationUtils', 'profileParameterService'];
-module.exports = TableParameterProfilesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/index.js
deleted file mode 100644
index 88cf42b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.parameterProfiles', [])
-	.controller('TableParameterProfilesController', require('./TableParameterProfilesController'))
-	.controller('TableParamProfilesUnassignedController', require('./TableParamProfilesUnassignedController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/table.paramProfilesUnassigned.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/table.paramProfilesUnassigned.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/table.paramProfilesUnassigned.tpl.html
deleted file mode 100644
index f24e240..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/table.paramProfilesUnassigned.tpl.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-
-
-<div class="modal-header">
-    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-    <h3 class="modal-title">Link Profiles to {{::parameter.name}}</h3>
-</div>
-<div class="modal-body">
-    <table id="paramProfilesUnassignedTable" class="table responsive-utilities jambo_table" style="table-layout:fixed; width:100%;">
-        <thead>
-        <tr class="headings">
-            <th></th>
-            <th>name</th>
-            <th>description</th>
-            <th>type</th>
-            <th>cdn</th>
-        </tr>
-        </thead>
-        <tbody>
-        <tr ng-repeat="profile in ::unassignedProfiles">
-            <td><input type="checkbox" ng-click="updateProfiles($event, profile.id)"></td>
-            <td>{{::profile.name}}</td>
-            <td>{{::profile.description}}</td>
-            <td>{{::profile.type}}</td>
-            <td>{{::profile.cdnName}}</td>
-        </tr>
-        </tbody>
-    </table>
-</div>
-<div class="modal-footer">
-    <button class="btn btn-link" ng-click="cancel()">cancel</button>
-    <button class="btn btn-primary" ng-click="submit()">Submit</button>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/table.parameterProfiles.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/table.parameterProfiles.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/table.parameterProfiles.tpl.html
deleted file mode 100644
index 61fd49a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/parameterProfiles/table.parameterProfiles.tpl.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/parameters')">Parameters</a></li>
-            <li><a ng-click="navigateToPath('/admin/parameters/' + parameter.id)">{{::parameter.name}}</a></li>
-            <li class="active">Profiles</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Link Profiles to Parameter" ng-click="selectProfiles()"><i class="fa fa-link"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="parameterProfilesTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>name</th>
-                <th>description</th>
-                <th></th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-repeat="parameterProfile in ::parameterProfiles">
-                <td>{{::parameterProfile.name}}</td>
-                <td>{{::parameterProfile.description}}</td>
-                <td><button type="button" class="btn btn-link" title="Unlink Profile from Parameter" ng-click="removeProfile(parameterProfile.id)"><i class="fa fa-chain-broken"></i></button></td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/parameters/TableParametersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/parameters/TableParametersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/parameters/TableParametersController.js
deleted file mode 100644
index 4ed957c..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/parameters/TableParametersController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableParametersController = function(parameters, $scope, $state, locationUtils) {
-
-    $scope.parameters = parameters;
-
-    $scope.editParameter = function(id) {
-        locationUtils.navigateToPath('/admin/parameters/' + id);
-    };
-
-    $scope.createParameter = function() {
-        locationUtils.navigateToPath('/admin/parameters/new');
-    };
-
-    $scope.refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-    angular.element(document).ready(function () {
-        $('#parametersTable').dataTable({
-            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-            "iDisplayLength": 25,
-            "aaSorting": []
-        });
-    });
-
-};
-
-TableParametersController.$inject = ['parameters', '$scope', '$state', 'locationUtils'];
-module.exports = TableParametersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/parameters/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/parameters/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/parameters/index.js
deleted file mode 100644
index f9e9fca..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/parameters/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.parameters', [])
-    .controller('TableParametersController', require('./TableParametersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/parameters/table.parameters.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/parameters/table.parameters.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/parameters/table.parameters.tpl.html
deleted file mode 100644
index 3c61a00..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/parameters/table.parameters.tpl.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">Parameters</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Create Parameter" ng-click="createParameter()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="parametersTable" class="table responsive-utilities jambo_table" >
-            <thead>
-                <tr class="headings">
-                    <th>name</th>
-                    <th>configFile</th>
-                    <th>value</th>
-                </tr>
-            </thead>
-            <tbody>
-                <tr ng-click="editParameter(parameter.id)" ng-repeat="parameter in ::parameters">
-                    <td>{{::parameter.name}}</td>
-                    <td>{{::parameter.configFile}}</td>
-                    <td>{{::parameter.value}}</td>
-                </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/physLocationServers/TablePhysLocationServersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/physLocationServers/TablePhysLocationServersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/physLocationServers/TablePhysLocationServersController.js
deleted file mode 100644
index c7f69fc..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/physLocationServers/TablePhysLocationServersController.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TablePhysLocationServersController = function(physLocation, servers, $scope, $state, locationUtils, serverUtils) {
-
-	$scope.physLocation = physLocation;
-
-	$scope.servers = servers;
-
-	$scope.editServer = function(id) {
-		locationUtils.navigateToPath('/configure/servers/' + id);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.isOffline = serverUtils.isOffline;
-
-	$scope.offlineReason = serverUtils.offlineReason;
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#serversTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TablePhysLocationServersController.$inject = ['physLocation', 'servers', '$scope', '$state', 'locationUtils', 'serverUtils'];
-module.exports = TablePhysLocationServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/physLocationServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/physLocationServers/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/physLocationServers/index.js
deleted file mode 100644
index 6049ea4..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/physLocationServers/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.physLocationServers', [])
-	.controller('TablePhysLocationServersController', require('./TablePhysLocationServersController'));


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/.bowerrc
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/.bowerrc b/traffic_ops/experimental/ui/.bowerrc
deleted file mode 100644
index ba0accc..0000000
--- a/traffic_ops/experimental/ui/.bowerrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-    "directory": "app/bower_components"
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/.gitattributes
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/.gitattributes b/traffic_ops/experimental/ui/.gitattributes
deleted file mode 100644
index 2125666..0000000
--- a/traffic_ops/experimental/ui/.gitattributes
+++ /dev/null
@@ -1 +0,0 @@
-* text=auto
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/.gitignore
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/.gitignore b/traffic_ops/experimental/ui/.gitignore
deleted file mode 100644
index 5161722..0000000
--- a/traffic_ops/experimental/ui/.gitignore
+++ /dev/null
@@ -1,6 +0,0 @@
-.tmp
-.sass-cache
-server/log/access.log
-node_modules
-app/bower_components
-app/dist

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/.jshintrc
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/.jshintrc b/traffic_ops/experimental/ui/.jshintrc
deleted file mode 100644
index 6b2ddc7..0000000
--- a/traffic_ops/experimental/ui/.jshintrc
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "browser": true,
-    "esnext": true,
-    "bitwise": true,
-    "camelcase": true,
-    "curly": true,
-    "eqeqeq": true,
-    "immed": true,
-    "indent": 2,
-    "latedef": true,
-    "newcap": true,
-    "noarg": true,
-    "quotmark": "single",
-    "regexp": true,
-    "undef": true,
-    "unused": true,
-    "strict": true,
-    "trailing": true,
-    "smarttabs": true,
-    "globals": {
-        "angular": false
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/Dockerfile
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/Dockerfile b/traffic_ops/experimental/ui/Dockerfile
deleted file mode 100644
index 7c1ebd1..0000000
--- a/traffic_ops/experimental/ui/Dockerfile
+++ /dev/null
@@ -1,24 +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.
-#
-FROM node:4-onbuild
-#FROM buildpack-deps:jessie
-
-RUN apt-get update -y && apt-get install libffi-dev ruby-dev rubygems vim -y
-
-# replace this with your application's default port
-RUN gem update --system && gem install --no-rdoc --no-ri compass && gem install --no-rdoc --no-ri sass -v 3.4.22
-RUN npm install -g bower grunt-cli
-RUN echo '{ "allow_root": true }' > /root/.bowerrc
-RUN cd /usr/src/app && /usr/local/bin/bower install
-RUN cd /usr/src/app && /usr/local/bin/grunt dist

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/Gruntfile.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/Gruntfile.js b/traffic_ops/experimental/ui/Gruntfile.js
deleted file mode 100644
index a058e32..0000000
--- a/traffic_ops/experimental/ui/Gruntfile.js
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-'use strict';
-
-module.exports = function (grunt) {
-
-    // load time grunt - helps with optimizing build times
-    require('time-grunt')(grunt);
-
-    // load grunt task configurations
-    require('load-grunt-config')(grunt);
-
-    // default task - when you type 'grunt' it really runs as 'grunt dev'
-    grunt.registerTask('default', ['dev']);
-
-    // dev task - when you type 'grunt dev' <-- builds unminified app and puts it in in app/dist folder and starts express server which reads server.js
-    grunt.registerTask('dev', [
-        'build-dev',
-        'express:dev',
-        'watch'
-    ]);
-
-    // dist task - when you type 'grunt dist' <-- builds minified app for distribution all wrapped up nicely in app/dist folder
-    grunt.registerTask('dist', [
-        'build'
-    ]);
-
-    // build tasks
-    grunt.registerTask('build', [
-        'clean',
-        'copy:dist',
-        'build-css',
-        'build-js',
-        'build-shared-libs'
-    ]);
-
-    grunt.registerTask('build-dev', [
-        'clean',
-        'copy:dev',
-        'build-css-dev',
-        'build-js-dev',
-        'build-shared-libs-dev'
-    ]);
-
-    // css
-    grunt.registerTask('build-css', [
-        'compass:prod'
-    ]);
-
-    grunt.registerTask('build-css-dev', [
-        'compass:dev'
-    ]);
-
-    // js (custom)
-    grunt.registerTask('build-js', [
-        'html2js',
-        'browserify2:app-prod',
-        'browserify2:app-config'
-    ]);
-
-    grunt.registerTask('build-js-dev', [
-        'html2js',
-        'browserify2:app-dev',
-        'browserify2:app-config'
-    ]);
-
-    // js (libraries)
-    grunt.registerTask('build-shared-libs', [
-        'browserify2:shared-libs-prod'
-    ]);
-
-    grunt.registerTask('build-shared-libs-dev', [
-        'browserify2:shared-libs-dev'
-    ]);
-
-};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/README.md
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/README.md b/traffic_ops/experimental/ui/README.md
deleted file mode 100644
index c394c43..0000000
--- a/traffic_ops/experimental/ui/README.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# Traffic Ops UI 2.0
-
-An AngularJS client served from a lightweight Node.js web server. Traffic Ops UI 2.0 was designed to consume the Traffic Ops 2.0 RESTful API.
-
-## Software Prerequisites
-
-* Mac OS X
-
-    - brew install ruby
-    - gem install compass
-    - brew install node
-    - npm install -g bower
-    - npm install -g grunt-cli
-
-* CentOS
-
-    - yum install ruby
-    - gem install compass
-    - yum install npm
-    - npm install -g bower
-    - npm install -g grunt-cli
-
-## Installation
-
-1. Navigate to UI root
-
-2. Load application dependencies
-
-    - npm install
-
-3. Load client-side dependencies
-
-    - bower install
-    
-## Configuration
-
-1. Configure the Node.js web server to proxy api requests to the API URL
-
-    - vim ./conf/config.js
-    - set api.base_url to http://api-domain.com or leave default value
-    
-## Run
-
-1. Package, deploy and start Node.js server
-
-    - grunt
-
-2. Head over to http://localhost:8080
-
-#### Misc
-
-    - Node.js server configuration is found in ./server/server.js
-    - Source files are found in ./app/src
-    - Build artifacts are found in ./app/dist

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/app.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/app.js b/traffic_ops/experimental/ui/app/src/app.js
deleted file mode 100644
index 546c9d1..0000000
--- a/traffic_ops/experimental/ui/app/src/app.js
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-'use strict';
-require('app-templates');
-
-var App = function($urlRouterProvider) {
-    $urlRouterProvider.otherwise('/');
-};
-
-App.$inject = ['$urlRouterProvider'];
-
-var trafficPortal = angular.module('trafficPortal', [
-        'config',
-        'ngAnimate',
-        'ngResource',
-        'ngSanitize',
-        'ngRoute',
-        'ngMap',
-        'ui.router',
-        'ui.bootstrap',
-        'restangular',
-        'app.templates',
-        'angular-jwt',
-        'angular-loading-bar',
-
-        // public modules
-        require('./modules/public').name,
-        require('./modules/public/login').name,
-
-        // private modules
-        require('./modules/private').name,
-
-        // current user
-        require('./modules/private/user').name,
-        require('./modules/private/user/edit').name,
-
-        // admin
-        require('./modules/private/admin').name,
-        require('./modules/private/admin/asns').name,
-        require('./modules/private/admin/asns/edit').name,
-        require('./modules/private/admin/asns/list').name,
-        require('./modules/private/admin/asns/new').name,
-        require('./modules/private/admin/cdns').name,
-        require('./modules/private/admin/cdns/config').name,
-        require('./modules/private/admin/cdns/deliveryServices').name,
-        require('./modules/private/admin/cdns/edit').name,
-        require('./modules/private/admin/cdns/list').name,
-        require('./modules/private/admin/cdns/new').name,
-        require('./modules/private/admin/cdns/profiles').name,
-        require('./modules/private/admin/cdns/servers').name,
-        require('./modules/private/admin/changeLogs').name,
-        require('./modules/private/admin/changeLogs/list').name,
-        require('./modules/private/admin/divisions').name,
-        require('./modules/private/admin/divisions/edit').name,
-        require('./modules/private/admin/divisions/list').name,
-        require('./modules/private/admin/divisions/new').name,
-        require('./modules/private/admin/divisions/regions').name,
-        require('./modules/private/admin/jobs').name,
-        require('./modules/private/admin/jobs/list').name,
-        require('./modules/private/admin/jobs/new').name,
-        require('./modules/private/admin/physLocations').name,
-        require('./modules/private/admin/physLocations/edit').name,
-        require('./modules/private/admin/physLocations/list').name,
-        require('./modules/private/admin/physLocations/new').name,
-        require('./modules/private/admin/physLocations/servers').name,
-        require('./modules/private/admin/parameters').name,
-        require('./modules/private/admin/parameters/cacheGroups').name,
-        require('./modules/private/admin/parameters/edit').name,
-        require('./modules/private/admin/parameters/list').name,
-        require('./modules/private/admin/parameters/new').name,
-        require('./modules/private/admin/parameters/profiles').name,
-        require('./modules/private/admin/profiles').name,
-        require('./modules/private/admin/profiles/deliveryServices').name,
-        require('./modules/private/admin/profiles/edit').name,
-        require('./modules/private/admin/profiles/list').name,
-        require('./modules/private/admin/profiles/new').name,
-        require('./modules/private/admin/profiles/parameters').name,
-        require('./modules/private/admin/profiles/servers').name,
-        require('./modules/private/admin/regions').name,
-        require('./modules/private/admin/regions/edit').name,
-        require('./modules/private/admin/regions/list').name,
-        require('./modules/private/admin/regions/physLocations').name,
-        require('./modules/private/admin/regions/new').name,
-        require('./modules/private/admin/statuses').name,
-        require('./modules/private/admin/statuses/edit').name,
-        require('./modules/private/admin/statuses/list').name,
-        require('./modules/private/admin/statuses/new').name,
-        require('./modules/private/admin/statuses/servers').name,
-        require('./modules/private/admin/tenants').name,
-        require('./modules/private/admin/tenants/edit').name,
-        require('./modules/private/admin/tenants/list').name,
-        require('./modules/private/admin/tenants/new').name,
-        require('./modules/private/admin/types').name,
-        require('./modules/private/admin/types/edit').name,
-        require('./modules/private/admin/types/list').name,
-        require('./modules/private/admin/types/new').name,
-        require('./modules/private/admin/types/servers').name,
-        require('./modules/private/admin/types/cacheGroups').name,
-        require('./modules/private/admin/types/deliveryServices').name,
-        require('./modules/private/admin/types/staticDnsEntries').name,
-        require('./modules/private/admin/users').name,
-        require('./modules/private/admin/users/deliveryServices').name,
-        require('./modules/private/admin/users/edit').name,
-        require('./modules/private/admin/users/list').name,
-        require('./modules/private/admin/users/new').name,
-
-        // configure
-        require('./modules/private/configure').name,
-        require('./modules/private/configure/cacheGroups').name,
-        require('./modules/private/configure/cacheGroups/edit').name,
-        require('./modules/private/configure/cacheGroups/list').name,
-        require('./modules/private/configure/cacheGroups/new').name,
-        require('./modules/private/configure/cacheGroups/asns').name,
-        require('./modules/private/configure/cacheGroups/parameters').name,
-        require('./modules/private/configure/cacheGroups/servers').name,
-        require('./modules/private/configure/cacheGroups/staticDnsEntries').name,
-        require('./modules/private/configure/deliveryServices').name,
-        require('./modules/private/configure/deliveryServices/edit').name,
-        require('./modules/private/configure/deliveryServices/list').name,
-        require('./modules/private/configure/deliveryServices/new').name,
-        require('./modules/private/configure/deliveryServices/jobs').name,
-        require('./modules/private/configure/deliveryServices/jobs/list').name,
-        require('./modules/private/configure/deliveryServices/jobs/new').name,
-        require('./modules/private/configure/deliveryServices/regexes').name,
-        require('./modules/private/configure/deliveryServices/regexes/edit').name,
-        require('./modules/private/configure/deliveryServices/regexes/list').name,
-        require('./modules/private/configure/deliveryServices/regexes/new').name,
-        require('./modules/private/configure/deliveryServices/servers').name,
-        require('./modules/private/configure/deliveryServices/staticDnsEntries').name,
-        require('./modules/private/configure/deliveryServices/users').name,
-        require('./modules/private/configure/servers').name,
-        require('./modules/private/configure/servers/deliveryServices').name,
-        require('./modules/private/configure/servers/edit').name,
-        require('./modules/private/configure/servers/new').name,
-        require('./modules/private/configure/servers/list').name,
-
-        // custom
-        require('./modules/private/custom').name,
-
-        // monitor
-        require('./modules/private/monitor').name,
-
-        // dashboard
-        require('./modules/private/monitor/dashboard').name,
-        require('./modules/private/monitor/dashboard/view').name,
-
-        // map
-        require('./modules/private/monitor/map').name,
-
-        // common modules
-        require('./common/modules/dialog/confirm').name,
-        require('./common/modules/dialog/delete').name,
-        require('./common/modules/dialog/reset').name,
-        require('./common/modules/dialog/select').name,
-        require('./common/modules/dialog/select/status').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/cacheGroup').name,
-        require('./common/modules/form/cacheGroup/edit').name,
-        require('./common/modules/form/cacheGroup/new').name,
-        require('./common/modules/form/asn').name,
-        require('./common/modules/form/asn/edit').name,
-        require('./common/modules/form/asn/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/deliveryService').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/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/job').name,
-        require('./common/modules/form/job/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/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,
-
-        // tables
-        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/changeLogs').name,
-        require('./common/modules/table/asns').name,
-        require('./common/modules/table/cdns').name,
-        require('./common/modules/table/cdnDeliveryServices').name,
-        require('./common/modules/table/cdnProfiles').name,
-        require('./common/modules/table/cdnServers').name,
-        require('./common/modules/table/deliveryServices').name,
-        require('./common/modules/table/deliveryServiceJobs').name,
-        require('./common/modules/table/deliveryServiceRegexes').name,
-        require('./common/modules/table/deliveryServiceServers').name,
-        require('./common/modules/table/deliveryServiceStaticDnsEntries').name,
-        require('./common/modules/table/deliveryServiceUsers').name,
-        require('./common/modules/table/divisions').name,
-        require('./common/modules/table/divisionRegions').name,
-        require('./common/modules/table/jobs').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/servers').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/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/routing').name,
-
-        // models
-        require('./common/models').name,
-        require('./common/api').name,
-
-        // directives
-        require('./common/directives/match').name,
-
-        // services
-        require('./common/service/application').name,
-        require('./common/service/utils').name,
-
-        // filters
-        require('./common/filters').name
-
-    ], App)
-
-        .config(function($stateProvider, $logProvider, $controllerProvider, RestangularProvider, ENV) {
-
-            RestangularProvider.setBaseUrl(ENV.api['root']);
-
-            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;
-                }
-            });
-
-            $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();
-        })
-    ;
-
-trafficPortal.factory('authInterceptor', function ($q, $window, $location, $timeout, messageModel, userModel) {
-    return {
-        responseError: function (rejection) {
-            var url = $location.url(),
-                alerts = [];
-
-            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) {
-                userModel.resetUser();
-                if (url == '/' || $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('/').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 () {
-                    messageModel.setMessages([ { level: 'error', text: rejection.status.toString() + ': ' + rejection.statusText } ], false);
-                }, 200);
-            }
-
-            return $q.reject(rejection);
-        }
-    };
-});
-
-trafficPortal.config(function ($httpProvider) {
-    $httpProvider.interceptors.push('authInterceptor');
-});
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/css/custom.css
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/css/custom.css b/traffic_ops/experimental/ui/app/src/assets/css/custom.css
deleted file mode 100644
index 6759bab..0000000
--- a/traffic_ops/experimental/ui/app/src/assets/css/custom.css
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/* override styles here */

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/css/jquery.dataTables.min.css
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/css/jquery.dataTables.min.css b/traffic_ops/experimental/ui/app/src/assets/css/jquery.dataTables.min.css
deleted file mode 100644
index 4f10100..0000000
--- a/traffic_ops/experimental/ui/app/src/assets/css/jquery.dataTables.min.css
+++ /dev/null
@@ -1 +0,0 @@
-table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc{cursor:pointer;*cursor:hand}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.data
 Table thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:white}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #dddddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #dddddd;border-right:1px solid #dddddd}table.dataTable.cell-border tbod
 y tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #dddddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#abb9d3}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:whitesmoke}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#a9b7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#f9f9f9}table.dataTable.order-column tbody
  tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad4}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b3cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sort
 ing_2{background-color:#a7b5ce}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b6d0}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#f9f9f9}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fbfbfb}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fdfdfd}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad4}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#adbbd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.e
 ven.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ebebeb}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#eeeeee}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a1aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a2afc8}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a4b2cb}table.dataTable.no-footer{border-bottom:1px solid #111111}table.dataTable.nowr
 ap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,
 table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tb
 ody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,
 .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111111;background-c
 olor:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wra
 pper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,2
 55,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .
 dataTables_scrollBody{border-bottom:1px solid #111111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/fonts/FontAwesome.otf
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/fonts/FontAwesome.otf b/traffic_ops/experimental/ui/app/src/assets/fonts/FontAwesome.otf
deleted file mode 100644
index 3ed7f8b..0000000
Binary files a/traffic_ops/experimental/ui/app/src/assets/fonts/FontAwesome.otf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.eot
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.eot b/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.eot
deleted file mode 100644
index 9b6afae..0000000
Binary files a/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.eot and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.ttf
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.ttf b/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.ttf
deleted file mode 100644
index 26dea79..0000000
Binary files a/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.ttf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.woff
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.woff b/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.woff
deleted file mode 100644
index dc35ce3..0000000
Binary files a/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.woff and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.woff2
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.woff2 b/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.woff2
deleted file mode 100644
index 500e517..0000000
Binary files a/traffic_ops/experimental/ui/app/src/assets/fonts/fontawesome-webfont.woff2 and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/images/favicon.png
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/images/favicon.png b/traffic_ops/experimental/ui/app/src/assets/images/favicon.png
deleted file mode 100644
index 83df44e..0000000
Binary files a/traffic_ops/experimental/ui/app/src/assets/images/favicon.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/images/sort_asc.png
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/images/sort_asc.png b/traffic_ops/experimental/ui/app/src/assets/images/sort_asc.png
deleted file mode 100644
index e1ba61a..0000000
Binary files a/traffic_ops/experimental/ui/app/src/assets/images/sort_asc.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/images/sort_asc_disabled.png
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/images/sort_asc_disabled.png b/traffic_ops/experimental/ui/app/src/assets/images/sort_asc_disabled.png
deleted file mode 100644
index fb11dfe..0000000
Binary files a/traffic_ops/experimental/ui/app/src/assets/images/sort_asc_disabled.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/images/sort_both.png
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/images/sort_both.png b/traffic_ops/experimental/ui/app/src/assets/images/sort_both.png
deleted file mode 100644
index af5bc7c..0000000
Binary files a/traffic_ops/experimental/ui/app/src/assets/images/sort_both.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/images/sort_desc.png
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/images/sort_desc.png b/traffic_ops/experimental/ui/app/src/assets/images/sort_desc.png
deleted file mode 100644
index 0e156de..0000000
Binary files a/traffic_ops/experimental/ui/app/src/assets/images/sort_desc.png and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/images/sort_desc_disabled.png
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/images/sort_desc_disabled.png b/traffic_ops/experimental/ui/app/src/assets/images/sort_desc_disabled.png
deleted file mode 100644
index c9fdd8a..0000000
Binary files a/traffic_ops/experimental/ui/app/src/assets/images/sort_desc_disabled.png and /dev/null differ



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/types/servers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/types/servers/index.js b/traffic_portal/app/src/modules/private/admin/types/servers/index.js
new file mode 100644
index 0000000..03ea0b3
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/types/servers/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.types.servers', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.types.servers', {
+				url: '/{typeId}/servers',
+				views: {
+					typesContent: {
+						templateUrl: 'common/modules/table/typeServers/table.typeServers.tpl.html',
+						controller: 'TableTypeServersController',
+						resolve: {
+							type: function($stateParams, typeService) {
+								return typeService.getType($stateParams.typeId);
+							},
+							servers: function(type, serverService) {
+								return serverService.getServers({ type: type.name });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/types/staticDnsEntries/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/types/staticDnsEntries/index.js b/traffic_portal/app/src/modules/private/admin/types/staticDnsEntries/index.js
new file mode 100644
index 0000000..f0cba95
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/types/staticDnsEntries/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.types.staticDnsEntries', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.types.staticDnsEntries', {
+				url: '/{typeId}/static-dns-entries',
+				views: {
+					typesContent: {
+						templateUrl: 'common/modules/table/typeStaticDnsEntries/table.typeStaticDnsEntries.tpl.html',
+						controller: 'TableTypeStaticDnsEntriesController',
+						resolve: {
+							type: function($stateParams, typeService) {
+								return typeService.getType($stateParams.typeId);
+							},
+							staticDnsEntries: function(type, staticDnsEntryService) {
+								return staticDnsEntryService.getStaticDnsEntries({ type: type.name });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/types/types.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/types/types.tpl.html b/traffic_portal/app/src/modules/private/admin/types/types.tpl.html
new file mode 100644
index 0000000..c8856f4
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/types/types.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="typesContainer">
+    <div ui-view="typesContent"></div>
+</div>

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/users/_users.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/users/_users.scss b/traffic_portal/app/src/modules/private/admin/users/_users.scss
new file mode 100644
index 0000000..d57b9c6
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/users/_users.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/admin/users/deliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/users/deliveryServices/index.js b/traffic_portal/app/src/modules/private/admin/users/deliveryServices/index.js
new file mode 100644
index 0000000..7412911
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/users/deliveryServices/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.users.deliveryServices', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.users.deliveryServices', {
+				url: '/{userId}/delivery-services',
+				views: {
+					usersContent: {
+						templateUrl: 'common/modules/table/userDeliveryServices/table.userDeliveryServices.tpl.html',
+						controller: 'TableUserDeliveryServicesController',
+						resolve: {
+							user: function($stateParams, userService) {
+								return userService.getUser($stateParams.userId);
+							},
+							userDeliveryServices: function($stateParams, deliveryServiceService) {
+								return deliveryServiceService.getUserDeliveryServices($stateParams.userId);
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/users/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/users/edit/index.js b/traffic_portal/app/src/modules/private/admin/users/edit/index.js
new file mode 100644
index 0000000..edadb68
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/users/edit/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.users.edit', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.users.edit', {
+                url: '/{userId:[0-9]{1,8}}',
+                views: {
+                    usersContent: {
+                        templateUrl: 'common/modules/form/user/form.user.tpl.html',
+                        controller: 'FormEditUserController',
+                        resolve: {
+                            user: function($stateParams, userService) {
+                                return userService.getUser($stateParams.userId);
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/users/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/users/index.js b/traffic_portal/app/src/modules/private/admin/users/index.js
new file mode 100644
index 0000000..e5cc74f
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/users/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.admin.users', [])
+    .controller('UsersController', require('./UsersController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.users', {
+                url: '/users',
+                abstract: true,
+                views: {
+                    adminContent: {
+                        templateUrl: 'modules/private/admin/users/users.tpl.html',
+                        controller: 'UsersController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/users/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/users/list/index.js b/traffic_portal/app/src/modules/private/admin/users/list/index.js
new file mode 100644
index 0000000..8c774a3
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/users/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.users.list', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.users.list', {
+                url: '',
+                views: {
+                    usersContent: {
+                        templateUrl: 'common/modules/table/users/table.users.tpl.html',
+                        controller: 'TableUsersController',
+                        resolve: {
+                            users: function(userService) {
+                                return userService.getUsers();
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/users/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/users/new/index.js b/traffic_portal/app/src/modules/private/admin/users/new/index.js
new file mode 100644
index 0000000..ecf2a82
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/users/new/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.users.new', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.users.new', {
+                url: '/new',
+                views: {
+                    usersContent: {
+                        templateUrl: 'common/modules/form/user/form.user.tpl.html',
+                        controller: 'FormNewUserController',
+                        resolve: {
+                            user: function() {
+                                return {};
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/users/users.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/users/users.tpl.html b/traffic_portal/app/src/modules/private/admin/users/users.tpl.html
new file mode 100644
index 0000000..84ef55b
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/users/users.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="usersContainer">
+    <div ui-view="usersContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/collateral/CollateralController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/collateral/CollateralController.js b/traffic_portal/app/src/modules/private/collateral/CollateralController.js
deleted file mode 100644
index 1236e52..0000000
--- a/traffic_portal/app/src/modules/private/collateral/CollateralController.js
+++ /dev/null
@@ -1,25 +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 CollateralController = function($scope, propertiesModel) {
-
-    $scope.collateralItems = propertiesModel.properties.collateral.items;
-
-};
-
-CollateralController.$inject = ['$scope', 'propertiesModel'];
-module.exports = CollateralController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/collateral/_collateral.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/collateral/_collateral.scss b/traffic_portal/app/src/modules/private/collateral/_collateral.scss
deleted file mode 100644
index b2f81fc..0000000
--- a/traffic_portal/app/src/modules/private/collateral/_collateral.scss
+++ /dev/null
@@ -1,29 +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.
-
-*/
-
-#productCollateralContainer {
-
-  .list-group-item {
-    background-color: transparent;
-
-    .action-btn {
-      float: right;
-    }
-
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/collateral/collateral.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/collateral/collateral.tpl.html b/traffic_portal/app/src/modules/private/collateral/collateral.tpl.html
deleted file mode 100644
index 6d6a025..0000000
--- a/traffic_portal/app/src/modules/private/collateral/collateral.tpl.html
+++ /dev/null
@@ -1,34 +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="productCollateralContainer">
-    <h3 class="title">Collateral</h3>
-    <div class="list-group">
-        <a class="list-group-item" ng-repeat="collateralItem in collateralItems" href="{{collateralItem.path}}" target="_blank">
-            <div class="row">
-                <div class="col-sm-4 col-md-4">{{collateralItem.name}}</div>
-                <div class="col-sm-6 col-md-6">{{collateralItem.description}}</div>
-                <div class="col-sm-2 col-md-2">
-                    <button type="button" class="action-btn btn">Download &nbsp;&nbsp;<i class="fa fa-chevron-circle-right fa-lg"></i></button>
-                </div>
-            </div>
-        </a>
-    </div>
-    <div class="alert alert-info" ng-show="collateral.length == 0">
-        No collateral
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/collateral/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/collateral/index.js b/traffic_portal/app/src/modules/private/collateral/index.js
deleted file mode 100644
index 7fdf76e..0000000
--- a/traffic_portal/app/src/modules/private/collateral/index.js
+++ /dev/null
@@ -1,32 +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.collateral', [])
-    .controller('CollateralController', require('./CollateralController'))
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.collateral', {
-                url: 'collateral',
-                views: {
-                    privateContent: {
-                        templateUrl: 'modules/private/collateral/collateral.tpl.html',
-                        controller: 'CollateralController'
-                    }
-                }
-            });
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/ConfigureController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/ConfigureController.js b/traffic_portal/app/src/modules/private/configure/ConfigureController.js
new file mode 100644
index 0000000..2e1f17c
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/ConfigureController.js
@@ -0,0 +1,29 @@
+/*
+ * 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 ConfigureController = function($scope, $location) {
+
+    $scope.navigateToPath = function(path) {
+        $location.url(path);
+    };
+
+};
+
+ConfigureController.$inject = ['$scope', '$location'];
+module.exports = ConfigureController;

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/cacheGroups/_cacheGroups.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/cacheGroups/_cacheGroups.scss b/traffic_portal/app/src/modules/private/configure/cacheGroups/_cacheGroups.scss
new file mode 100644
index 0000000..d57b9c6
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/cacheGroups/_cacheGroups.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/configure/cacheGroups/asns/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/cacheGroups/asns/index.js b/traffic_portal/app/src/modules/private/configure/cacheGroups/asns/index.js
new file mode 100644
index 0000000..86c3807
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/cacheGroups/asns/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.configure.cacheGroups.asns', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.cacheGroups.asns', {
+				url: '/{cacheGroupId}/asns',
+				views: {
+					cacheGroupsContent: {
+						templateUrl: 'common/modules/table/cacheGroupAsns/table.cacheGroupAsns.tpl.html',
+						controller: 'TableCacheGroupAsnsController',
+						resolve: {
+							cacheGroup: function($stateParams, cacheGroupService) {
+								return cacheGroupService.getCacheGroup($stateParams.cacheGroupId);
+							},
+							asns: function($stateParams, asnService) {
+								return asnService.getASNs({ cachegroup: $stateParams.cacheGroupId });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/cacheGroups/cacheGroups.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/cacheGroups/cacheGroups.tpl.html b/traffic_portal/app/src/modules/private/configure/cacheGroups/cacheGroups.tpl.html
new file mode 100644
index 0000000..6f047d3
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/cacheGroups/cacheGroups.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="cacheGroupsContainer">
+    <div ui-view="cacheGroupsContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/cacheGroups/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/cacheGroups/edit/index.js b/traffic_portal/app/src/modules/private/configure/cacheGroups/edit/index.js
new file mode 100644
index 0000000..4361534
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/cacheGroups/edit/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.configure.cacheGroups.edit', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.configure.cacheGroups.edit', {
+                url: '/{cacheGroupId:[0-9]{1,8}}',
+                views: {
+                    cacheGroupsContent: {
+                        templateUrl: 'common/modules/form/cacheGroup/form.cacheGroup.tpl.html',
+                        controller: 'FormEditCacheGroupController',
+                        resolve: {
+                            cacheGroup: function($stateParams, cacheGroupService) {
+                                return cacheGroupService.getCacheGroup($stateParams.cacheGroupId);
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/cacheGroups/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/cacheGroups/index.js b/traffic_portal/app/src/modules/private/configure/cacheGroups/index.js
new file mode 100644
index 0000000..18a9afe
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/cacheGroups/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.configure.cacheGroups', [])
+    .controller('CacheGroupsController', require('./CacheGroupsController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.configure.cacheGroups', {
+                url: '/cache-groups',
+                abstract: true,
+                views: {
+                    configureContent: {
+                        templateUrl: 'modules/private/configure/cacheGroups/cacheGroups.tpl.html',
+                        controller: 'CacheGroupsController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/cacheGroups/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/cacheGroups/list/index.js b/traffic_portal/app/src/modules/private/configure/cacheGroups/list/index.js
new file mode 100644
index 0000000..fef2494
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/cacheGroups/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.configure.cacheGroups.list', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.configure.cacheGroups.list', {
+                url: '',
+                views: {
+                    cacheGroupsContent: {
+                        templateUrl: 'common/modules/table/cacheGroups/table.cacheGroups.tpl.html',
+                        controller: 'TableCacheGroupsController',
+                        resolve: {
+                            cacheGroups: function(cacheGroupService) {
+                                return cacheGroupService.getCacheGroups();
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/cacheGroups/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/cacheGroups/new/index.js b/traffic_portal/app/src/modules/private/configure/cacheGroups/new/index.js
new file mode 100644
index 0000000..307cf15
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/cacheGroups/new/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.configure.cacheGroups.new', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.configure.cacheGroups.new', {
+                url: '/new',
+                views: {
+                    cacheGroupsContent: {
+                        templateUrl: 'common/modules/form/cacheGroup/form.cacheGroup.tpl.html',
+                        controller: 'FormNewCacheGroupController',
+                        resolve: {
+                            cacheGroup: function() {
+                                return {};
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/cacheGroups/parameters/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/cacheGroups/parameters/index.js b/traffic_portal/app/src/modules/private/configure/cacheGroups/parameters/index.js
new file mode 100644
index 0000000..2d35297
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/cacheGroups/parameters/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.configure.cacheGroups.parameters', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.cacheGroups.parameters', {
+				url: '/{cacheGroupId}/parameters',
+				views: {
+					cacheGroupsContent: {
+						templateUrl: 'common/modules/table/cacheGroupParameters/table.cacheGroupParameters.tpl.html',
+						controller: 'TableCacheGroupParametersController',
+						resolve: {
+							cacheGroup: function($stateParams, cacheGroupService) {
+								return cacheGroupService.getCacheGroup($stateParams.cacheGroupId);
+							},
+							cacheGroupParameters: function($stateParams, cacheGroupParameterService) {
+								return cacheGroupParameterService.getCacheGroupParameters($stateParams.cacheGroupId);
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/cacheGroups/servers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/cacheGroups/servers/index.js b/traffic_portal/app/src/modules/private/configure/cacheGroups/servers/index.js
new file mode 100644
index 0000000..3ed9435
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/cacheGroups/servers/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.configure.cacheGroups.servers', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.cacheGroups.servers', {
+				url: '/{cacheGroupId}/servers',
+				views: {
+					cacheGroupsContent: {
+						templateUrl: 'common/modules/table/cacheGroupServers/table.cacheGroupServers.tpl.html',
+						controller: 'TableCacheGroupServersController',
+						resolve: {
+							cacheGroup: function($stateParams, cacheGroupService) {
+								return cacheGroupService.getCacheGroup($stateParams.cacheGroupId);
+							},
+							servers: function($stateParams, serverService) {
+								return serverService.getServers({ cachegroup: $stateParams.cacheGroupId });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/cacheGroups/staticDnsEntries/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/cacheGroups/staticDnsEntries/index.js b/traffic_portal/app/src/modules/private/configure/cacheGroups/staticDnsEntries/index.js
new file mode 100644
index 0000000..b35485b
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/cacheGroups/staticDnsEntries/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.configure.cacheGroups.staticDnsEntries', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.cacheGroups.staticDnsEntries', {
+				url: '/{cacheGroupId}/static-dns-entries',
+				views: {
+					cacheGroupsContent: {
+						templateUrl: 'common/modules/table/cacheGroupStaticDnsEntries/table.cacheGroupStaticDnsEntries.tpl.html',
+						controller: 'TableCacheGroupStaticDnsEntriesController',
+						resolve: {
+							cacheGroup: function($stateParams, cacheGroupService) {
+								return cacheGroupService.getCacheGroup($stateParams.cacheGroupId);
+							},
+							staticDnsEntries: function($stateParams, staticDnsEntryService) {
+								return staticDnsEntryService.getStaticDnsEntries({ cachegroup: $stateParams.cacheGroupId });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/configure.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/configure.tpl.html b/traffic_portal/app/src/modules/private/configure/configure.tpl.html
new file mode 100644
index 0000000..af35161
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/configure.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="configureContainer">
+    <div ui-view="configureContent"></div>
+</div>

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/_deliveryServices.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/_deliveryServices.scss b/traffic_portal/app/src/modules/private/configure/deliveryServices/_deliveryServices.scss
new file mode 100644
index 0000000..d57b9c6
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/_deliveryServices.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/configure/deliveryServices/deliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/deliveryServices.tpl.html b/traffic_portal/app/src/modules/private/configure/deliveryServices/deliveryServices.tpl.html
new file mode 100644
index 0000000..2035386
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/deliveryServices.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="deliveryServicesContainer">
+    <div ui-view="deliveryServicesContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/edit/index.js b/traffic_portal/app/src/modules/private/configure/deliveryServices/edit/index.js
new file mode 100644
index 0000000..40f29bf
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/edit/index.js
@@ -0,0 +1,62 @@
+/*
+ * 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.configure.deliveryServices.edit', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.configure.deliveryServices.edit', {
+                url: '/{deliveryServiceId:[0-9]{1,8}}?type',
+                views: {
+                    deliveryServicesContent: {
+                        templateUrl: function ($stateParams) {
+                            var type = $stateParams.type,
+                                template;
+
+                            if (type.indexOf('ANY_MAP') != -1) {
+                                template = 'common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html'
+                            } else if (type.indexOf('DNS') != -1) {
+                                template = 'common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html'
+                            } else if (type.indexOf('HTTP') != -1) {
+                                template = 'common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html'
+                            } else if (type.indexOf('STEERING') != -1) {
+                                template = 'common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html'
+                            } else {
+
+                            }
+
+                            return template;
+                        },
+                        controller: 'FormEditDeliveryServiceController',
+                        resolve: {
+                            deliveryService: function($stateParams, deliveryServiceService) {
+                                return deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
+                            },
+                            type: function($stateParams) {
+                                return $stateParams.type;
+                            },
+                            types: function(typeService) {
+                                return typeService.getTypes({ useInTable: 'deliveryservice' });
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/index.js b/traffic_portal/app/src/modules/private/configure/deliveryServices/index.js
new file mode 100644
index 0000000..59b8c5e
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.configure.deliveryServices', [])
+    .controller('DeliveryServicesController', require('./DeliveryServicesController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.configure.deliveryServices', {
+                url: '/delivery-services',
+                abstract: true,
+                views: {
+                    configureContent: {
+                        templateUrl: 'modules/private/configure/deliveryServices/deliveryServices.tpl.html',
+                        controller: 'DeliveryServicesController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/deliveryServiceJobs.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/deliveryServiceJobs.tpl.html b/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/deliveryServiceJobs.tpl.html
new file mode 100644
index 0000000..b941e55
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/deliveryServiceJobs.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="deliveryServiceJobsContainer">
+    <div ui-view="deliveryServiceJobsContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/index.js b/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/index.js
new file mode 100644
index 0000000..18b6c8e
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.configure.deliveryServices.jobs', [])
+	.controller('DeliveryServiceJobsController', require('./DeliveryServiceJobsController'))
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.deliveryServices.jobs', {
+				url: '/{deliveryServiceId}/jobs',
+				abstract: true,
+				views: {
+					deliveryServicesContent: {
+						templateUrl: 'modules/private/configure/deliveryServices/jobs/deliveryServiceJobs.tpl.html',
+						controller: 'DeliveryServiceJobsController'
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/list/index.js b/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/list/index.js
new file mode 100644
index 0000000..43fc35d
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/list/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.configure.deliveryServices.jobs.list', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.deliveryServices.jobs.list', {
+				url: '',
+				views: {
+					deliveryServiceJobsContent: {
+						templateUrl: 'common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html',
+						controller: 'TableDeliveryServiceJobsController',
+						resolve: {
+							deliveryService: function($stateParams, deliveryServiceService) {
+								return deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
+							},
+							jobs: function($stateParams, jobService) {
+								return jobService.getJobs({ dsId: $stateParams.deliveryServiceId });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/new/index.js b/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/new/index.js
new file mode 100644
index 0000000..8427e79
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/jobs/new/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.configure.deliveryServices.jobs.new', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.deliveryServices.jobs.new', {
+				url: '/new',
+				views: {
+					deliveryServiceJobsContent: {
+						templateUrl: 'common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html',
+						controller: 'FormNewDeliveryServiceJobController',
+						resolve: {
+							deliveryService: function($stateParams, deliveryServiceService) {
+								return deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
+							},
+							job: function($stateParams) {
+								return { dsId: $stateParams.deliveryServiceId, startTime: moment().format('YYYY-MM-DD HH:mm:ss') };
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/list/index.js b/traffic_portal/app/src/modules/private/configure/deliveryServices/list/index.js
new file mode 100644
index 0000000..bd3ee2c
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.configure.deliveryServices.list', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.configure.deliveryServices.list', {
+                url: '',
+                views: {
+                    deliveryServicesContent: {
+                        templateUrl: 'common/modules/table/deliveryServices/table.deliveryServices.tpl.html',
+                        controller: 'TableDeliveryServicesController',
+                        resolve: {
+                            deliveryServices: function(deliveryServiceService) {
+                                return deliveryServiceService.getDeliveryServices();
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/new/index.js b/traffic_portal/app/src/modules/private/configure/deliveryServices/new/index.js
new file mode 100644
index 0000000..f99a8b0
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/new/index.js
@@ -0,0 +1,76 @@
+/*
+ * 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.configure.deliveryServices.new', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.configure.deliveryServices.new', {
+                url: '/new?type',
+                views: {
+                    deliveryServicesContent: {
+                        templateUrl: function ($stateParams) {
+                            var type = $stateParams.type,
+                                template;
+
+                            if (type.indexOf('ANY_MAP') != -1) {
+                                template = 'common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html'
+                            } else if (type.indexOf('DNS') != -1) {
+                                template = 'common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html'
+                            } else if (type.indexOf('HTTP') != -1) {
+                                template = 'common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html'
+                            } else if (type.indexOf('STEERING') != -1) {
+                                template = 'common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html'
+                            } else {
+
+                            }
+
+                            return template;
+                        },
+                        controller: 'FormNewDeliveryServiceController',
+                        resolve: {
+                            deliveryService: function() {
+                                return {
+                                    active: false,
+                                    dscp: 0,
+                                    geoLimit: 0,
+                                    geoProvider: 0,
+                                    initialDispersion: 1,
+                                    ipv6RoutingEnabled: false,
+                                    logsEnabled: false,
+                                    multiSiteOrigin: false,
+                                    protocol: 0,
+                                    qstringIgnore: 0,
+                                    rangeRequestHandling: 0,
+                                    regionalGeoBlocking: false,
+                                    signed: false
+                                };
+                            },
+                            type: function($stateParams) {
+                                return $stateParams.type;
+                            },
+                            types: function(typeService) {
+                                return typeService.getTypes({ useInTable: 'deliveryservice' });
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/deliveryServiceRegexes.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/deliveryServiceRegexes.tpl.html b/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/deliveryServiceRegexes.tpl.html
new file mode 100644
index 0000000..5b2af62
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/deliveryServiceRegexes.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="deliveryServiceRegexesContainer">
+    <div ui-view="deliveryServiceRegexesContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/edit/index.js b/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/edit/index.js
new file mode 100644
index 0000000..8f52637
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/edit/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.configure.deliveryServices.regexes.edit', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.deliveryServices.regexes.edit', {
+				url: '/{regexId:[0-9]{1,8}}',
+				views: {
+					deliveryServiceRegexesContent: {
+						templateUrl: 'common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html',
+						controller: 'FormEditDeliveryServiceRegexController',
+						resolve: {
+							deliveryService: function($stateParams, deliveryServiceService) {
+								return deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
+							},
+							regex: function($stateParams, deliveryServiceRegexService) {
+								return deliveryServiceRegexService.getDeliveryServiceRegex($stateParams.deliveryServiceId, $stateParams.regexId);
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/index.js b/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/index.js
new file mode 100644
index 0000000..9747ade
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.configure.deliveryServices.regexes', [])
+	.controller('DeliveryServiceRegexesController', require('./DeliveryServiceRegexesController'))
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.deliveryServices.regexes', {
+				url: '/{deliveryServiceId}/regexes',
+				abstract: true,
+				views: {
+					deliveryServicesContent: {
+						templateUrl: 'modules/private/configure/deliveryServices/regexes/deliveryServiceRegexes.tpl.html',
+						controller: 'DeliveryServiceRegexesController'
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/list/index.js b/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/list/index.js
new file mode 100644
index 0000000..00d2493
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/list/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.configure.deliveryServices.regexes.list', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.deliveryServices.regexes.list', {
+				url: '',
+				views: {
+					deliveryServiceRegexesContent: {
+						templateUrl: 'common/modules/table/deliveryServiceRegexes/table.deliveryServiceRegexes.tpl.html',
+						controller: 'TableDeliveryServiceRegexesController',
+						resolve: {
+							deliveryService: function($stateParams, deliveryServiceService) {
+								return deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
+							},
+							regexes: function($stateParams, deliveryServiceRegexService) {
+								return deliveryServiceRegexService.getDeliveryServiceRegexes($stateParams.deliveryServiceId);
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/build/build_rpm.sh
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/build/build_rpm.sh b/traffic_ops/experimental/ui/build/build_rpm.sh
deleted file mode 100755
index 60a8d35..0000000
--- a/traffic_ops/experimental/ui/build/build_rpm.sh
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/bin/bash
-#
-#
-#
-# 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.
-
-function importFunctions() {
-	local script=$(readlink -f "$0")
-	local suff=${script##*control/}
-	local tcdirlen=$[${#script} - ${#suff}]
-	export TC_DIR=${script:0:$tcdirlen}
-	local scriptdir=$(dirname "$script")
-	export TS_DIR=$(dirname "$scriptdir")
-
-	functions_sh="$TC_DIR/build/functions.sh"
-	if [[ ! -r $functions_sh ]]; then
-		echo "error: can't find $functions_sh"
-		exit 1
-	fi
-	. "$functions_sh"
-}
-
-#----------------------------------------
-function initBuildArea() {
-	echo "Initializing the build area."
-	mkdir -p "$RPMBUILD"/{SPECS,SOURCES,RPMS,SRPMS,BUILD,BUILDROOT} || { echo "Could not create $RPMBUILD: $?"; exit 1; }
-
-	# tar/gzip the source
-	local ts_dest=$(createSourceDir traffic_ops_v2)
-	cd "$TS_DIR" || \
-		 { echo "Could not cd to $TS_DIR: $?"; exit 1; }
-	rsync -av ./ "$ts_dest"/ || \
-		 { echo "Could not copy to $to_dest: $?"; exit 1; }
-	cp -r "$TS_DIR"/ "$ts_dest" || { echo "Could not copy $TS_DIR to $ts_dest: $?"; exit 1; }
-
-	tar -czvf "$ts_dest".tgz -C "$RPMBUILD"/SOURCES $(basename $ts_dest) || { echo "Could not create tar archive $ts_dest.tgz: $?"; exit 1; }
-	cp "$TS_DIR"/build/*.spec "$RPMBUILD"/SPECS/. || { echo "Could not copy spec files: $?"; exit 1; }
-
-	echo "The build area has been initialized."
-}
-
-# ---------------------------------------
-
-importFunctions
-checkEnvironment npm node
-initBuildArea
-buildRpm traffic_ops_v2

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/build/etc/init.d/traffic_ops_v2
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/build/etc/init.d/traffic_ops_v2 b/traffic_ops/experimental/ui/build/etc/init.d/traffic_ops_v2
deleted file mode 100755
index e2b410d..0000000
--- a/traffic_ops/experimental/ui/build/etc/init.d/traffic_ops_v2
+++ /dev/null
@@ -1,153 +0,0 @@
-#!/bin/bash
-#
-# An init.d script for running a Node.js process as a service using Forever as
-# the process monitor. For more configuration options associated with Forever,
-# see: https://github.com/nodejitsu/forever
-#
-# This was written for Debian distributions such as Ubuntu, but should still
-# work on RedHat, Fedora, or other RPM-based distributions, since none of the
-# built-in service functions are used. So information is provided for both.
-#
-### BEGIN INIT INFO
-# Provides:             my-application
-# Required-Start:       $syslog $remote_fs
-# Required-Stop:        $syslog $remote_fs
-# Should-Start:         $local_fs
-# Should-Stop:          $local_fs
-# Default-Start:        2 3 4 5
-# Default-Stop:         0 1 6
-# Short-Description:    My Application
-# Description:          My Application
-### END INIT INFO
-#
-### BEGIN CHKCONFIG INFO
-# chkconfig: 2345 55 25
-# description: My Application
-### END CHKCONFIG INFO
-#
-#
-# 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.
-
-# An application name to display in echo text.
-# NAME="Traffic Ops v2 Application"
-# The full path to the directory containing the node and forever binaries.
-# Set the NODE_PATH to the Node.js main node_modules directory.
-# The application startup Javascript file path.
-
-# Process ID file path.
-# Log file path.
-# Forever settings to prevent the application spinning if it fails on launch.
-# MIN_UPTIME="5000"
-# SPIN_SLEEP_TIME="2000"
- 
-NAME="Traffic Ops v2 Application"
-NODE_BIN_DIR="/usr/bin"
-NODE_PATH="/opt/traffic_ops_v2/node_modules"
-FOREVER_BIN_DIR="/opt/traffic_ops_v2/node_modules/forever/bin"
-APPLICATION_PATH="/opt/traffic_ops_v2/server/server.js"
-PIDFILE="/var/run/traffic_ops_v2.pid"
-LOGFILE="/var/log/traffic_ops_v2/traffic_ops_v2.log"
-MIN_UPTIME="5000"
-SPIN_SLEEP_TIME="2000"
- 
-# Add node to the path for situations in which the environment is passed.
-PATH=$FOREVER_BIN_DIR:$NODE_BIN_DIR:$PATH
-# Export all environment variables that must be visible for the Node.js
-# application process forked by Forever. It will not see any of the other
-# variables defined in this script.
-export NODE_PATH=$NODE_PATH
- 
-start() {
-    echo "Starting $NAME"
-    # We're calling forever directly without using start-stop-daemon for the
-    # sake of simplicity when it comes to environment, and because this way
-    # the script will work whether it is executed directly or via the service
-    # utility.
-    #
-    # The minUptime and spinSleepTime settings stop Forever from thrashing if
-    # the application fails immediately on launch. This is generally necessary to
-    # avoid loading development servers to the point of failure every time
-    # someone makes an error in application initialization code, or bringing down
-    # production servers the same way if a database or other critical service
-    # suddenly becomes inaccessible.
-    #
-    # The pidfile contains the child process pid, not the forever process pid.
-    # We're only using it as a marker for whether or not the process is
-    # running.
-    #
-    # Note that redirecting the output to /dev/null (or anywhere) is necessary
-    # to make this script work if provisioning the service via Chef.
-    forever \
-      --pidFile $PIDFILE \
-      -a \
-      -l $LOGFILE \
-      --minUptime $MIN_UPTIME \
-      --spinSleepTime $SPIN_SLEEP_TIME \
-      start $APPLICATION_PATH 2>&1 > /dev/null &
-    RETVAL=$?
-}
- 
-stop() {
-    if [ -f $PIDFILE ]; then
-        echo "Shutting down $NAME"
-        # Tell Forever to stop the process.
-        forever stop $APPLICATION_PATH 2>&1 > /dev/null
-        # Get rid of the pidfile, since Forever won't do that.
-        rm -f $PIDFILE
-        RETVAL=$?
-    else
-        echo "$NAME is not running."
-        RETVAL=0
-    fi
-}
- 
-restart() {
-    stop
-    start
-}
- 
-status() {
-    echo `forever list` | grep -q "$APPLICATION_PATH"
-    if [ "$?" -eq "0" ]; then
-        echo "$NAME is running."
-        RETVAL=0
-    else
-        echo "$NAME is not running."
-        RETVAL=3
-    fi
-}
- 
-case "$1" in
-    start)
-        start
-        ;;
-    stop)
-        stop
-        ;;
-    status)
-        status
-        ;;
-    restart)
-        restart
-        ;;
-    *)
-        echo "Usage: {start|stop|status|restart}"
-        exit 1
-        ;;
-esac
-exit $RETVAL

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/build/etc/logrotate.d/traffic_ops_v2
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/build/etc/logrotate.d/traffic_ops_v2 b/traffic_ops/experimental/ui/build/etc/logrotate.d/traffic_ops_v2
deleted file mode 100644
index af2d566..0000000
--- a/traffic_ops/experimental/ui/build/etc/logrotate.d/traffic_ops_v2
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-/var/log/traffic_ops_v2/traffic_ops_v2.log {
-    daily
-    copytruncate
-    missingok
-    compress
-    maxage 30
-    dateext
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/build/etc/logrotate.d/traffic_ops_v2-access
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/build/etc/logrotate.d/traffic_ops_v2-access b/traffic_ops/experimental/ui/build/etc/logrotate.d/traffic_ops_v2-access
deleted file mode 100644
index 892b4d0..0000000
--- a/traffic_ops/experimental/ui/build/etc/logrotate.d/traffic_ops_v2-access
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-/var/log/traffic_ops_v2/access.log {
-    daily
-    copytruncate
-    missingok
-    compress
-    maxage 30
-    dateext
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/build/run-build.sh
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/build/run-build.sh b/traffic_ops/experimental/ui/build/run-build.sh
deleted file mode 100755
index f0467a6..0000000
--- a/traffic_ops/experimental/ui/build/run-build.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/usr/bin/env bash
-# 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.
-
-target=$1
-[[ -z $target ]] && echo "No target specified"
-echo "Building $target"
-
-echo "GITREPO=${GITREPO:=https://github.com/apache/incubator-trafficcontrol}"
-echo "BRANCH=${BRANCH:=master}"
-
-set -x
-git clone $GITREPO -b $BRANCH traffic_control
-distdir=$(pwd)/traffic_control/dist
-
-cd traffic_control/traffic_ops/experimental/ui
-./build/build_rpm.sh
-mkdir -p /artifacts
-cp $distdir/* /artifacts/.
-
-# Clean up for next build
-cd -
-rm -r traffic_control

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/build/traffic_ops_v2.spec
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/build/traffic_ops_v2.spec b/traffic_ops/experimental/ui/build/traffic_ops_v2.spec
deleted file mode 100644
index ac94298..0000000
--- a/traffic_ops/experimental/ui/build/traffic_ops_v2.spec
+++ /dev/null
@@ -1,89 +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.
-#
-#
-# RPM spec file for the Traffic Ops v2
-#
-%define		debug_package %{nil}
-Name:		traffic_ops_v2
-Version:	%{traffic_control_version}
-Release:	%{build_number}
-Summary:	Traffic Ops v2
-Group:		Applications/Communications
-License:	Apache License, Version 2.0
-URL:		https://github.com/apache/incubator-trafficcontrol/
-Source:		%{_sourcedir}/traffic_ops_v2-%{traffic_control_version}.tgz
-AutoReqProv: no
-Requires: nodejs
-
-%define traffic_ops_v2_home /opt/traffic_ops_v2
-%description
-Installs Traffic Ops v2
-
-Built: @BUILT@
-
-%prep
-rm -rf $RPM_BUILD_DIR/traffic_ops_v2-%{version}
-tar -xzvf $RPM_SOURCE_DIR/traffic_ops_v2-%{version}.tgz
-
-%setup
-
-%build
-    /usr/bin/npm install
-    /usr/bin/bower install
-    /usr/bin/grunt dist
-
-%install
-    %__mkdir -p ${RPM_BUILD_ROOT}/etc/init.d
-    %__mkdir -p ${RPM_BUILD_ROOT}/etc/logrotate.d
-    %__mkdir -p ${RPM_BUILD_ROOT}/etc/traffic_ops_v2
-    %__mkdir -p ${RPM_BUILD_ROOT}%{traffic_ops_v2_home}/public
-    %__mkdir -p ${RPM_BUILD_ROOT}%{traffic_ops_v2_home}/server
-    %__mkdir -p ${RPM_BUILD_ROOT}/var/log/traffic_ops_v2
-
-    # creates dynamic json file needed at runtime for traffic ops v2 to display release info
-    BUILD_DATE=$(date +'%Y-%m-%d %H:%M:%S')
-    VERSION="\"Version\":\"$VERSION\""
-    BUILD_NUMBER="\"Build Number\":\"$BUILD_NUMBER\""
-    BUILD_DATE="\"Build Date\":\"$BUILD_DATE\""
-    JSON_VERSION="{\n$VERSION,\n$BUILD_NUMBER,\n$BUILD_DATE\n}"
-    echo -e $JSON_VERSION > ${RPM_BUILD_ROOT}%{traffic_ops_v2_home}/public/traffic_ops_release.json
-
-    %__cp ${RPM_BUILD_DIR}/traffic_ops_v2-%{version}/server/server.js ${RPM_BUILD_ROOT}%{traffic_ops_v2_home}/server/.
-    %__cp -r ${RPM_BUILD_DIR}/traffic_ops_v2-%{version}/conf ${RPM_BUILD_ROOT}/etc/traffic_ops_v2/.
-    %__cp ${RPM_BUILD_DIR}/traffic_ops_v2-%{version}/build/etc/init.d/traffic_ops_v2 ${RPM_BUILD_ROOT}/etc/init.d/.
-    %__cp ${RPM_BUILD_DIR}/traffic_ops_v2-%{version}/build/etc/logrotate.d/traffic_ops_v2 ${RPM_BUILD_ROOT}/etc/logrotate.d/.
-    %__cp ${RPM_BUILD_DIR}/traffic_ops_v2-%{version}/build/etc/logrotate.d/traffic_ops_v2-access ${RPM_BUILD_ROOT}/etc/logrotate.d/.
-    %__cp -r ${RPM_BUILD_DIR}/traffic_ops_v2-%{version}/app/dist/* ${RPM_BUILD_ROOT}%{traffic_ops_v2_home}/.
-
-%post
-    echo "Successfully installed the traffic_ops_v2 assets to " %{traffic_ops_v2_home}
-    %__chmod +x %{traffic_ops_v2_home}/node_modules/forever/bin/forever
-    %__chmod +x /etc/init.d/traffic_ops_v2
-    echo "Successfully installed the 'traffic_ops_v2' service"
-    /sbin/chkconfig traffic_ops_v2 on
-    echo ""
-    echo "Start with 'service traffic_ops_v2 start'"
-
-%files
-%defattr(644,root,root,755)
-%attr(755,root,root) /etc/init.d/traffic_ops_v2
-%attr(755,root,root) %{traffic_ops_v2_home}/node_modules/forever/bin/*
-%config(noreplace)/etc/traffic_ops_v2/conf/config.js
-%dir /var/log/traffic_ops_v2
-/etc/traffic_ops_v2/conf/config-template.js
-%{traffic_ops_v2_home}/*
-/etc/logrotate.d/traffic_ops_v2
-/etc/logrotate.d/traffic_ops_v2-access
-/etc/init.d/traffic_ops_v2

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/conf/config.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/conf/config.js b/traffic_ops/experimental/ui/conf/config.js
deleted file mode 100644
index f4256df..0000000
--- a/traffic_ops/experimental/ui/conf/config.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// this is the config that is consumed by server.js
-module.exports = {
-    timeout: '120s',
-    useSSL: false, // set to true if using ssl
-    port: 8080,
-    sslPort: 8443,
-    ssl: {
-        key:    '/etc/pki/tls/private/localhost.key',
-        cert:   '/etc/pki/tls/certs/localhost.crt',
-        ca:     [ '/etc/pki/tls/certs/ca-bundle.crt' ]
-    },
-    api: {
-        base_url: 'http://localhost:3000/api/'
-    },
-    files: {
-        static: './app/dist/public/'
-    },
-    log: {
-        stream: './server/log/access.log'
-    },
-    reject_unauthorized: 0 // 0 if using self-signed certs, 1 if trusted certs
-};
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/docker/Dockerfile
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/docker/Dockerfile b/traffic_ops/experimental/ui/docker/Dockerfile
deleted file mode 100644
index 7c1ebd1..0000000
--- a/traffic_ops/experimental/ui/docker/Dockerfile
+++ /dev/null
@@ -1,24 +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.
-#
-FROM node:4-onbuild
-#FROM buildpack-deps:jessie
-
-RUN apt-get update -y && apt-get install libffi-dev ruby-dev rubygems vim -y
-
-# replace this with your application's default port
-RUN gem update --system && gem install --no-rdoc --no-ri compass && gem install --no-rdoc --no-ri sass -v 3.4.22
-RUN npm install -g bower grunt-cli
-RUN echo '{ "allow_root": true }' > /root/.bowerrc
-RUN cd /usr/src/app && /usr/local/bin/bower install
-RUN cd /usr/src/app && /usr/local/bin/grunt dist

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/docker/docker-compose.yml
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/docker/docker-compose.yml b/traffic_ops/experimental/ui/docker/docker-compose.yml
deleted file mode 100644
index dd81b61..0000000
--- a/traffic_ops/experimental/ui/docker/docker-compose.yml
+++ /dev/null
@@ -1,32 +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.
-#
-version: '2'
-
-services:
-  portal:
-    build:
-      context: ..
-      dockerfile: /opt/traffic_portal/docker/Dockerfile
-    ports:
-      - 80:80
-      - 443:443
-    volumes:
-      - /etc/traffic_portal/conf:/etc/traffic_portal/conf
-      - /etc/pki:/etc/pki
-    networks:
-      - default
-
-networks:
-  default:
-     driver: bridge

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/docker/reset.sh
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/docker/reset.sh b/traffic_ops/experimental/ui/docker/reset.sh
deleted file mode 100755
index 91be282..0000000
--- a/traffic_ops/experimental/ui/docker/reset.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env bash
-# 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.
-
-sudo systemctl stop traffic_portal
-
-docker rm traffic_portal_1 #remove container
-docker rmi traffic_portal #remove image
-docker ps -a
-
-sudo systemctl start traffic_portal
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/etc/systemd/system/traffic_portal.service
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/etc/systemd/system/traffic_portal.service b/traffic_ops/experimental/ui/etc/systemd/system/traffic_portal.service
deleted file mode 100644
index dc24d3a..0000000
--- a/traffic_ops/experimental/ui/etc/systemd/system/traffic_portal.service
+++ /dev/null
@@ -1,30 +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.
-#
-#-----------------------------------------
-# Ansible managed
-#-----------------------------------------
-#
-[Unit]
-Description=Traffic Portal Docker Container
-Requires=docker.service
-After=docker.service
-
-[Service]
-Restart=always
-ExecStart=/usr/bin/docker-compose -p traffic -f /opt/traffic_portal/docker/docker-compose.yml up
-ExecStop=/usr/bin/docker-compose -p traffic -f /opt/traffic_portal/docker/docker-compose.yml down -v
-WorkingDirectory=/opt/traffic_portal/docker
-
-[Install]
-WantedBy=default.target

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/grunt/browserify2.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/grunt/browserify2.js b/traffic_ops/experimental/ui/grunt/browserify2.js
deleted file mode 100644
index 2528df4..0000000
--- a/traffic_ops/experimental/ui/grunt/browserify2.js
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = {
-    'shared-libs-prod': {
-        entry: './<%= globalConfig.srcdir %>/scripts/shared-libs.js',
-        compile: './<%= globalConfig.resourcesdir %>/assets/js/shared-libs.js',
-        options: {
-            expose: {
-                files: [
-                    {
-                        cwd: '<%= globalConfig.app %>/bower_components/',
-                        src:
-                            [
-                                'angular/angular.min.js',
-                                'angular-animate/angular-animate.min.js',
-                                'angular-bootstrap/ui-bootstrap.min.js',
-                                'angular-bootstrap/ui-bootstrap-tpls.min.js',
-                                'angular-jwt/dist/angular-jwt.min.js',
-                                'angular-loading-bar/build/loading-bar.min.js',
-                                'angular-resource/angular-resource.min.js',
-                                'angular-route/angular-route.min.js',
-                                'angular-sanitize/angular-sanitize.min.js',
-                                'angular-ui-router/release/angular-ui-router.min.js',
-                                'bootstrap-sass-official/assets/javascripts/bootstrap.min.js',
-                                'es5-shim/es5-shim.min.js',
-                                'jquery/jquery.min.js',
-                                'json3/lib/json3.min.js',
-                                'restangular/dist/restangular.min.js'
-                            ]
-                    },
-                    {
-                        cwd: '<%= globalConfig.app %>/bower_components/',
-                        src: [ 'flot/jquery.flot.js' ],
-                        rename: function () { return 'jquery-flot.js'; }
-                    },
-                    {
-                        cwd: '<%= globalConfig.app %>/bower_components/',
-                        src: [ 'flot/jquery.flot.pie.js' ],
-                        rename: function () { return 'jquery-flot-pie.js'; }
-                    },
-                    {
-                        cwd: '<%= globalConfig.app %>/bower_components/',
-                        src: [ 'flot/jquery.flot.stack.js' ],
-                        rename: function () { return 'jquery-flot-stack.js'; }
-                    },
-                    {
-                        cwd: '<%= globalConfig.app %>/bower_components/',
-                        src: [ 'flot/jquery.flot.time.js' ],
-                        rename: function () { return 'jquery-flot-time.js'; }
-                    },
-                    {
-                        cwd: '<%= globalConfig.app %>/bower_components/',
-                        src: [ 'flot.tooltip/js/jquery.flot.tooltip.min.js' ],
-                        rename: function () { return 'jquery-flot-tooltip.min.js'; }
-                    },
-                    {
-                        cwd: '<%= globalConfig.app %>/bower_components/',
-                        src: [ 'flot-axislabels/jquery.flot.axislabels.js' ],
-                        rename: function () { return 'jquery-flot-axislabels.js'; }
-                    }
-                ]
-            }
-        }
-    },
-    'shared-libs-dev': {
-        entry: './<%= globalConfig.srcdir %>/scripts/shared-libs.js',
-        compile: './<%= globalConfig.resourcesdir %>/assets/js/shared-libs.js',
-        options: {
-            expose: {
-                files: [
-                    {
-                        cwd: '<%= globalConfig.app %>/bower_components/',
-                        src:
-                            [
-                                'angular/angular.js',
-                                'angular-animate/angular-animate.js',
-                                'angular-bootstrap/ui-bootstrap.js',
-                                'angular-bootstrap/ui-bootstrap-tpls.js',
-                                'angular-jwt/dist/angular-jwt.js',
-                                'angular-loading-bar/build/loading-bar.js',
-                                'angular-resource/angular-resource.js',
-                                'angular-route/angular-route.js',
-                                'angular-sanitize/angular-sanitize.js',
-                                'angular-ui-router/release/angular-ui-router.js',
-                                'bootstrap-sass-official/assets/javascripts/bootstrap.js',
-                                'es5-shim/es5-shim.js',
-                                'jquery/jquery.js',
-                                'json3/lib/json3.js',
-                                'restangular/dist/restangular.js'
-                            ]
-                    },
-                    {
-                        cwd: '<%= globalConfig.app %>/bower_components/',
-                        src: [ 'flot/jquery.flot.js' ],
-                        rename: function () { return 'jquery-flot.js'; }
-                    },
-                    {
-                        cwd: '<%= globalConfig.app %>/bower_components/',
-                        src: [ 'flot/jquery.flot.pie.js' ],
-                        rename: function () { return 'jquery-flot-pie.js'; }
-                    },
-                    {
-                        cwd: '<%= globalConfig.app %>/bower_components/',
-                        src: [ 'flot/jquery.flot.stack.js' ],
-                        rename: function () { return 'jquery-flot-stack.js'; }
-                    },
-                    {
-                        cwd: '<%= globalConfig.app %>/bower_components/',
-                        src: [ 'flot/jquery.flot.time.js' ],
-                        rename: function () { return 'jquery-flot-time.js'; }
-                    },
-                    {
-                        cwd: '<%= globalConfig.app %>/bower_components/',
-                        src: [ 'flot.tooltip/js/jquery.flot.tooltip.js' ],
-                        rename: function () { return 'jquery-flot-tooltip.js'; }
-                    },
-                    {
-                        cwd: '<%= globalConfig.app %>/bower_components/',
-                        src: [ 'flot-axislabels/jquery.flot.axislabels.js' ],
-                        rename: function () { return 'jquery-flot-axislabels.js'; }
-                    }
-                ]
-            }
-        }
-    },
-    'app-prod': {
-        entry: './<%= globalConfig.srcdir %>/app.js',
-        compile: './<%= globalConfig.resourcesdir %>/assets/js/app.js',
-        debug: false,
-        options: {
-            expose: {
-                'app-templates':'./<%= globalConfig.tmpdir %>/app-templates.js'
-            }
-        }
-    },
-    'app-dev': {
-        entry: './<%= globalConfig.srcdir %>/app.js',
-        compile: './<%= globalConfig.resourcesdir %>/assets/js/app.js',
-        debug: true,
-        options: {
-            expose: {
-                'app-templates':'./<%= globalConfig.tmpdir %>/app-templates.js'
-            }
-        }
-    },
-    'app-config': {
-        entry: './<%= globalConfig.srcdir %>/scripts/config.js',
-        compile: './<%= globalConfig.resourcesdir %>/assets/js/config.js'
-    }
-};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/grunt/clean.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/grunt/clean.js b/traffic_ops/experimental/ui/grunt/clean.js
deleted file mode 100644
index cb999b8..0000000
--- a/traffic_ops/experimental/ui/grunt/clean.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-module.exports = {
-    all: [
-        '<%= globalConfig.distdir %>/*',
-        '<%= globalConfig.tmpdir %>/*'
-    ],
-    options: {
-        force: true
-    }
-};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/grunt/compass.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/grunt/compass.js b/traffic_ops/experimental/ui/grunt/compass.js
deleted file mode 100644
index 2aed889..0000000
--- a/traffic_ops/experimental/ui/grunt/compass.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-module.exports = {
-    options: {
-        sassDir: '<%= globalConfig.srcdir %>',
-        imagesDir: '<%= globalConfig.srcdir %>/assets/images',
-        javascriptsDir: '<%= globalConfig.srcdir %>',
-        fontsDir: '<%= globalConfig.srcdir %>/assets/fonts',
-        importPath: '<%= globalConfig.app %>/bower_components',
-        relativeAssets: false,
-        assetCacheBuster: false,
-        raw: 'Sass::Script::Number.precision = 10\n'
-    },
-    prod: {
-        options: {
-            cssDir: '<%= globalConfig.resourcesdir %>',
-            outputStyle: 'compressed',
-            environment: 'production'
-        }
-    },
-    dev: {
-        options: {
-            debugInfo: true,
-            cssDir: '<%= globalConfig.resourcesdir %>',
-            outputStyle: 'expanded',
-            environment: 'development'
-        }
-    }
-};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/grunt/copy.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/grunt/copy.js b/traffic_ops/experimental/ui/grunt/copy.js
deleted file mode 100644
index cfaa148..0000000
--- a/traffic_ops/experimental/ui/grunt/copy.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = {
-    dev: {
-        files: [
-            {
-                expand: true,
-                dot: true,
-                cwd: '<%= globalConfig.srcdir %>',
-                dest: '<%= globalConfig.resourcesdir %>',
-                src: [
-                    'assets/css/**/*',
-                    'assets/fonts/**/*',
-                    'assets/images/**/*',
-                    'assets/js/**/*'
-                ]
-            },
-            {
-                expand: true,
-                dot: true,
-                cwd: '<%= globalConfig.srcdir %>',
-                dest: '<%= globalConfig.distdir %>/public',
-                src: [
-                    '*.html',
-                    'traffic_portal_release.json',
-                    'traffic_portal_properties.json'
-                ]
-            }
-        ]
-    },
-    dist: {
-        files: [
-            {
-                expand: true,
-                dot: true,
-                cwd: '<%= globalConfig.srcdir %>',
-                dest: '<%= globalConfig.resourcesdir %>',
-                src: [
-                    'assets/css/**/*',
-                    'assets/fonts/**/*',
-                    'assets/images/**/*',
-                    'assets/js/**/*'
-                ]
-            },
-            {
-                expand: true,
-                dot: true,
-                cwd: '<%= globalConfig.srcdir %>',
-                dest: '<%= globalConfig.distdir %>/public',
-                src: [
-                    '*.html',
-                    'traffic_portal_release.json',
-                    'traffic_portal_properties.json'
-                ]
-            }
-        ]
-    }
-};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/grunt/express.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/grunt/express.js b/traffic_ops/experimental/ui/grunt/express.js
deleted file mode 100644
index 97c3bda..0000000
--- a/traffic_ops/experimental/ui/grunt/express.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = {
-    dev: {
-        options: {
-            script: './server.js',
-            node_env: 'dev'
-        }
-    }
-};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/grunt/globalConfig.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/grunt/globalConfig.js b/traffic_ops/experimental/ui/grunt/globalConfig.js
deleted file mode 100644
index 71ab1b4..0000000
--- a/traffic_ops/experimental/ui/grunt/globalConfig.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = function() {
-    var globalConfig = {
-        app: 'app',
-        resourcesdir: 'app/dist/public/resources',
-        distdir: 'app/dist',
-        srcserverdir: './server',
-        srcdir: 'app/src',
-        tmpdir: '.tmp',
-        srcfiles: {
-            js: ['./app/src/**/*.js'],
-            tpl: ['./app/src/**/*.tpl.html']
-        }
-    };
-
-    return globalConfig;
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/grunt/html2js.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/grunt/html2js.js b/traffic_ops/experimental/ui/grunt/html2js.js
deleted file mode 100644
index 8cd52af..0000000
--- a/traffic_ops/experimental/ui/grunt/html2js.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-module.exports = {
-    options: {
-        base: './app/src'
-    },
-    'dist': {
-        src: ['<%= globalConfig.srcfiles.tpl %>'],
-        dest: '<%= globalConfig.tmpdir %>/app-templates.js',
-        module: 'app.templates'
-    }
-};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/grunt/jshint.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/grunt/jshint.js b/traffic_ops/experimental/ui/grunt/jshint.js
deleted file mode 100644
index f95dfa1..0000000
--- a/traffic_ops/experimental/ui/grunt/jshint.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-module.exports = {
-    files: ['Gruntfile.js', '<%= globalConfig.srcfiles.js %>'],
-    options: {
-        jshintrc:true
-    }
-};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/grunt/uglify.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/grunt/uglify.js b/traffic_ops/experimental/ui/grunt/uglify.js
deleted file mode 100644
index 5f124ce..0000000
--- a/traffic_ops/experimental/ui/grunt/uglify.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = {
-    dist: {
-        files: {
-            '<%= globalConfig.resourcesdir %>/assets/js/app.js': [
-                '<%= globalConfig.tmpdir %>/app.js'
-            ]
-        }
-    }
-};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/grunt/watch.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/grunt/watch.js b/traffic_ops/experimental/ui/grunt/watch.js
deleted file mode 100644
index bc72b39..0000000
--- a/traffic_ops/experimental/ui/grunt/watch.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-module.exports = {
-    options: {
-        livereload: true
-    },
-    js: {
-        files: ['<%= globalConfig.srcdir %>/**/*.js'],
-        tasks: [ 'build-dev']
-    },
-    compass: {
-        files: ['<%= globalConfig.srcdir %>/**/*.{scss,sass}'],
-        tasks: ['compass:dev']
-    },
-    html: {
-        files: ['app/**/*.tpl.html', 'app/**/index.html'],
-        tasks: ['copy:dist', 'build-dev']
-    }
-};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/package.json
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/package.json b/traffic_ops/experimental/ui/package.json
deleted file mode 100755
index 6c070aa..0000000
--- a/traffic_ops/experimental/ui/package.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
-    "name": "trafficPortal",
-    "version": "2.x",
-    "description": "Traffic Portal",
-    "repository": {
-        "type": "git",
-        "url": "git@github.com:apache/incubator-trafficcontrol.git"
-    },
-    "devDependencies": {
-        "morgan": "1.7.0",
-        "connect-modrewrite": "0.10.1",
-        "connect-timeout": "1.8.0",
-        "ssl-root-cas": "1.2.3",
-        "express": "4.15.2",
-        "requirejs": "2.3.3",
-        "connect-livereload": "0.5.4",
-        "grunt": "0.4.5",
-        "grunt-adam-compass": "0.7.1",
-        "grunt-browserify2": "0.1.8",
-        "grunt-concurrent": "2.2.1",
-        "grunt-contrib-clean": "1.0.0",
-        "grunt-contrib-concat": "1.0.0",
-        "grunt-contrib-copy": "0.8.2",
-        "grunt-contrib-cssmin": "0.14.0",
-        "grunt-contrib-htmlmin": "0.6.0",
-        "grunt-contrib-jshint": "1.0.0",
-        "grunt-contrib-uglify": "0.11.1",
-        "grunt-contrib-watch": "0.6.1",
-        "grunt-express-server": "0.5.2",
-        "grunt-html2js": "0.3.5",
-        "grunt-newer": "1.1.2",
-        "grunt-rev": "0.1.0",
-        "grunt-usemin": "3.0.0",
-        "grunt-wiredep": "2.0.0",
-        "load-grunt-config": "0.19.1",
-        "load-grunt-tasks": "3.4.1",
-        "time-grunt": "1.3.0"
-    },
-    "engines": {
-        "node": "0.11.14"
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/server.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/server.js b/traffic_ops/experimental/ui/server.js
deleted file mode 100644
index 5dce61c..0000000
--- a/traffic_ops/experimental/ui/server.js
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var constants = require('constants'),
-    express = require('express'),
-    http = require('http'),
-    https = require('https'),
-    path = require('path'),
-    fs = require('fs'),
-    morgan = require('morgan'),
-    modRewrite = require('connect-modrewrite'),
-    timeout = require('connect-timeout');
-
-var config;
-
-try {
-    config = require('/etc/traffic_portal/conf/config');
-}
-catch(e) {
-    config = require('./conf/config');
-}
-
-var logStream = fs.createWriteStream(config.log.stream, { flags: 'a' }),
-    useSSL = config.useSSL;
-
-// Disable for self-signed certs in dev/test
-process.env.NODE_TLS_REJECT_UNAUTHORIZED = config.reject_unauthorized;
-
-var app = express();
-
-app.use(function(req, res, next) {
-    var err = null;
-    try {
-        decodeURIComponent(req.path)
-    }
-    catch(e) {
-        err = e;
-    }
-    if (err){
-        console.log(err, req.url);
-    }
-    next();
-});
-
-// Add a handler to inspect the req.secure flag (see
-// http://expressjs.com/api#req.secure). This allows us
-// to know whether the request was via http or https.
-app.all ("/*", function (req, res, next) {
-    if (useSSL && !req.secure) {
-        // request was via http, so redirect to https
-        return res.redirect(['https://', req.get('Host'), ':', config.sslPort, req.url].join(''));
-    } else {
-        // request was via https or useSSL=false, so do no special handling
-        next();
-    }
-});
-
-app.use(modRewrite([
-    '^/api/(.*?)\\?(.*)$ ' + config.api.base_url + '$1?$2 [P]',
-    '^/api/(.*)$ ' + config.api.base_url + '$1 [P]'
-]));
-
-app.use(express.static(config.files.static));
-app.use(morgan('combined', {
-    stream: logStream,
-    skip: function (req, res) { return res.statusCode < 400 }
-}));
-app.use(timeout(config.timeout));
-
-if (app.get('env') === 'dev') {
-    app.use(require('connect-livereload')({
-        port: 35728,
-        excludeList: ['.woff', '.flv']
-    }));
-} else {
-    app.set('env', 'production');
-}
-
-// special handling required for dbdump. haven't got this to work yet
-// app.get('/dbdump', function (req, res) {
-//     var port = (useSSL) ? config.sslPort : config.port,
-//         options = {
-//             method: 'GET',
-//             host: 'localhost',
-//             port: port,
-//             path: '/api/1.2/dbdump',
-//             headers: {
-//                 cookie: req.headers['cookie']
-//             }
-//         };
-//
-//     var request = http.request(options, function(response) {
-//         var data = [];
-//         console.log(response.statusCode);
-//         response.on('data', function(chunk) {
-//             data.push(chunk);
-//         });
-//         response.on('end', function() {
-//             data = Buffer.concat(data);
-//             res.writeHead(200, {
-//                 'Content-Type': 'application/download',
-//                 'Content-Disposition': 'attachment; filename=foo.dump.gz',
-//                 'Content-Length': data.length
-//             });
-//             res.end(data);
-//         });
-//     });
-//
-//     request.end();
-// });
-
-// Enable reverse proxy support in Express. This causes the
-// the "X-Forwarded-Proto" header field to be trusted so its
-// value can be used to determine the protocol. See
-// http://expressjs.com/api#app-settings for more details.
-app.enable('trust proxy');
-
-// Startup HTTP Server
-var httpServer = http.createServer(app);
-httpServer.listen(config.port);
-
-if (useSSL) {
-    //
-    // Supply `SSL_OP_NO_SSLv3` constant as secureOption to disable SSLv3
-    // from the list of supported protocols that SSLv23_method supports.
-    //
-    var sslOptions = {};
-    sslOptions['secureOptions'] = constants.SSL_OP_NO_SSLv3;
-
-    sslOptions['key'] = fs.readFileSync(config.ssl.key);
-    sslOptions['cert'] = fs.readFileSync(config.ssl.cert);
-    sslOptions['ca'] = config.ssl.ca.map(function(cert){
-        return fs.readFileSync(cert);
-    });
-
-    // Startup HTTPS Server
-    var httpsServer = https.createServer(sslOptions, app);
-    httpsServer.listen(config.sslPort);
-
-    sslOptions.agent = new https.Agent(sslOptions);
-}
-
-console.log("Traffic Ops UI Port         : %s", config.port + " | 80");
-console.log("Traffic Ops UI SSL Port     : %s", config.sslPort + " | 443");

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/server/log/.keep
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/server/log/.keep b/traffic_ops/experimental/ui/server/log/.keep
deleted file mode 100644
index e69de29..0000000

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/.gitattributes
----------------------------------------------------------------------
diff --git a/traffic_portal/.gitattributes b/traffic_portal/.gitattributes
new file mode 100644
index 0000000..2125666
--- /dev/null
+++ b/traffic_portal/.gitattributes
@@ -0,0 +1 @@
+* text=auto
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/.gitignore
----------------------------------------------------------------------
diff --git a/traffic_portal/.gitignore b/traffic_portal/.gitignore
index a6d8ee5..5161722 100644
--- a/traffic_portal/.gitignore
+++ b/traffic_portal/.gitignore
@@ -1,9 +1,6 @@
 .tmp
 .sass-cache
+server/log/access.log
+node_modules
 app/bower_components
 app/dist
-app/src/scripts/config.js
-node_modules
-rpm/rpmbuild
-rpm/*.rpm
-server/log/access.log

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/Dockerfile
----------------------------------------------------------------------
diff --git a/traffic_portal/Dockerfile b/traffic_portal/Dockerfile
new file mode 100644
index 0000000..7c1ebd1
--- /dev/null
+++ b/traffic_portal/Dockerfile
@@ -0,0 +1,24 @@
+#
+#  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.
+#
+FROM node:4-onbuild
+#FROM buildpack-deps:jessie
+
+RUN apt-get update -y && apt-get install libffi-dev ruby-dev rubygems vim -y
+
+# replace this with your application's default port
+RUN gem update --system && gem install --no-rdoc --no-ri compass && gem install --no-rdoc --no-ri sass -v 3.4.22
+RUN npm install -g bower grunt-cli
+RUN echo '{ "allow_root": true }' > /root/.bowerrc
+RUN cd /usr/src/app && /usr/local/bin/bower install
+RUN cd /usr/src/app && /usr/local/bin/grunt dist

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/Gruntfile.js
----------------------------------------------------------------------
diff --git a/traffic_portal/Gruntfile.js b/traffic_portal/Gruntfile.js
old mode 100755
new mode 100644
index f86d919..5f32f25
--- a/traffic_portal/Gruntfile.js
+++ b/traffic_portal/Gruntfile.js
@@ -1,23 +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.
  */
 
 'use strict';
 
 module.exports = function (grunt) {
+
     var os = require("os");
     var globalConfig = require('./grunt/globalConfig');
 
@@ -27,17 +30,17 @@ module.exports = function (grunt) {
     // load grunt task configurations
     require('load-grunt-config')(grunt);
 
-    // default task - runs in dev mode
+    // default task - when you type 'grunt' it really runs as 'grunt dev'
     grunt.registerTask('default', ['dev']);
 
-    // dev task - when you type 'grunt dev' <-- builds unminified app and starts dev node.js server and watches for source file changes
+    // dev task - when you type 'grunt dev' <-- builds unminified app and puts it in in app/dist folder and starts express server which reads server.js
     grunt.registerTask('dev', [
         'build-dev',
         'express:dev',
         'watch'
     ]);
 
-    // dist task - when you type 'grunt dist' <-- builds minified app for distribution and generates node dependencies all wrapped up nicely in a /dist folder
+    // dist task - when you type 'grunt dist' <-- builds minified app for distribution and generates node dependencies all wrapped up nicely in app/dist folder
     grunt.registerTask('dist', [
         'build',
         'install-dependencies'
@@ -45,7 +48,6 @@ module.exports = function (grunt) {
 
     // build tasks
     grunt.registerTask('build', [
-        'ngconstant:prod',
         'clean',
         'copy:dist',
         'build-css',
@@ -54,7 +56,6 @@ module.exports = function (grunt) {
     ]);
 
     grunt.registerTask('build-dev', [
-        'ngconstant:dev',
         'clean',
         'copy:dev',
         'build-css-dev',
@@ -93,4 +94,4 @@ module.exports = function (grunt) {
         'browserify2:shared-libs-dev'
     ]);
 
-};
\ No newline at end of file
+};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/README.md
----------------------------------------------------------------------
diff --git a/traffic_portal/README.md b/traffic_portal/README.md
index 92a0fa9..a9ddfbe 100644
--- a/traffic_portal/README.md
+++ b/traffic_portal/README.md
@@ -1,5 +1,3 @@
 # Traffic Portal
 
-An AngularJS client served from a lightweight Node.js web server designed to consume the Traffic Ops 1.x API.
-
-Installation instructions found in traffic_portal/build directory.
\ No newline at end of file
+An AngularJS client served from a lightweight Node.js web server. Traffic Portal was designed to consume the Traffic Ops 2.0 RESTful API.

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/AppController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/AppController.js b/traffic_portal/app/src/AppController.js
deleted file mode 100644
index b9e87d7..0000000
--- a/traffic_portal/app/src/AppController.js
+++ /dev/null
@@ -1,21 +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 AppController = function() {};
-
-AppController.$inject = [];
-module.exports = AppController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/app.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/app.js b/traffic_portal/app/src/app.js
old mode 100755
new mode 100644
index 9d7ac4a..546c9d1
--- a/traffic_portal/app/src/app.js
+++ b/traffic_portal/app/src/app.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.
  */
 
 'use strict';
@@ -30,89 +32,284 @@ var trafficPortal = angular.module('trafficPortal', [
         'ngResource',
         'ngSanitize',
         'ngRoute',
+        'ngMap',
         'ui.router',
         'ui.bootstrap',
-        'ui.bootstrap.datetimepicker',
+        'restangular',
         'app.templates',
+        'angular-jwt',
         'angular-loading-bar',
 
         // public modules
         require('./modules/public').name,
-        require('./modules/public/home').name,
-        require('./modules/public/home/landing').name,
-        require('./modules/public/about').name,
+        require('./modules/public/login').name,
 
         // private modules
         require('./modules/private').name,
 
-        // collateral
-        require('./modules/private/collateral').name,
-
-        // dashboard
-        require('./modules/private/dashboard').name,
-        require('./modules/private/dashboard/overview').name,
-
-        // delivery service
-        require('./modules/private/deliveryService').name,
-        require('./modules/private/deliveryService/new').name,
-        require('./modules/private/deliveryService/view').name,
-        require('./modules/private/deliveryService/view/overview').name,
-        require('./modules/private/deliveryService/view/overview/detail').name,
-
-        // delivery service charts
-        require('./modules/private/deliveryService/view/charts').name,
-        require('./modules/private/deliveryService/view/charts/bandwidthPerSecond').name,
-        require('./modules/private/deliveryService/view/charts/httpStatus').name,
-        require('./modules/private/deliveryService/view/charts/transactionsPerSecond').name,
-
-        // user
+        // current user
         require('./modules/private/user').name,
         require('./modules/private/user/edit').name,
-        require('./modules/private/user/register').name,
-        require('./modules/private/user/reset').name,
+
+        // admin
+        require('./modules/private/admin').name,
+        require('./modules/private/admin/asns').name,
+        require('./modules/private/admin/asns/edit').name,
+        require('./modules/private/admin/asns/list').name,
+        require('./modules/private/admin/asns/new').name,
+        require('./modules/private/admin/cdns').name,
+        require('./modules/private/admin/cdns/config').name,
+        require('./modules/private/admin/cdns/deliveryServices').name,
+        require('./modules/private/admin/cdns/edit').name,
+        require('./modules/private/admin/cdns/list').name,
+        require('./modules/private/admin/cdns/new').name,
+        require('./modules/private/admin/cdns/profiles').name,
+        require('./modules/private/admin/cdns/servers').name,
+        require('./modules/private/admin/changeLogs').name,
+        require('./modules/private/admin/changeLogs/list').name,
+        require('./modules/private/admin/divisions').name,
+        require('./modules/private/admin/divisions/edit').name,
+        require('./modules/private/admin/divisions/list').name,
+        require('./modules/private/admin/divisions/new').name,
+        require('./modules/private/admin/divisions/regions').name,
+        require('./modules/private/admin/jobs').name,
+        require('./modules/private/admin/jobs/list').name,
+        require('./modules/private/admin/jobs/new').name,
+        require('./modules/private/admin/physLocations').name,
+        require('./modules/private/admin/physLocations/edit').name,
+        require('./modules/private/admin/physLocations/list').name,
+        require('./modules/private/admin/physLocations/new').name,
+        require('./modules/private/admin/physLocations/servers').name,
+        require('./modules/private/admin/parameters').name,
+        require('./modules/private/admin/parameters/cacheGroups').name,
+        require('./modules/private/admin/parameters/edit').name,
+        require('./modules/private/admin/parameters/list').name,
+        require('./modules/private/admin/parameters/new').name,
+        require('./modules/private/admin/parameters/profiles').name,
+        require('./modules/private/admin/profiles').name,
+        require('./modules/private/admin/profiles/deliveryServices').name,
+        require('./modules/private/admin/profiles/edit').name,
+        require('./modules/private/admin/profiles/list').name,
+        require('./modules/private/admin/profiles/new').name,
+        require('./modules/private/admin/profiles/parameters').name,
+        require('./modules/private/admin/profiles/servers').name,
+        require('./modules/private/admin/regions').name,
+        require('./modules/private/admin/regions/edit').name,
+        require('./modules/private/admin/regions/list').name,
+        require('./modules/private/admin/regions/physLocations').name,
+        require('./modules/private/admin/regions/new').name,
+        require('./modules/private/admin/statuses').name,
+        require('./modules/private/admin/statuses/edit').name,
+        require('./modules/private/admin/statuses/list').name,
+        require('./modules/private/admin/statuses/new').name,
+        require('./modules/private/admin/statuses/servers').name,
+        require('./modules/private/admin/tenants').name,
+        require('./modules/private/admin/tenants/edit').name,
+        require('./modules/private/admin/tenants/list').name,
+        require('./modules/private/admin/tenants/new').name,
+        require('./modules/private/admin/types').name,
+        require('./modules/private/admin/types/edit').name,
+        require('./modules/private/admin/types/list').name,
+        require('./modules/private/admin/types/new').name,
+        require('./modules/private/admin/types/servers').name,
+        require('./modules/private/admin/types/cacheGroups').name,
+        require('./modules/private/admin/types/deliveryServices').name,
+        require('./modules/private/admin/types/staticDnsEntries').name,
+        require('./modules/private/admin/users').name,
+        require('./modules/private/admin/users/deliveryServices').name,
+        require('./modules/private/admin/users/edit').name,
+        require('./modules/private/admin/users/list').name,
+        require('./modules/private/admin/users/new').name,
+
+        // configure
+        require('./modules/private/configure').name,
+        require('./modules/private/configure/cacheGroups').name,
+        require('./modules/private/configure/cacheGroups/edit').name,
+        require('./modules/private/configure/cacheGroups/list').name,
+        require('./modules/private/configure/cacheGroups/new').name,
+        require('./modules/private/configure/cacheGroups/asns').name,
+        require('./modules/private/configure/cacheGroups/parameters').name,
+        require('./modules/private/configure/cacheGroups/servers').name,
+        require('./modules/private/configure/cacheGroups/staticDnsEntries').name,
+        require('./modules/private/configure/deliveryServices').name,
+        require('./modules/private/configure/deliveryServices/edit').name,
+        require('./modules/private/configure/deliveryServices/list').name,
+        require('./modules/private/configure/deliveryServices/new').name,
+        require('./modules/private/configure/deliveryServices/jobs').name,
+        require('./modules/private/configure/deliveryServices/jobs/list').name,
+        require('./modules/private/configure/deliveryServices/jobs/new').name,
+        require('./modules/private/configure/deliveryServices/regexes').name,
+        require('./modules/private/configure/deliveryServices/regexes/edit').name,
+        require('./modules/private/configure/deliveryServices/regexes/list').name,
+        require('./modules/private/configure/deliveryServices/regexes/new').name,
+        require('./modules/private/configure/deliveryServices/servers').name,
+        require('./modules/private/configure/deliveryServices/staticDnsEntries').name,
+        require('./modules/private/configure/deliveryServices/users').name,
+        require('./modules/private/configure/servers').name,
+        require('./modules/private/configure/servers/deliveryServices').name,
+        require('./modules/private/configure/servers/edit').name,
+        require('./modules/private/configure/servers/new').name,
+        require('./modules/private/configure/servers/list').name,
+
+        // custom
+        require('./modules/private/custom').name,
+
+        // monitor
+        require('./modules/private/monitor').name,
+
+        // dashboard
+        require('./modules/private/monitor/dashboard').name,
+        require('./modules/private/monitor/dashboard/view').name,
+
+        // map
+        require('./modules/private/monitor/map').name,
 
         // common modules
-        require('./common/modules/cacheGroups').name,
-        require('./common/modules/chart/bandwidthPerSecond').name,
-        require('./common/modules/chart/capacity').name,
-        require('./common/modules/chart/dates').name,
-        require('./common/modules/chart/httpStatus').name,
-        require('./common/modules/chart/routing').name,
-        require('./common/modules/chart/transactionsPerSecond').name,
-        require('./common/modules/dates').name,
-        require('./common/modules/deliveryService/config/edit').name,
         require('./common/modules/dialog/confirm').name,
+        require('./common/modules/dialog/delete').name,
         require('./common/modules/dialog/reset').name,
-        require('./common/modules/footer').name,
+        require('./common/modules/dialog/select').name,
+        require('./common/modules/dialog/select/status').name,
         require('./common/modules/header').name,
         require('./common/modules/message').name,
-        require('./common/modules/release/version').name,
-        require('./common/modules/tools/purge').name,
-
+        require('./common/modules/navigation').name,
+        require('./common/modules/release').name,
+
+        // forms
+        require('./common/modules/form/cacheGroup').name,
+        require('./common/modules/form/cacheGroup/edit').name,
+        require('./common/modules/form/cacheGroup/new').name,
+        require('./common/modules/form/asn').name,
+        require('./common/modules/form/asn/edit').name,
+        require('./common/modules/form/asn/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/deliveryService').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/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/job').name,
+        require('./common/modules/form/job/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/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,
+
+        // tables
+        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/changeLogs').name,
+        require('./common/modules/table/asns').name,
+        require('./common/modules/table/cdns').name,
+        require('./common/modules/table/cdnDeliveryServices').name,
+        require('./common/modules/table/cdnProfiles').name,
+        require('./common/modules/table/cdnServers').name,
+        require('./common/modules/table/deliveryServices').name,
+        require('./common/modules/table/deliveryServiceJobs').name,
+        require('./common/modules/table/deliveryServiceRegexes').name,
+        require('./common/modules/table/deliveryServiceServers').name,
+        require('./common/modules/table/deliveryServiceStaticDnsEntries').name,
+        require('./common/modules/table/deliveryServiceUsers').name,
+        require('./common/modules/table/divisions').name,
+        require('./common/modules/table/divisionRegions').name,
+        require('./common/modules/table/jobs').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/servers').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/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/routing').name,
+
+        // models
         require('./common/models').name,
         require('./common/api').name,
 
-        //directives
-        require('./common/directives/enter').name,
-        require('./common/directives/formattedDate').name,
+        // directives
         require('./common/directives/match').name,
-        require('./common/directives/rcSubmit').name,
-        require('./common/directives/rcVerifySet').name,
-        require('./common/directives/selectOnClick').name,
 
         // services
         require('./common/service/application').name,
         require('./common/service/utils').name,
-        require('./common/service/utils/date').name,
 
-        //filters
+        // filters
         require('./common/filters').name
 
     ], App)
 
-        .controller('AppController', require('./AppController'))
+        .config(function($stateProvider, $logProvider, $controllerProvider, RestangularProvider, ENV) {
+
+            RestangularProvider.setBaseUrl(ENV.api['root']);
+
+            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;
+                }
+            });
 
-        .config(function($stateProvider, $logProvider, $controllerProvider) {
             $controllerProvider.allowGlobals();
             $logProvider.debugEnabled(true);
             $stateProvider
@@ -120,24 +317,25 @@ var trafficPortal = angular.module('trafficPortal', [
                     url: '/',
                     abstract: true,
                     templateUrl: 'common/templates/master.tpl.html',
-                    controller: 'AppController',
-                    resolve: {
-                        properties: function(portalService, propertiesModel) {
-                            return portalService.getProperties()
-                                .then(function(result) {
-                                    propertiesModel.setProperties(result);
-                                });
+                        resolve: {
+                                properties: function(trafficPortalService, propertiesModel) {
+                                        return trafficPortalService.getProperties()
+                                            .then(function(result) {
+                                                    propertiesModel.setProperties(result);
+                                            });
+                                }
                         }
-                    }
+
                 });
         })
 
-        .run(function(applicationService) {
+        .run(function($log, applicationService) {
+            $log.debug("Application run...");
             applicationService.startup();
         })
     ;
 
-trafficPortal.factory('authInterceptor', function ($q, $location, $timeout, dateUtils, messageModel, userModel) {
+trafficPortal.factory('authInterceptor', function ($q, $window, $location, $timeout, messageModel, userModel) {
     return {
         responseError: function (rejection) {
             var url = $location.url(),
@@ -154,7 +352,7 @@ trafficPortal.factory('authInterceptor', function ($q, $location, $timeout, date
                 } else {
                     $timeout(function () {
                         messageModel.setMessages(alerts, true);
-                        // forward the to the home page with ?redirect=page/they/were/trying/to/reach
+                        // forward the to the login page with ?redirect=page/they/were/trying/to/reach
                         $location.url('/').search({ redirect: encodeURIComponent(url) });
                     }, 200);
                 }
@@ -165,7 +363,7 @@ trafficPortal.factory('authInterceptor', function ($q, $location, $timeout, date
             } 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 () {
-                    messageModel.setMessages([ { level: 'error', text: rejection.status.toString() + ': ' + rejection.statusText + ' (' + dateUtils.dateFormat(new Date(), "UTC:dd/mmm/yyyy:HH:MM:ss o") + ')'  } ], false);
+                    messageModel.setMessages([ { level: 'error', text: rejection.status.toString() + ': ' + rejection.statusText } ], false);
                 }, 200);
             }
 

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/css/custom.css
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/css/custom.css b/traffic_portal/app/src/assets/css/custom.css
index c0c95c3..6759bab 100644
--- a/traffic_portal/app/src/assets/css/custom.css
+++ b/traffic_portal/app/src/assets/css/custom.css
@@ -1,23 +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
+ * 
+ * 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 under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-*/
-
-
-/*
-    This file is a placeholder for custom styles for Traffic Portal. To customize styles, create your own custom.css and copy it
-    to /resources/assets/css/ on your web server replacing the old, blank one. This file should remain blank in source control.
-    If the default bootstrap styles are sufficient, do nothing.
-*/
+/* override styles here */



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/parameters/profiles/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/parameters/profiles/index.js b/traffic_portal/app/src/modules/private/admin/parameters/profiles/index.js
new file mode 100644
index 0000000..3d4d59c
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/parameters/profiles/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.parameters.profiles', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.parameters.profiles', {
+				url: '/{parameterId}/profiles',
+				views: {
+					parametersContent: {
+						templateUrl: 'common/modules/table/parameterProfiles/table.parameterProfiles.tpl.html',
+						controller: 'TableParameterProfilesController',
+						resolve: {
+							parameter: function($stateParams, parameterService) {
+								return parameterService.getParameter($stateParams.parameterId);
+							},
+							parameterProfiles: function($stateParams, profileService) {
+								return profileService.getParameterProfiles($stateParams.parameterId);
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/physLocations/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/physLocations/edit/index.js b/traffic_portal/app/src/modules/private/admin/physLocations/edit/index.js
new file mode 100644
index 0000000..72b61cb
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/physLocations/edit/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.physLocations.edit', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.physLocations.edit', {
+                url: '/{physLocationId:[0-9]{1,8}}',
+                views: {
+                    physLocationsContent: {
+                        templateUrl: 'common/modules/form/physLocation/form.physLocation.tpl.html',
+                        controller: 'FormEditPhysLocationController',
+                        resolve: {
+                            physLocation: function($stateParams, physLocationService) {
+                                return physLocationService.getPhysLocation($stateParams.physLocationId);
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/physLocations/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/physLocations/index.js b/traffic_portal/app/src/modules/private/admin/physLocations/index.js
new file mode 100644
index 0000000..5ce9a8f
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/physLocations/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.admin.physLocations', [])
+    .controller('PhysLocationsController', require('./PhysLocationsController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.physLocations', {
+                url: '/phys-locations',
+                abstract: true,
+                views: {
+                    adminContent: {
+                        templateUrl: 'modules/private/admin/physLocations/physLocations.tpl.html',
+                        controller: 'PhysLocationsController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/physLocations/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/physLocations/list/index.js b/traffic_portal/app/src/modules/private/admin/physLocations/list/index.js
new file mode 100644
index 0000000..a349255
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/physLocations/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.physLocations.list', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.physLocations.list', {
+                url: '',
+                views: {
+                    physLocationsContent: {
+                        templateUrl: 'common/modules/table/physLocations/table.physLocations.tpl.html',
+                        controller: 'TablePhysLocationsController',
+                        resolve: {
+                            physLocations: function(physLocationService) {
+                                return physLocationService.getPhysLocations();
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/physLocations/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/physLocations/new/index.js b/traffic_portal/app/src/modules/private/admin/physLocations/new/index.js
new file mode 100644
index 0000000..ec689f4
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/physLocations/new/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.physLocations.new', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.physLocations.new', {
+                url: '/new',
+                views: {
+                    physLocationsContent: {
+                        templateUrl: 'common/modules/form/physLocation/form.physLocation.tpl.html',
+                        controller: 'FormNewPhysLocationController',
+                        resolve: {
+                            physLocation: function() {
+                                return {};
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/physLocations/physLocations.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/physLocations/physLocations.tpl.html b/traffic_portal/app/src/modules/private/admin/physLocations/physLocations.tpl.html
new file mode 100644
index 0000000..dce6e52
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/physLocations/physLocations.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="locationsContainer">
+    <div ui-view="physLocationsContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/physLocations/servers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/physLocations/servers/index.js b/traffic_portal/app/src/modules/private/admin/physLocations/servers/index.js
new file mode 100644
index 0000000..7defcab
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/physLocations/servers/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.physLocations.servers', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.physLocations.servers', {
+				url: '/{physLocationId}/servers',
+				views: {
+					physLocationsContent: {
+						templateUrl: 'common/modules/table/physLocationServers/table.physLocationServers.tpl.html',
+						controller: 'TablePhysLocationServersController',
+						resolve: {
+							physLocation: function($stateParams, physLocationService) {
+								return physLocationService.getPhysLocation($stateParams.physLocationId);
+							},
+							servers: function($stateParams, serverService) {
+								return serverService.getServers({ physLocation: $stateParams.physLocationId });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/profiles/deliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/profiles/deliveryServices/index.js b/traffic_portal/app/src/modules/private/admin/profiles/deliveryServices/index.js
new file mode 100644
index 0000000..ea65412
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/profiles/deliveryServices/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.profiles.deliveryServices', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.profiles.deliveryServices', {
+				url: '/{profileId}/delivery-services',
+				views: {
+					profilesContent: {
+						templateUrl: 'common/modules/table/profileDeliveryServices/table.profileDeliveryServices.tpl.html',
+						controller: 'TableProfileDeliveryServicesController',
+						resolve: {
+							profile: function($stateParams, profileService) {
+								return profileService.getProfile($stateParams.profileId);
+							},
+							deliveryServices: function($stateParams, deliveryServiceService) {
+								return deliveryServiceService.getDeliveryServices({ profile: $stateParams.profileId });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/profiles/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/profiles/edit/index.js b/traffic_portal/app/src/modules/private/admin/profiles/edit/index.js
new file mode 100644
index 0000000..c7765e8
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/profiles/edit/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.profiles.edit', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.profiles.edit', {
+                url: '/{profileId:[0-9]{1,8}}',
+                views: {
+                    profilesContent: {
+                        templateUrl: 'common/modules/form/profile/form.profile.tpl.html',
+                        controller: 'FormEditProfileController',
+                        resolve: {
+                            profile: function($stateParams, profileService) {
+                                return profileService.getProfile($stateParams.profileId);
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/profiles/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/profiles/index.js b/traffic_portal/app/src/modules/private/admin/profiles/index.js
new file mode 100644
index 0000000..39af410
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/profiles/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.admin.profiles', [])
+    .controller('ProfilesController', require('./ProfilesController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.profiles', {
+                url: '/profiles',
+                abstract: true,
+                views: {
+                    adminContent: {
+                        templateUrl: 'modules/private/admin/profiles/profiles.tpl.html',
+                        controller: 'ProfilesController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/profiles/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/profiles/list/index.js b/traffic_portal/app/src/modules/private/admin/profiles/list/index.js
new file mode 100644
index 0000000..ab14cac
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/profiles/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.profiles.list', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.profiles.list', {
+                url: '',
+                views: {
+                    profilesContent: {
+                        templateUrl: 'common/modules/table/profiles/table.profiles.tpl.html',
+                        controller: 'TableProfilesController',
+                        resolve: {
+                            profiles: function(profileService) {
+                                return profileService.getProfiles();
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/profiles/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/profiles/new/index.js b/traffic_portal/app/src/modules/private/admin/profiles/new/index.js
new file mode 100644
index 0000000..6ebc597
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/profiles/new/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.profiles.new', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.profiles.new', {
+                url: '/new',
+                views: {
+                    profilesContent: {
+                        templateUrl: 'common/modules/form/profile/form.profile.tpl.html',
+                        controller: 'FormNewProfileController',
+                        resolve: {
+                            profile: function() {
+                                return {};
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/profiles/parameters/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/profiles/parameters/index.js b/traffic_portal/app/src/modules/private/admin/profiles/parameters/index.js
new file mode 100644
index 0000000..4a23692
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/profiles/parameters/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.profiles.parameters', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.profiles.parameters', {
+				url: '/{profileId}/parameters',
+				views: {
+					profilesContent: {
+						templateUrl: 'common/modules/table/profileParameters/table.profileParameters.tpl.html',
+						controller: 'TableProfileParametersController',
+						resolve: {
+							profile: function($stateParams, profileService) {
+								return profileService.getProfile($stateParams.profileId);
+							},
+							profileParameters: function($stateParams, parameterService) {
+								return parameterService.getProfileParameters($stateParams.profileId);
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/profiles/profiles.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/profiles/profiles.tpl.html b/traffic_portal/app/src/modules/private/admin/profiles/profiles.tpl.html
new file mode 100644
index 0000000..4b35411
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/profiles/profiles.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="profilesContainer">
+    <div ui-view="profilesContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/profiles/servers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/profiles/servers/index.js b/traffic_portal/app/src/modules/private/admin/profiles/servers/index.js
new file mode 100644
index 0000000..f1f9569
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/profiles/servers/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.profiles.servers', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.profiles.servers', {
+				url: '/{profileId}/servers',
+				views: {
+					profilesContent: {
+						templateUrl: 'common/modules/table/profileServers/table.profileServers.tpl.html',
+						controller: 'TableProfileServersController',
+						resolve: {
+							profile: function($stateParams, profileService) {
+								return profileService.getProfile($stateParams.profileId);
+							},
+							servers: function($stateParams, serverService) {
+								return serverService.getServers({ profileId: $stateParams.profileId });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/regions/_regions.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/regions/_regions.scss b/traffic_portal/app/src/modules/private/admin/regions/_regions.scss
new file mode 100644
index 0000000..d57b9c6
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/regions/_regions.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/admin/regions/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/regions/edit/index.js b/traffic_portal/app/src/modules/private/admin/regions/edit/index.js
new file mode 100644
index 0000000..2373fd8
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/regions/edit/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.regions.edit', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.regions.edit', {
+                url: '/{regionId:[0-9]{1,8}}',
+                views: {
+                    regionsContent: {
+                        templateUrl: 'common/modules/form/region/form.region.tpl.html',
+                        controller: 'FormEditRegionController',
+                        resolve: {
+                            region: function($stateParams, regionService) {
+                                return regionService.getRegion($stateParams.regionId);
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/regions/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/regions/index.js b/traffic_portal/app/src/modules/private/admin/regions/index.js
new file mode 100644
index 0000000..7d5f5cb
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/regions/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.admin.regions', [])
+    .controller('RegionsController', require('./RegionsController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.regions', {
+                url: '/regions',
+                abstract: true,
+                views: {
+                    adminContent: {
+                        templateUrl: 'modules/private/admin/regions/regions.tpl.html',
+                        controller: 'RegionsController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/regions/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/regions/list/index.js b/traffic_portal/app/src/modules/private/admin/regions/list/index.js
new file mode 100644
index 0000000..573a6b8
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/regions/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.regions.list', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.regions.list', {
+                url: '',
+                views: {
+                    regionsContent: {
+                        templateUrl: 'common/modules/table/regions/table.regions.tpl.html',
+                        controller: 'TableRegionsController',
+                        resolve: {
+                            regions: function(regionService) {
+                                return regionService.getRegions();
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/regions/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/regions/new/index.js b/traffic_portal/app/src/modules/private/admin/regions/new/index.js
new file mode 100644
index 0000000..180e559
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/regions/new/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.regions.new', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.regions.new', {
+                url: '/new',
+                views: {
+                    regionsContent: {
+                        templateUrl: 'common/modules/form/region/form.region.tpl.html',
+                        controller: 'FormNewRegionController',
+                        resolve: {
+                            region: function() {
+                                return {};
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/regions/physLocations/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/regions/physLocations/index.js b/traffic_portal/app/src/modules/private/admin/regions/physLocations/index.js
new file mode 100644
index 0000000..f691704
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/regions/physLocations/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.regions.physLocations', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.regions.physLocations', {
+				url: '/{regionId}/phys-locations',
+				views: {
+					regionsContent: {
+						templateUrl: 'common/modules/table/regionPhysLocations/table.regionPhysLocations.tpl.html',
+						controller: 'TableRegionPhysLocationsController',
+						resolve: {
+							region: function($stateParams, regionService) {
+								return regionService.getRegion($stateParams.regionId);
+							},
+							physLocations: function($stateParams, physLocationService) {
+								return physLocationService.getPhysLocations({ region: $stateParams.regionId });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/regions/regions.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/regions/regions.tpl.html b/traffic_portal/app/src/modules/private/admin/regions/regions.tpl.html
new file mode 100644
index 0000000..f9af711
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/regions/regions.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="regionsContainer">
+    <div ui-view="regionsContent"></div>
+</div>

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/statuses/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/statuses/edit/index.js b/traffic_portal/app/src/modules/private/admin/statuses/edit/index.js
new file mode 100644
index 0000000..6b48f0c
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/statuses/edit/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.statuses.edit', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.statuses.edit', {
+                url: '/{statusId:[0-9]{1,8}}',
+                views: {
+                    statusesContent: {
+                        templateUrl: 'common/modules/form/status/form.status.tpl.html',
+                        controller: 'FormEditStatusController',
+                        resolve: {
+                            status: function($stateParams, statusService) {
+                                return statusService.getStatus($stateParams.statusId);
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/statuses/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/statuses/index.js b/traffic_portal/app/src/modules/private/admin/statuses/index.js
new file mode 100644
index 0000000..9e93c29
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/statuses/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.admin.statuses', [])
+    .controller('StatusesController', require('./StatusesController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.statuses', {
+                url: '/statuses',
+                abstract: true,
+                views: {
+                    adminContent: {
+                        templateUrl: 'modules/private/admin/statuses/statuses.tpl.html',
+                        controller: 'StatusesController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/statuses/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/statuses/list/index.js b/traffic_portal/app/src/modules/private/admin/statuses/list/index.js
new file mode 100644
index 0000000..f620372
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/statuses/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.statuses.list', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.statuses.list', {
+                url: '',
+                views: {
+                    statusesContent: {
+                        templateUrl: 'common/modules/table/statuses/table.statuses.tpl.html',
+                        controller: 'TableStatusesController',
+                        resolve: {
+                            statuses: function(statusService) {
+                                return statusService.getStatuses();
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/statuses/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/statuses/new/index.js b/traffic_portal/app/src/modules/private/admin/statuses/new/index.js
new file mode 100644
index 0000000..e82e9cc
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/statuses/new/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.statuses.new', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.statuses.new', {
+                url: '/new',
+                views: {
+                    statusesContent: {
+                        templateUrl: 'common/modules/form/status/form.status.tpl.html',
+                        controller: 'FormNewStatusController',
+                        resolve: {
+                            status: function() {
+                                return {};
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/statuses/servers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/statuses/servers/index.js b/traffic_portal/app/src/modules/private/admin/statuses/servers/index.js
new file mode 100644
index 0000000..dbf01be
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/statuses/servers/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.statuses.servers', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.statuses.servers', {
+				url: '/{statusId}/servers',
+				views: {
+					statusesContent: {
+						templateUrl: 'common/modules/table/statusServers/table.statusServers.tpl.html',
+						controller: 'TableStatusServersController',
+						resolve: {
+							status: function($stateParams, statusService) {
+								return statusService.getStatus($stateParams.statusId);
+							},
+							servers: function(status, serverService) {
+								return serverService.getServers({ status: status.name });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/statuses/statuses.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/statuses/statuses.tpl.html b/traffic_portal/app/src/modules/private/admin/statuses/statuses.tpl.html
new file mode 100644
index 0000000..fff7089
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/statuses/statuses.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="statusesContainer">
+    <div ui-view="statusesContent"></div>
+</div>

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/tenants/_tenants.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/tenants/_tenants.scss b/traffic_portal/app/src/modules/private/admin/tenants/_tenants.scss
new file mode 100644
index 0000000..d57b9c6
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/tenants/_tenants.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/admin/tenants/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/tenants/edit/index.js b/traffic_portal/app/src/modules/private/admin/tenants/edit/index.js
new file mode 100644
index 0000000..f066098
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/tenants/edit/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.tenants.edit', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.tenants.edit', {
+                url: '/{tenantId:[0-9]{1,8}}',
+                views: {
+                    tenantsContent: {
+                        templateUrl: 'common/modules/form/tenant/form.tenant.tpl.html',
+                        controller: 'FormEditTenantController',
+                        resolve: {
+                            tenant: function($stateParams, tenantService) {
+                                return tenantService.getTenant($stateParams.tenantId);
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/tenants/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/tenants/index.js b/traffic_portal/app/src/modules/private/admin/tenants/index.js
new file mode 100644
index 0000000..276d05a
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/tenants/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.admin.tenants', [])
+    .controller('TenantsController', require('./TenantsController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.tenants', {
+                url: '/tenants',
+                abstract: true,
+                views: {
+                    adminContent: {
+                        templateUrl: 'modules/private/admin/tenants/tenants.tpl.html',
+                        controller: 'TenantsController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/tenants/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/tenants/list/index.js b/traffic_portal/app/src/modules/private/admin/tenants/list/index.js
new file mode 100644
index 0000000..f297749
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/tenants/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.tenants.list', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.tenants.list', {
+                url: '',
+                views: {
+                    tenantsContent: {
+                        templateUrl: 'common/modules/table/tenants/table.tenants.tpl.html',
+                        controller: 'TableTenantsController',
+                        resolve: {
+                            tenants: function(tenantService) {
+                                return tenantService.getTenants();
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/tenants/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/tenants/new/index.js b/traffic_portal/app/src/modules/private/admin/tenants/new/index.js
new file mode 100644
index 0000000..bf76495
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/tenants/new/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.tenants.new', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.tenants.new', {
+                url: '/new',
+                views: {
+                    tenantsContent: {
+                        templateUrl: 'common/modules/form/tenant/form.tenant.tpl.html',
+                        controller: 'FormNewTenantController',
+                        resolve: {
+                            tenant: function() {
+                                return {};
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/tenants/tenants.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/tenants/tenants.tpl.html b/traffic_portal/app/src/modules/private/admin/tenants/tenants.tpl.html
new file mode 100644
index 0000000..54556c3
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/tenants/tenants.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="tenantsContainer">
+    <div ui-view="tenantsContent"></div>
+</div>

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/types/cacheGroups/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/types/cacheGroups/index.js b/traffic_portal/app/src/modules/private/admin/types/cacheGroups/index.js
new file mode 100644
index 0000000..161ba4f
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/types/cacheGroups/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.types.cacheGroups', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.types.cacheGroups', {
+				url: '/{typeId}/cache-groups',
+				views: {
+					typesContent: {
+						templateUrl: 'common/modules/table/typeCacheGroups/table.typeCacheGroups.tpl.html',
+						controller: 'TableTypeCacheGroupsController',
+						resolve: {
+							type: function($stateParams, typeService) {
+								return typeService.getType($stateParams.typeId);
+							},
+							cacheGroups: function($stateParams, cacheGroupService) {
+								return cacheGroupService.getCacheGroups({ type: $stateParams.typeId });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/types/deliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/types/deliveryServices/index.js b/traffic_portal/app/src/modules/private/admin/types/deliveryServices/index.js
new file mode 100644
index 0000000..d713b88
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/types/deliveryServices/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.types.deliveryServices', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.types.deliveryServices', {
+				url: '/{typeId}/delivery-services',
+				views: {
+					typesContent: {
+						templateUrl: 'common/modules/table/typeDeliveryServices/table.typeDeliveryServices.tpl.html',
+						controller: 'TableTypeDeliveryServicesController',
+						resolve: {
+							type: function($stateParams, typeService) {
+								return typeService.getType($stateParams.typeId);
+							},
+							deliveryServices: function($stateParams, deliveryServiceService) {
+								return deliveryServiceService.getDeliveryServices({ type: $stateParams.typeId });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/types/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/types/edit/index.js b/traffic_portal/app/src/modules/private/admin/types/edit/index.js
new file mode 100644
index 0000000..e65ef2d
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/types/edit/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.types.edit', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.types.edit', {
+                url: '/{typeId:[0-9]{1,8}}',
+                views: {
+                    typesContent: {
+                        templateUrl: 'common/modules/form/type/form.type.tpl.html',
+                        controller: 'FormEditTypeController',
+                        resolve: {
+                            type: function($stateParams, typeService) {
+                                return typeService.getType($stateParams.typeId);
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/types/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/types/index.js b/traffic_portal/app/src/modules/private/admin/types/index.js
new file mode 100644
index 0000000..4cc63c1
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/types/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.admin.types', [])
+    .controller('TypesController', require('./TypesController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.types', {
+                url: '/types',
+                abstract: true,
+                views: {
+                    adminContent: {
+                        templateUrl: 'modules/private/admin/types/types.tpl.html',
+                        controller: 'TypesController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/types/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/types/list/index.js b/traffic_portal/app/src/modules/private/admin/types/list/index.js
new file mode 100644
index 0000000..2426e7e
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/types/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.types.list', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.types.list', {
+                url: '',
+                views: {
+                    typesContent: {
+                        templateUrl: 'common/modules/table/types/table.types.tpl.html',
+                        controller: 'TableTypesController',
+                        resolve: {
+                            types: function(typeService) {
+                                return typeService.getTypes();
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/types/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/types/new/index.js b/traffic_portal/app/src/modules/private/admin/types/new/index.js
new file mode 100644
index 0000000..1055512
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/types/new/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.types.new', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.types.new', {
+                url: '/new',
+                views: {
+                    typesContent: {
+                        templateUrl: 'common/modules/form/type/form.type.tpl.html',
+                        controller: 'FormNewTypeController',
+                        resolve: {
+                            type: function() {
+                                return {};
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/js/jquery.dataTables.min.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/js/jquery.dataTables.min.js b/traffic_ops/experimental/ui/app/src/assets/js/jquery.dataTables.min.js
deleted file mode 100644
index e28e037..0000000
--- a/traffic_ops/experimental/ui/app/src/assets/js/jquery.dataTables.min.js
+++ /dev/null
@@ -1,166 +0,0 @@
-/*!
- DataTables 1.10.11
- ©2008-2015 SpryMedia Ltd - datatables.net/license
-*/
-(function(h){"function"===typeof define&&define.amd?define(["jquery"],function(D){return h(D,window,document)}):"object"===typeof exports?module.exports=function(D,I){D||(D=window);I||(I="undefined"!==typeof window?require("jquery"):require("jquery")(D));return h(I,D,D.document)}:h(jQuery,window,document)})(function(h,D,I,k){function Y(a){var b,c,d={};h.each(a,function(e){if((b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=e.replace(b[0],b[2].toLowerCase()),
-d[c]=e,"o"===b[1]&&Y(a[e])});a._hungarianMap=d}function K(a,b,c){a._hungarianMap||Y(a);var d;h.each(b,function(e){d=a._hungarianMap[e];if(d!==k&&(c||b[d]===k))"o"===d.charAt(0)?(b[d]||(b[d]={}),h.extend(!0,b[d],b[e]),K(a[d],b[d],c)):b[d]=b[e]})}function Fa(a){var b=m.defaults.oLanguage,c=a.sZeroRecords;!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&E(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&E(a,a,"sZeroRecords","sLoadingRecords");
-a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&db(a)}function eb(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate");A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":"");"boolean"===typeof a.scrollX&&(a.scrollX=
-a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&K(m.models.oSearch,a[b])}function fb(a){A(a,"orderable","bSortable");A(a,"orderData","aDataSort");A(a,"orderSequence","asSorting");A(a,"orderDataType","sortDataType");var b=a.aDataSort;b&&!h.isArray(b)&&(a.aDataSort=[b])}function gb(a){if(!m.__browser){var b={};m.__browser=b;var c=h("<div/>").css({position:"fixed",top:0,left:0,height:1,width:1,overflow:"hidden"}).append(h("<div/>").css({position:"absolute",top:1,left:1,
-width:100,overflow:"scroll"}).append(h("<div/>").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}h.extend(a.oBrowser,m.__browser);a.oScroll.iBarWidth=m.__browser.barWidth}function hb(a,b,c,d,e,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;d!==e;)a.hasOwnProperty(d)&&
-(g=j?b(g,a[d],d,a):a[d],j=!0,d+=f);return g}function Ga(a,b){var c=m.defaults.column,d=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:I.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},m.models.oSearch,c[d]);ja(a,d,h(b).data())}function ja(a,b,c){var b=a.aoColumns[b],d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var f=
-(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(fb(c),K(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),h.extend(b,c),E(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),E(b,c,"aDataSort"));var g=b.mData,j=Q(g),i=b.mRender?Q(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&&
-(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(a,b,c){var d=j(a,b,k,c);return i&&b?i(d,b,a,c):d};b.fnSetData=function(a,b,c){return R(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):
-!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function U(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ha(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&ka(a);u(a,null,"column-sizing",[a])}function Z(a,b){var c=la(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function $(a,b){var c=la(a,"bVisible"),c=h.inArray(b,c);return-1!==c?c:null}
-function aa(a){return h(F(a.aoColumns,"nTh")).filter(":visible").length}function la(a,b){var c=[];h.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Ia(a){var b=a.aoColumns,c=a.aoData,d=m.ext.type.detect,e,f,g,j,i,h,l,q,t;e=0;for(f=b.length;e<f;e++)if(l=b[e],t=[],!l.sType&&l._sManualType)l.sType=l._sManualType;else if(!l.sType){g=0;for(j=d.length;g<j;g++){i=0;for(h=c.length;i<h;i++){t[i]===k&&(t[i]=B(a,i,e,"type"));q=d[g](t[i],a);if(!q&&g!==d.length-1)break;if("html"===q)break}if(q){l.sType=
-q;break}}l.sType||(l.sType="string")}}function ib(a,b,c,d){var e,f,g,j,i,n,l=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){n=b[e];var q=n.targets!==k?n.targets:n.aTargets;h.isArray(q)||(q=[q]);f=0;for(g=q.length;f<g;f++)if("number"===typeof q[f]&&0<=q[f]){for(;l.length<=q[f];)Ga(a);d(q[f],n)}else if("number"===typeof q[f]&&0>q[f])d(l.length+q[f],n);else if("string"===typeof q[f]){j=0;for(i=l.length;j<i;j++)("_all"==q[f]||h(l[j].nTh).hasClass(q[f]))&&d(j,n)}}if(c){e=0;for(a=c.length;e<a;e++)d(e,c[e])}}
-function N(a,b,c,d){var e=a.aoData.length,f=h.extend(!0,{},m.models.oRow,{src:c?"dom":"data",idx:e});f._aData=b;a.aoData.push(f);for(var g=a.aoColumns,j=0,i=g.length;j<i;j++)g[j].sType=null;a.aiDisplayMaster.push(e);b=a.rowIdFn(b);b!==k&&(a.aIds[b]=f);(c||!a.oFeatures.bDeferRender)&&Ja(a,e,c,d);return e}function ma(a,b){var c;b instanceof h||(b=h(b));return b.map(function(b,e){c=Ka(a,e);return N(a,c.data,e,c.cells)})}function B(a,b,c,d){var e=a.iDraw,f=a.aoColumns[c],g=a.aoData[b]._aData,j=f.sDefaultContent,
-i=f.fnGetData(g,d,{settings:a,row:b,col:c});if(i===k)return a.iDrawError!=e&&null===j&&(L(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b+", column "+c,4),a.iDrawError=e),j;if((i===g||null===i)&&null!==j&&d!==k)i=j;else if("function"===typeof i)return i.call(g);return null===i&&"display"==d?"":i}function jb(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d,{settings:a,row:b,col:c})}function La(a){return h.map(a.match(/(\\.|[^\.])+/g)||
-[""],function(a){return a.replace(/\\./g,".")})}function Q(a){if(h.isPlainObject(a)){var b={};h.each(a,function(a,c){c&&(b[a]=Q(c))});return function(a,c,f,g){var j=b[c]||b._;return j!==k?j(a,c,f,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,f,g){return a(b,c,f,g)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,b,f){var g,j;if(""!==f){j=La(f);for(var i=0,n=j.length;i<n;i++){f=j[i].match(ba);g=
-j[i].match(V);if(f){j[i]=j[i].replace(ba,"");""!==j[i]&&(a=a[j[i]]);g=[];j.splice(0,i+1);j=j.join(".");if(h.isArray(a)){i=0;for(n=a.length;i<n;i++)g.push(c(a[i],b,j))}a=f[0].substring(1,f[0].length-1);a=""===a?g:g.join(a);break}else if(g){j[i]=j[i].replace(V,"");a=a[j[i]]();continue}if(null===a||a[j[i]]===k)return k;a=a[j[i]]}}return a};return function(b,e){return c(b,e,a)}}return function(b){return b[a]}}function R(a){if(h.isPlainObject(a))return R(a._);if(null===a)return function(){};if("function"===
-typeof a)return function(b,d,e){a(b,"set",d,e)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,d,e){var e=La(e),f;f=e[e.length-1];for(var g,j,i=0,n=e.length-1;i<n;i++){g=e[i].match(ba);j=e[i].match(V);if(g){e[i]=e[i].replace(ba,"");a[e[i]]=[];f=e.slice();f.splice(0,i+1);g=f.join(".");if(h.isArray(d)){j=0;for(n=d.length;j<n;j++)f={},b(f,d[j],g),a[e[i]].push(f)}else a[e[i]]=d;return}j&&(e[i]=e[i].replace(V,""),a=a[e[i]](d));if(null===a[e[i]]||
-a[e[i]]===k)a[e[i]]={};a=a[e[i]]}if(f.match(V))a[f.replace(V,"")](d);else a[f.replace(ba,"")]=d};return function(c,d){return b(c,d,a)}}return function(b,d){b[a]=d}}function Ma(a){return F(a.aoData,"_aData")}function na(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0;a.aIds={}}function oa(a,b,c){for(var d=-1,e=0,f=a.length;e<f;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===k&&a.splice(d,1)}function ca(a,b,c,d){var e=a.aoData[b],f,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);
-c.innerHTML=B(a,b,d,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData=Ka(a,e,d,d===k?k:e._aData).data;else{var j=e.anCells;if(j)if(d!==k)g(j[d],d);else{c=0;for(f=j.length;c<f;c++)g(j[c],c)}}e._aSortData=null;e._aFilterData=null;g=a.aoColumns;if(d!==k)g[d].sType=null;else{c=0;for(f=g.length;c<f;c++)g[c].sType=null;Na(a,e)}}function Ka(a,b,c,d){var e=[],f=b.firstChild,g,j,i=0,n,l=a.aoColumns,q=a._rowReadObject,d=d!==k?d:q?{}:[],t=function(a,b){if("string"===typeof a){var c=a.indexOf("@");
--1!==c&&(c=a.substring(c+1),R(a)(d,b.getAttribute(c)))}},S=function(a){if(c===k||c===i)j=l[i],n=h.trim(a.innerHTML),j&&j._bAttrSrc?(R(j.mData._)(d,n),t(j.mData.sort,a),t(j.mData.type,a),t(j.mData.filter,a)):q?(j._setter||(j._setter=R(j.mData)),j._setter(d,n)):d[i]=n;i++};if(f)for(;f;){g=f.nodeName.toUpperCase();if("TD"==g||"TH"==g)S(f),e.push(f);f=f.nextSibling}else{e=b.anCells;f=0;for(g=e.length;f<g;f++)S(e[f])}if(b=b.firstChild?b:b.nTr)(b=b.getAttribute("id"))&&R(a.rowId)(d,b);return{data:d,cells:e}}
-function Ja(a,b,c,d){var e=a.aoData[b],f=e._aData,g=[],j,i,n,l,q;if(null===e.nTr){j=c||I.createElement("tr");e.nTr=j;e.anCells=g;j._DT_RowIndex=b;Na(a,e);l=0;for(q=a.aoColumns.length;l<q;l++){n=a.aoColumns[l];i=c?d[l]:I.createElement(n.sCellType);i._DT_CellIndex={row:b,column:l};g.push(i);if((!c||n.mRender||n.mData!==l)&&(!h.isPlainObject(n.mData)||n.mData._!==l+".display"))i.innerHTML=B(a,b,l,"display");n.sClass&&(i.className+=" "+n.sClass);n.bVisible&&!c?j.appendChild(i):!n.bVisible&&c&&i.parentNode.removeChild(i);
-n.fnCreatedCell&&n.fnCreatedCell.call(a.oInstance,i,B(a,b,l),f,b,l)}u(a,"aoRowCreatedCallback",null,[j,f,b])}e.nTr.setAttribute("role","row")}function Na(a,b){var c=b.nTr,d=b._aData;if(c){var e=a.rowIdFn(d);e&&(c.id=e);d.DT_RowClass&&(e=d.DT_RowClass.split(" "),b.__rowc=b.__rowc?pa(b.__rowc.concat(e)):e,h(c).removeClass(b.__rowc.join(" ")).addClass(d.DT_RowClass));d.DT_RowAttr&&h(c).attr(d.DT_RowAttr);d.DT_RowData&&h(c).data(d.DT_RowData)}}function kb(a){var b,c,d,e,f,g=a.nTHead,j=a.nTFoot,i=0===
-h("th, td",g).length,n=a.oClasses,l=a.aoColumns;i&&(e=h("<tr/>").appendTo(g));b=0;for(c=l.length;b<c;b++)f=l[b],d=h(f.nTh).addClass(f.sClass),i&&d.appendTo(e),a.oFeatures.bSort&&(d.addClass(f.sSortingClass),!1!==f.bSortable&&(d.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),Oa(a,f.nTh,b))),f.sTitle!=d[0].innerHTML&&d.html(f.sTitle),Pa(a,"header")(a,d,f,n);i&&da(a.aoHeader,g);h(g).find(">tr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(n.sHeaderTH);h(j).find(">tr>th, >tr>td").addClass(n.sFooterTH);
-if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=l[b],f.nTf=a[b].cell,f.sClass&&h(f.nTf).addClass(f.sClass)}}function ea(a,b,c){var d,e,f,g=[],j=[],i=a.aoColumns.length,n;if(b){c===k&&(c=!1);d=0;for(e=b.length;d<e;d++){g[d]=b[d].slice();g[d].nTr=b[d].nTr;for(f=i-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&g[d].splice(f,1);j.push([])}d=0;for(e=g.length;d<e;d++){if(a=g[d].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[d].length;f<b;f++)if(n=i=1,j[d][f]===k){a.appendChild(g[d][f].cell);
-for(j[d][f]=1;g[d+i]!==k&&g[d][f].cell==g[d+i][f].cell;)j[d+i][f]=1,i++;for(;g[d][f+n]!==k&&g[d][f].cell==g[d][f+n].cell;){for(c=0;c<i;c++)j[d+c][f+n]=1;n++}h(g[d][f].cell).attr("rowspan",i).attr("colspan",n)}}}}function O(a){var b=u(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==h.inArray(!1,b))C(a,!1);else{var b=[],c=0,d=a.asStripeClasses,e=d.length,f=a.oLanguage,g=a.iInitDisplayStart,j="ssp"==y(a),i=a.aiDisplay;a.bDrawing=!0;g!==k&&-1!==g&&(a._iDisplayStart=j?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=
--1);var g=a._iDisplayStart,n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&!lb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:n;for(j=j?0:g;j<f;j++){var l=i[j],q=a.aoData[l];null===q.nTr&&Ja(a,l);l=q.nTr;if(0!==e){var t=d[c%e];q._sRowStripe!=t&&(h(l).removeClass(q._sRowStripe).addClass(t),q._sRowStripe=t)}u(a,"aoRowCallback",null,[l,q._aData,c,j]);b.push(l);c++}}else c=f.sZeroRecords,1==a.iDraw&&"ajax"==y(a)?c=f.sLoadingRecords:
-f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=h("<tr/>",{"class":e?d[0]:""}).append(h("<td />",{valign:"top",colSpan:aa(a),"class":a.oClasses.sRowEmpty}).html(c))[0];u(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ma(a),g,n,i]);u(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],Ma(a),g,n,i]);d=h(a.nTBody);d.children().detach();d.append(h(b));u(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function T(a,b){var c=a.oFeatures,d=c.bFilter;
-c.bSort&&mb(a);d?fa(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;O(a);a._drawHold=!1}function nb(a){var b=a.oClasses,c=h(a.nTable),c=h("<div/>").insertBefore(c),d=a.oFeatures,e=h("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,n,l,q,t=0;t<f.length;t++){g=null;j=f[t];if("<"==j){i=h("<div/>")[0];
-n=f[t+1];if("'"==n||'"'==n){l="";for(q=2;f[t+q]!=n;)l+=f[t+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(n=l.split("."),i.id=n[0].substr(1,n[0].length-1),i.className=n[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;t+=q}e.append(i);e=h(i)}else if(">"==j)e=e.parent();else if("l"==j&&d.bPaginate&&d.bLengthChange)g=ob(a);else if("f"==j&&d.bFilter)g=pb(a);else if("r"==j&&d.bProcessing)g=qb(a);else if("t"==j)g=rb(a);else if("i"==j&&d.bInfo)g=sb(a);else if("p"==
-j&&d.bPaginate)g=tb(a);else if(0!==m.ext.feature.length){i=m.ext.feature;q=0;for(n=i.length;q<n;q++)if(j==i[q].cFeature){g=i[q].fnInit(a);break}}g&&(i=a.aanFeatures,i[j]||(i[j]=[]),i[j].push(g),e.append(g))}c.replaceWith(e);a.nHolding=null}function da(a,b){var c=h(b).children("tr"),d,e,f,g,j,i,n,l,q,t;a.splice(0,a.length);f=0;for(i=c.length;f<i;f++)a.push([]);f=0;for(i=c.length;f<i;f++){d=c[f];for(e=d.firstChild;e;){if("TD"==e.nodeName.toUpperCase()||"TH"==e.nodeName.toUpperCase()){l=1*e.getAttribute("colspan");
-q=1*e.getAttribute("rowspan");l=!l||0===l||1===l?1:l;q=!q||0===q||1===q?1:q;g=0;for(j=a[f];j[g];)g++;n=g;t=1===l?!0:!1;for(j=0;j<l;j++)for(g=0;g<q;g++)a[f+g][n+j]={cell:e,unique:t},a[f+g].nTr=d}e=e.nextSibling}}}function qa(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],da(c,b)));for(var b=0,e=c.length;b<e;b++)for(var f=0,g=c[b].length;f<g;f++)if(c[b][f].unique&&(!d[f]||!a.bSortCellsTop))d[f]=c[b][f].cell;return d}function ra(a,b,c){u(a,"aoServerParams","serverParams",[b]);if(b&&h.isArray(b)){var d={},
-e=/(.*?)\[\]$/;h.each(b,function(a,b){var c=b.name.match(e);c?(c=c[0],d[c]||(d[c]=[]),d[c].push(b.value)):d[b.name]=b.value});b=d}var f,g=a.ajax,j=a.oInstance,i=function(b){u(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(h.isPlainObject(g)&&g.data){f=g.data;var n=h.isFunction(f)?f(b,a):f,b=h.isFunction(f)&&n?n:h.extend(!0,b,n);delete g.data}n={data:b,success:function(b){var c=b.error||b.sError;c&&L(a,0,c);a.json=b;i(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c){var d=u(a,null,"xhr",
-[a,null,a.jqXHR]);-1===h.inArray(!0,d)&&("parsererror"==c?L(a,0,"Invalid JSON response",1):4===b.readyState&&L(a,0,"Ajax error",7));C(a,!1)}};a.oAjaxData=b;u(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(j,a.sAjaxSource,h.map(b,function(a,b){return{name:b,value:a}}),i,a):a.sAjaxSource||"string"===typeof g?a.jqXHR=h.ajax(h.extend(n,{url:g||a.sAjaxSource})):h.isFunction(g)?a.jqXHR=g.call(j,b,i,a):(a.jqXHR=h.ajax(h.extend(n,g)),g.data=f)}function lb(a){return a.bAjaxDataGet?(a.iDraw++,C(a,
-!0),ra(a,ub(a),function(b){vb(a,b)}),!1):!0}function ub(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,f=a.aoPreSearchCols,g,j=[],i,n,l,q=W(a);g=a._iDisplayStart;i=!1!==d.bPaginate?a._iDisplayLength:-1;var k=function(a,b){j.push({name:a,value:b})};k("sEcho",a.iDraw);k("iColumns",c);k("sColumns",F(b,"sName").join(","));k("iDisplayStart",g);k("iDisplayLength",i);var S={draw:a.iDraw,columns:[],order:[],start:g,length:i,search:{value:e.sSearch,regex:e.bRegex}};for(g=0;g<c;g++)n=b[g],
-l=f[g],i="function"==typeof n.mData?"function":n.mData,S.columns.push({data:i,name:n.sName,searchable:n.bSearchable,orderable:n.bSortable,search:{value:l.sSearch,regex:l.bRegex}}),k("mDataProp_"+g,i),d.bFilter&&(k("sSearch_"+g,l.sSearch),k("bRegex_"+g,l.bRegex),k("bSearchable_"+g,n.bSearchable)),d.bSort&&k("bSortable_"+g,n.bSortable);d.bFilter&&(k("sSearch",e.sSearch),k("bRegex",e.bRegex));d.bSort&&(h.each(q,function(a,b){S.order.push({column:b.col,dir:b.dir});k("iSortCol_"+a,b.col);k("sSortDir_"+
-a,b.dir)}),k("iSortingCols",q.length));b=m.ext.legacy.ajax;return null===b?a.sAjaxSource?j:S:b?j:S}function vb(a,b){var c=sa(a,b),d=b.sEcho!==k?b.sEcho:b.draw,e=b.iTotalRecords!==k?b.iTotalRecords:b.recordsTotal,f=b.iTotalDisplayRecords!==k?b.iTotalDisplayRecords:b.recordsFiltered;if(d){if(1*d<a.iDraw)return;a.iDraw=1*d}na(a);a._iRecordsTotal=parseInt(e,10);a._iRecordsDisplay=parseInt(f,10);d=0;for(e=c.length;d<e;d++)N(a,c[d]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;O(a);a._bInitComplete||
-ta(a,b);a.bAjaxDataGet=!0;C(a,!1)}function sa(a,b){var c=h.isPlainObject(a.ajax)&&a.ajax.dataSrc!==k?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===c?b.aaData||b[c]:""!==c?Q(c)(b):b}function pb(a){var b=a.oClasses,c=a.sTableId,d=a.oLanguage,e=a.oPreviousSearch,f=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',j=d.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",g):j+g,b=h("<div/>",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("<label/>").append(j)),f=function(){var b=!this.value?
-"":this.value;b!=e.sSearch&&(fa(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,O(a))},g=null!==a.searchDelay?a.searchDelay:"ssp"===y(a)?400:0,i=h("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).bind("keyup.DT search.DT input.DT paste.DT cut.DT",g?ua(f,g):f).bind("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);h(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{i[0]!==I.activeElement&&i.val(e.sSearch)}catch(d){}});
-return b[0]}function fa(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive};Ia(a);if("ssp"!=y(a)){wb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<e.length;b++)xb(a,e[b].sSearch,b,e[b].bEscapeRegex!==k?!e[b].bEscapeRegex:e[b].bRegex,e[b].bSmart,e[b].bCaseInsensitive);yb(a)}else f(b);a.bFiltered=!0;u(a,null,"search",[a])}function yb(a){for(var b=
-m.ext.search,c=a.aiDisplay,d,e,f=0,g=b.length;f<g;f++){for(var j=[],i=0,n=c.length;i<n;i++)e=c[i],d=a.aoData[e],b[f](a,d._aFilterData,e,d._aData,i)&&j.push(e);c.length=0;h.merge(c,j)}}function xb(a,b,c,d,e,f){if(""!==b)for(var g=a.aiDisplay,d=Qa(b,d,e,f),e=g.length-1;0<=e;e--)b=a.aoData[g[e]]._aFilterData[c],d.test(b)||g.splice(e,1)}function wb(a,b,c,d,e,f){var d=Qa(b,d,e,f),e=a.oPreviousSearch.sSearch,f=a.aiDisplayMaster,g;0!==m.ext.search.length&&(c=!0);g=zb(a);if(0>=b.length)a.aiDisplay=f.slice();
-else{if(g||c||e.length>b.length||0!==b.indexOf(e)||a.bSorted)a.aiDisplay=f.slice();b=a.aiDisplay;for(c=b.length-1;0<=c;c--)d.test(a.aoData[b[c]]._sFilterRow)||b.splice(c,1)}}function Qa(a,b,c,d){a=b?a:va(a);c&&(a="^(?=.*?"+h.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0))var b=a.match(/^"(.*)"$/),a=b?b[1]:a;return a.replace('"',"")}).join(")(?=.*?")+").*$");return RegExp(a,d?"i":"")}function va(a){return a.replace(Zb,"\\$1")}function zb(a){var b=a.aoColumns,c,d,e,f,g,j,i,h,l=
-m.ext.type.search;c=!1;d=0;for(f=a.aoData.length;d<f;d++)if(h=a.aoData[d],!h._aFilterData){j=[];e=0;for(g=b.length;e<g;e++)c=b[e],c.bSearchable?(i=B(a,d,e,"filter"),l[c.sType]&&(i=l[c.sType](i)),null===i&&(i=""),"string"!==typeof i&&i.toString&&(i=i.toString())):i="",i.indexOf&&-1!==i.indexOf("&")&&(wa.innerHTML=i,i=$b?wa.textContent:wa.innerText),i.replace&&(i=i.replace(/[\r\n]/g,"")),j.push(i);h._aFilterData=j;h._sFilterRow=j.join("  ");c=!0}return c}function Ab(a){return{search:a.sSearch,smart:a.bSmart,
-regex:a.bRegex,caseInsensitive:a.bCaseInsensitive}}function Bb(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function sb(a){var b=a.sTableId,c=a.aanFeatures.i,d=h("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Cb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Cb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,
-d=a._iDisplayStart+1,e=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&&(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Db(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,d,e,f,g,j));h(b).html(j)}}function Db(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,
-c.call(a,f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/e)))}function ga(a){var b,c,d=a.iInitDisplayStart,e=a.aoColumns,f;c=a.oFeatures;var g=a.bDeferLoading;if(a.bInitialised){nb(a);kb(a);ea(a,a.aoHeader);ea(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Ha(a);b=0;for(c=e.length;b<c;b++)f=e[b],f.sWidth&&(f.nTh.style.width=x(f.sWidth));u(a,null,"preInit",[a]);T(a);e=y(a);if("ssp"!=e||g)"ajax"==e?ra(a,[],function(c){var f=sa(a,c);for(b=0;b<f.length;b++)N(a,f[b]);
-a.iInitDisplayStart=d;T(a);C(a,!1);ta(a,c)},a):(C(a,!1),ta(a))}else setTimeout(function(){ga(a)},200)}function ta(a,b){a._bInitComplete=!0;(b||a.oInit.aaData)&&U(a);u(a,null,"plugin-init",[a,b]);u(a,"aoInitComplete","init",[a,b])}function Ra(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Sa(a);u(a,null,"length",[a,c])}function ob(a){for(var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=h.isArray(d[0]),f=e?d[0]:d,d=e?d[1]:d,e=h("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),
-g=0,j=f.length;g<j;g++)e[0][g]=new Option(d[g],f[g]);var i=h("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));h("select",i).val(a._iDisplayLength).bind("change.DT",function(){Ra(a,h(this).val());O(a)});h(a.nTable).bind("length.dt.DT",function(b,c,d){a===c&&h("select",i).val(d)});return i[0]}function tb(a){var b=a.sPaginationType,c=m.ext.pager[b],d="function"===typeof c,e=function(a){O(a)},
-b=h("<div/>").addClass(a.oClasses.sPaging+b)[0],f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),k,l=0;for(k=f.p.length;l<k;l++)Pa(a,"pageButton")(a,f.p[l],l,h,b,i)}else c.fnUpdate(a,e)},sName:"pagination"}));return b}function Ta(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===
-e?d=0:"number"===typeof b?(d=b*e,d>f&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e<f&&(d+=e):"last"==b?d=Math.floor((f-1)/e)*e:L(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==d;a._iDisplayStart=d;b&&(u(a,null,"page",[a]),c&&O(a));return b}function qb(a){return h("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",
-b?"block":"none");u(a,null,"processing",[a,b])}function rb(a){var b=h(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),n=h(b[0].cloneNode(!1)),l=b.children("tfoot");l.length||(l=null);i=h("<div/>",{"class":f.sScrollWrapper}).append(h("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?!d?null:x(d):"100%"}).append(h("<div/>",
-{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("<div/>",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:!d?null:x(d)}).append(b));l&&i.append(h("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:x(d):"100%"}).append(h("<div/>",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",
-0).append("bottom"===j?g:null).append(b.children("tfoot")))));var b=i.children(),k=b[0],f=b[1],t=l?b[2]:null;if(d)h(f).on("scroll.DT",function(){var a=this.scrollLeft;k.scrollLeft=a;l&&(t.scrollLeft=a)});h(f).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=k;a.nScrollBody=f;a.nScrollFoot=t;a.aoDrawCallback.push({fn:ka,sName:"scrolling"});return i[0]}function ka(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,b=b.iBarWidth,f=h(a.nScrollHead),g=f[0].style,j=f.children("div"),i=j[0].style,n=j.children("table"),
-j=a.nScrollBody,l=h(j),q=j.style,t=h(a.nScrollFoot).children("div"),m=t.children("table"),o=h(a.nTHead),G=h(a.nTable),p=G[0],r=p.style,u=a.nTFoot?h(a.nTFoot):null,Eb=a.oBrowser,Ua=Eb.bScrollOversize,s=F(a.aoColumns,"nTh"),P,v,w,y,z=[],A=[],B=[],C=[],D,E=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};v=j.scrollHeight>j.clientHeight;if(a.scrollBarVis!==v&&a.scrollBarVis!==k)a.scrollBarVis=v,U(a);else{a.scrollBarVis=v;G.children("thead, tfoot").remove();
-u&&(w=u.clone().prependTo(G),P=u.find("tr"),w=w.find("tr"));y=o.clone().prependTo(G);o=o.find("tr");v=y.find("tr");y.find("th, td").removeAttr("tabindex");c||(q.width="100%",f[0].style.width="100%");h.each(qa(a,y),function(b,c){D=Z(a,b);c.style.width=a.aoColumns[D].sWidth});u&&J(function(a){a.style.width=""},w);f=G.outerWidth();if(""===c){r.width="100%";if(Ua&&(G.find("tbody").height()>j.offsetHeight||"scroll"==l.css("overflow-y")))r.width=x(G.outerWidth()-b);f=G.outerWidth()}else""!==d&&(r.width=
-x(d),f=G.outerWidth());J(E,v);J(function(a){B.push(a.innerHTML);z.push(x(h(a).css("width")))},v);J(function(a,b){if(h.inArray(a,s)!==-1)a.style.width=z[b]},o);h(v).height(0);u&&(J(E,w),J(function(a){C.push(a.innerHTML);A.push(x(h(a).css("width")))},w),J(function(a,b){a.style.width=A[b]},P),h(w).height(0));J(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+B[b]+"</div>";a.style.width=z[b]},v);u&&J(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+
-C[b]+"</div>";a.style.width=A[b]},w);if(G.outerWidth()<f){P=j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")?f+b:f;if(Ua&&(j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")))r.width=x(P-b);(""===c||""!==d)&&L(a,1,"Possible column misalignment",6)}else P="100%";q.width=x(P);g.width=x(P);u&&(a.nScrollFoot.style.width=x(P));!e&&Ua&&(q.height=x(p.offsetHeight+b));c=G.outerWidth();n[0].style.width=x(c);i.width=x(c);d=G.height()>j.clientHeight||"scroll"==l.css("overflow-y");e="padding"+
-(Eb.bScrollbarLeft?"Left":"Right");i[e]=d?b+"px":"0px";u&&(m[0].style.width=x(c),t[0].style.width=x(c),t[0].style[e]=d?b+"px":"0px");G.children("colgroup").insertBefore(G.children("thead"));l.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)j.scrollTop=0}}function J(a,b,c){for(var d=0,e=0,f=b.length,g,j;e<f;){g=b[e].firstChild;for(j=c?c[e].firstChild:null;g;)1===g.nodeType&&(c?a(g,j,d):a(g,d),d++),g=g.nextSibling,j=c?j.nextSibling:null;e++}}function Ha(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,
-e=d.sY,f=d.sX,g=d.sXInner,j=c.length,i=la(a,"bVisible"),n=h("th",a.nTHead),l=b.getAttribute("width"),k=b.parentNode,t=!1,m,o,p=a.oBrowser,d=p.bScrollOversize;(m=b.style.width)&&-1!==m.indexOf("%")&&(l=m);for(m=0;m<i.length;m++)o=c[i[m]],null!==o.sWidth&&(o.sWidth=Fb(o.sWidthOrig,k),t=!0);if(d||!t&&!f&&!e&&j==aa(a)&&j==n.length)for(m=0;m<j;m++)i=Z(a,m),null!==i&&(c[i].sWidth=x(n.eq(m).width()));else{j=h(b).clone().css("visibility","hidden").removeAttr("id");j.find("tbody tr").remove();var r=h("<tr/>").appendTo(j.find("tbody"));
-j.find("thead, tfoot").remove();j.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone());j.find("tfoot th, tfoot td").css("width","");n=qa(a,j.find("thead")[0]);for(m=0;m<i.length;m++)o=c[i[m]],n[m].style.width=null!==o.sWidthOrig&&""!==o.sWidthOrig?x(o.sWidthOrig):"",o.sWidthOrig&&f&&h(n[m]).append(h("<div/>").css({width:o.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(m=0;m<i.length;m++)t=i[m],o=c[t],h(Gb(a,t)).clone(!1).append(o.sContentPadding).appendTo(r);h("[name]",
-j).removeAttr("name");o=h("<div/>").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(j).appendTo(k);f&&g?j.width(g):f?(j.css("width","auto"),j.removeAttr("width"),j.width()<k.clientWidth&&l&&j.width(k.clientWidth)):e?j.width(k.clientWidth):l&&j.width(l);for(m=e=0;m<i.length;m++)k=h(n[m]),g=k.outerWidth()-k.width(),k=p.bBounding?Math.ceil(n[m].getBoundingClientRect().width):k.outerWidth(),e+=k,c[i[m]].sWidth=x(k-g);b.style.width=x(e);o.remove()}l&&(b.style.width=
-x(l));if((l||f)&&!a._reszEvt)b=function(){h(D).bind("resize.DT-"+a.sInstance,ua(function(){U(a)}))},d?setTimeout(b,1E3):b(),a._reszEvt=!0}function ua(a,b){var c=b!==k?b:200,d,e;return function(){var b=this,g=+new Date,j=arguments;d&&g<d+c?(clearTimeout(e),e=setTimeout(function(){d=k;a.apply(b,j)},c)):(d=g,a.apply(b,j))}}function Fb(a,b){if(!a)return 0;var c=h("<div/>").css("width",x(a)).appendTo(b||I.body),d=c[0].offsetWidth;c.remove();return d}function Gb(a,b){var c=Hb(a,b);if(0>c)return null;var d=
-a.aoData[c];return!d.nTr?h("<td/>").html(B(a,c,b,"display"))[0]:d.anCells[b]}function Hb(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;f<g;f++)c=B(a,f,b,"display")+"",c=c.replace(ac,""),c=c.replace(/&nbsp;/g," "),c.length>d&&(d=c.length,e=f);return e}function x(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function W(a){var b,c,d=[],e=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var n=[];f=function(a){a.length&&!h.isArray(a[0])?n.push(a):h.merge(n,
-a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<n.length;a++){i=n[a][0];f=e[i].aDataSort;b=0;for(c=f.length;b<c;b++)g=f[b],j=e[g].sType||"string",n[a]._idx===k&&(n[a]._idx=h.inArray(n[a][1],e[g].asSorting)),d.push({src:i,col:g,dir:n[a][1],index:n[a]._idx,type:j,formatter:m.ext.type.order[j+"-pre"]})}return d}function mb(a){var b,c,d=[],e=m.ext.type.order,f=a.aoData,g=0,j,i=a.aiDisplayMaster,h;Ia(a);h=W(a);b=0;for(c=h.length;b<c;b++)j=h[b],j.formatter&&g++,Ib(a,
-j.col);if("ssp"!=y(a)&&0!==h.length){b=0;for(c=i.length;b<c;b++)d[i[b]]=b;g===h.length?i.sort(function(a,b){var c,e,g,j,i=h.length,k=f[a]._aSortData,m=f[b]._aSortData;for(g=0;g<i;g++)if(j=h[g],c=k[j.col],e=m[j.col],c=c<e?-1:c>e?1:0,0!==c)return"asc"===j.dir?c:-c;c=d[a];e=d[b];return c<e?-1:c>e?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,m=f[a]._aSortData,p=f[b]._aSortData;for(j=0;j<k;j++)if(i=h[j],c=m[i.col],g=p[i.col],i=e[i.type+"-"+i.dir]||e["string-"+i.dir],c=i(c,g),0!==c)return c;c=d[a];
-g=d[b];return c<g?-1:c>g?1:0})}a.bSorted=!0}function Jb(a){for(var b,c,d=a.aoColumns,e=W(a),a=a.oLanguage.oAria,f=0,g=d.length;f<g;f++){c=d[f];var j=c.asSorting;b=c.sTitle.replace(/<.*?>/g,"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0<e.length&&e[0].col==f?(i.setAttribute("aria-sort","asc"==e[0].dir?"ascending":"descending"),c=j[e[0].index+1]||j[0]):c=j[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);i.setAttribute("aria-label",b)}}function Va(a,b,c,d){var e=a.aaSorting,f=a.aoColumns[b].asSorting,
-g=function(a,b){var c=a._idx;c===k&&(c=h.inArray(a[1],f));return c+1<f.length?c+1:b?null:0};"number"===typeof e[0]&&(e=a.aaSorting=[e]);c&&a.oFeatures.bSortMulti?(c=h.inArray(b,F(e,"0")),-1!==c?(b=g(e[c],!0),null===b&&1===e.length&&(b=0),null===b?e.splice(c,1):(e[c][1]=f[b],e[c]._idx=b)):(e.push([b,f[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=g(e[0]),e.length=1,e[0][1]=f[b],e[0]._idx=b):(e.length=0,e.push([b,f[0]]),e[0]._idx=0);T(a);"function"==typeof d&&d(a)}function Oa(a,b,c,d){var e=
-a.aoColumns[c];Wa(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(C(a,!0),setTimeout(function(){Va(a,c,b.shiftKey,d);"ssp"!==y(a)&&C(a,!1)},0)):Va(a,c,b.shiftKey,d))})}function xa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,d=W(a),e=a.oFeatures,f,g;if(e.bSort&&e.bSortClasses){e=0;for(f=b.length;e<f;e++)g=b[e].src,h(F(a.aoData,"anCells",g)).removeClass(c+(2>e?e+1:3));e=0;for(f=d.length;e<f;e++)g=d[e].src,h(F(a.aoData,"anCells",g)).addClass(c+(2>e?e+1:3))}a.aLastSort=d}function Ib(a,
-b){var c=a.aoColumns[b],d=m.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,$(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j<i;j++)if(c=a.aoData[j],c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[j]:B(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function ya(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),search:Ab(a.oPreviousSearch),columns:h.map(a.aoColumns,
-function(b,d){return{visible:b.bVisible,search:Ab(a.aoPreSearchCols[d])}})};u(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,b)}}function Kb(a){var b,c,d=a.aoColumns;if(a.oFeatures.bStateSave){var e=a.fnStateLoadCallback.call(a.oInstance,a);if(e&&e.time&&(b=u(a,"aoStateLoadParams","stateLoadParams",[a,e]),-1===h.inArray(!1,b)&&(b=a.iStateDuration,!(0<b&&e.time<+new Date-1E3*b)&&d.length===e.columns.length))){a.oLoadedState=h.extend(!0,{},e);
-e.start!==k&&(a._iDisplayStart=e.start,a.iInitDisplayStart=e.start);e.length!==k&&(a._iDisplayLength=e.length);e.order!==k&&(a.aaSorting=[],h.each(e.order,function(b,c){a.aaSorting.push(c[0]>=d.length?[0,c[1]]:c)}));e.search!==k&&h.extend(a.oPreviousSearch,Bb(e.search));b=0;for(c=e.columns.length;b<c;b++){var f=e.columns[b];f.visible!==k&&(d[b].bVisible=f.visible);f.search!==k&&h.extend(a.aoPreSearchCols[b],Bb(f.search))}u(a,"aoStateLoaded","stateLoaded",[a,e])}}}function za(a){var b=m.settings,a=
-h.inArray(a,F(b,"nTable"));return-1!==a?b[a]:null}function L(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+" - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+d);if(b)D.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,a&&u(a,null,"error",[a,d,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function E(a,b,c,d){h.isArray(c)?h.each(c,function(c,d){h.isArray(d)?E(a,b,d[0],
-d[1]):E(a,b,d)}):(d===k&&(d=c),b[c]!==k&&(a[d]=b[c]))}function Lb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],h.isPlainObject(d)?(h.isPlainObject(a[e])||(a[e]={}),h.extend(!0,a[e],d)):a[e]=c&&"data"!==e&&"aaData"!==e&&h.isArray(d)?d.slice():d);return a}function Wa(a,b,c){h(a).bind("click.DT",b,function(b){a.blur();c(b)}).bind("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).bind("selectstart.DT",function(){return!1})}function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}
-function u(a,b,c,d){var e=[];b&&(e=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=h.Event(c+".dt"),h(a.nTable).trigger(b,d),e.push(b.result));return e}function Sa(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Pa(a,b){var c=a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?
-"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Aa(a,b){var c=[],c=Mb.numbers_length,d=Math.floor(c/2);b<=c?c=X(0,b):a<=d?(c=X(0,c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=X(b-(c-2),b):(c=X(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function db(a){h.each({num:function(b){return Ba(b,a)},"num-fmt":function(b){return Ba(b,a,Xa)},"html-num":function(b){return Ba(b,a,Ca)},"html-num-fmt":function(b){return Ba(b,a,Ca,Xa)}},function(b,
-c){v.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(v.type.search[b+a]=v.type.search.html)})}function Nb(a){return function(){var b=[za(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m.ext.internal[a].apply(this,b)}}var m,v,r,p,s,Ya={},Ob=/[\r\n]/g,Ca=/<.*?>/g,bc=/^[\w\+\-]/,cc=/[\w\+\-]$/,Zb=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Xa=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,M=function(a){return!a||!0===a||"-"===a?!0:!1},
-Pb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Qb=function(a,b){Ya[b]||(Ya[b]=RegExp(va(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Ya[b],"."):a},Za=function(a,b,c){var d="string"===typeof a;if(M(a))return!0;b&&d&&(a=Qb(a,b));c&&d&&(a=a.replace(Xa,""));return!isNaN(parseFloat(a))&&isFinite(a)},Rb=function(a,b,c){return M(a)?!0:!(M(a)||"string"===typeof a)?null:Za(a.replace(Ca,""),b,c)?!0:null},F=function(a,b,c){var d=[],e=0,f=a.length;if(c!==k)for(;e<
-f;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]);else for(;e<f;e++)a[e]&&d.push(a[e][b]);return d},ha=function(a,b,c,d){var e=[],f=0,g=b.length;if(d!==k)for(;f<g;f++)a[b[f]][c]&&e.push(a[b[f]][c][d]);else for(;f<g;f++)e.push(a[b[f]][c]);return e},X=function(a,b){var c=[],d;b===k?(b=0,d=a):(d=b,b=a);for(var e=b;e<d;e++)c.push(e);return c},Sb=function(a){for(var b=[],c=0,d=a.length;c<d;c++)a[c]&&b.push(a[c]);return b},pa=function(a){var b=[],c,d,e=a.length,f,g=0;d=0;a:for(;d<e;d++){c=a[d];for(f=0;f<g;f++)if(b[f]===
-c)continue a;b.push(c);g++}return b},A=function(a,b,c){a[b]!==k&&(a[c]=a[b])},ba=/\[.*?\]$/,V=/\(\)$/,wa=h("<div>")[0],$b=wa.textContent!==k,ac=/<.*?>/g;m=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new r(za(this[v.iApiIndex])):new r(this)};this.fnAddData=function(a,b){var c=this.api(!0),d=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===k||b)&&c.draw();return d.flatten().toArray()};
-this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===k||a?b.draw(!1):(""!==d.sX||""!==d.sY)&&ka(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===k||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};
-this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,d,e,h){e=this.api(!0);null===b||b===k?e.search(a,c,d,h):e.column(b).search(a,c,d,h);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=
-function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===k||c)&&a.columns.adjust().draw()};
-this.fnSettings=function(){return za(this[v.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===k||e)&&h.columns.adjust();(d===k||d)&&h.draw();return 0};this.fnVersionCheck=v.fnVersionCheck;var b=this,c=a===k,d=this.length;c&&(a={});this.oApi=this.internal=v.internal;for(var e in m.ext.internal)e&&(this[e]=
-Nb(e));this.each(function(){var e={},e=1<d?Lb(e,a,!0):a,g=0,j,i=this.getAttribute("id"),n=!1,l=m.defaults,q=h(this);if("table"!=this.nodeName.toLowerCase())L(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{eb(l);fb(l.column);K(l,l,!0);K(l.column,l.column,!0);K(l,h.extend(e,q.data()));var t=m.settings,g=0;for(j=t.length;g<j;g++){var p=t[g];if(p.nTable==this||p.nTHead.parentNode==this||p.nTFoot&&p.nTFoot.parentNode==this){g=e.bRetrieve!==k?e.bRetrieve:l.bRetrieve;if(c||g)return p.oInstance;
-if(e.bDestroy!==k?e.bDestroy:l.bDestroy){p.oInstance.fnDestroy();break}else{L(p,0,"Cannot reinitialise DataTable",3);return}}if(p.sTableId==this.id){t.splice(g,1);break}}if(null===i||""===i)this.id=i="DataTables_Table_"+m.ext._unique++;var o=h.extend(!0,{},m.models.oSettings,{sDestroyWidth:q[0].style.width,sInstance:i,sTableId:i});o.nTable=this;o.oApi=b.internal;o.oInit=e;t.push(o);o.oInstance=1===b.length?b:q.dataTable();eb(e);e.oLanguage&&Fa(e.oLanguage);e.aLengthMenu&&!e.iDisplayLength&&(e.iDisplayLength=
-h.isArray(e.aLengthMenu[0])?e.aLengthMenu[0][0]:e.aLengthMenu[0]);e=Lb(h.extend(!0,{},l),e);E(o.oFeatures,e,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));E(o,e,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback",
-"renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"],["bJQueryUI","bJUI"]]);E(o.oScroll,e,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);E(o.oLanguage,e,"fnInfoCallback");z(o,"aoDrawCallback",e.fnDrawCallback,"user");z(o,"aoServerParams",e.fnServerParams,"user");z(o,"aoStateSaveParams",e.fnStateSaveParams,"user");z(o,"aoStateLoadParams",
-e.fnStateLoadParams,"user");z(o,"aoStateLoaded",e.fnStateLoaded,"user");z(o,"aoRowCallback",e.fnRowCallback,"user");z(o,"aoRowCreatedCallback",e.fnCreatedRow,"user");z(o,"aoHeaderCallback",e.fnHeaderCallback,"user");z(o,"aoFooterCallback",e.fnFooterCallback,"user");z(o,"aoInitComplete",e.fnInitComplete,"user");z(o,"aoPreDrawCallback",e.fnPreDrawCallback,"user");o.rowIdFn=Q(e.rowId);gb(o);i=o.oClasses;e.bJQueryUI?(h.extend(i,m.ext.oJUIClasses,e.oClasses),e.sDom===l.sDom&&"lfrtip"===l.sDom&&(o.sDom=
-'<"H"lfr>t<"F"ip>'),o.renderer)?h.isPlainObject(o.renderer)&&!o.renderer.header&&(o.renderer.header="jqueryui"):o.renderer="jqueryui":h.extend(i,m.ext.classes,e.oClasses);q.addClass(i.sTable);o.iInitDisplayStart===k&&(o.iInitDisplayStart=e.iDisplayStart,o._iDisplayStart=e.iDisplayStart);null!==e.iDeferLoading&&(o.bDeferLoading=!0,g=h.isArray(e.iDeferLoading),o._iRecordsDisplay=g?e.iDeferLoading[0]:e.iDeferLoading,o._iRecordsTotal=g?e.iDeferLoading[1]:e.iDeferLoading);var r=o.oLanguage;h.extend(!0,
-r,e.oLanguage);""!==r.sUrl&&(h.ajax({dataType:"json",url:r.sUrl,success:function(a){Fa(a);K(l.oLanguage,a);h.extend(true,r,a);ga(o)},error:function(){ga(o)}}),n=!0);null===e.asStripeClasses&&(o.asStripeClasses=[i.sStripeOdd,i.sStripeEven]);var g=o.asStripeClasses,v=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(g,function(a){return v.hasClass(a)}))&&(h("tbody tr",this).removeClass(g.join(" ")),o.asDestroyStripes=g.slice());t=[];g=this.getElementsByTagName("thead");0!==g.length&&(da(o.aoHeader,
-g[0]),t=qa(o));if(null===e.aoColumns){p=[];g=0;for(j=t.length;g<j;g++)p.push(null)}else p=e.aoColumns;g=0;for(j=p.length;g<j;g++)Ga(o,t?t[g]:null);ib(o,e.aoColumnDefs,p,function(a,b){ja(o,a,b)});if(v.length){var s=function(a,b){return a.getAttribute("data-"+b)!==null?b:null};h(v[0]).children("th, td").each(function(a,b){var c=o.aoColumns[a];if(c.mData===a){var d=s(b,"sort")||s(b,"order"),e=s(b,"filter")||s(b,"search");if(d!==null||e!==null){c.mData={_:a+".display",sort:d!==null?a+".@data-"+d:k,type:d!==
-null?a+".@data-"+d:k,filter:e!==null?a+".@data-"+e:k};ja(o,a)}}})}var w=o.oFeatures;e.bStateSave&&(w.bStateSave=!0,Kb(o,e),z(o,"aoDrawCallback",ya,"state_save"));if(e.aaSorting===k){t=o.aaSorting;g=0;for(j=t.length;g<j;g++)t[g][1]=o.aoColumns[g].asSorting[0]}xa(o);w.bSort&&z(o,"aoDrawCallback",function(){if(o.bSorted){var a=W(o),b={};h.each(a,function(a,c){b[c.src]=c.dir});u(o,null,"order",[o,a,b]);Jb(o)}});z(o,"aoDrawCallback",function(){(o.bSorted||y(o)==="ssp"||w.bDeferRender)&&xa(o)},"sc");g=
-q.children("caption").each(function(){this._captionSide=q.css("caption-side")});j=q.children("thead");0===j.length&&(j=h("<thead/>").appendTo(this));o.nTHead=j[0];j=q.children("tbody");0===j.length&&(j=h("<tbody/>").appendTo(this));o.nTBody=j[0];j=q.children("tfoot");if(0===j.length&&0<g.length&&(""!==o.oScroll.sX||""!==o.oScroll.sY))j=h("<tfoot/>").appendTo(this);0===j.length||0===j.children().length?q.addClass(i.sNoFooter):0<j.length&&(o.nTFoot=j[0],da(o.aoFooter,o.nTFoot));if(e.aaData)for(g=0;g<
-e.aaData.length;g++)N(o,e.aaData[g]);else(o.bDeferLoading||"dom"==y(o))&&ma(o,h(o.nTBody).children("tr"));o.aiDisplay=o.aiDisplayMaster.slice();o.bInitialised=!0;!1===n&&ga(o)}});b=null;return this};var Tb=[],w=Array.prototype,dc=function(a){var b,c,d=m.settings,e=h.map(d,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=h.inArray(a,e),-1!==b?[d[b]]:null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===
-typeof a?c=h(a):a instanceof h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,e);return-1!==b?d[b]:null}).toArray()};r=function(a,b){if(!(this instanceof r))return new r(a,b);var c=[],d=function(a){(a=dc(a))&&(c=c.concat(a))};if(h.isArray(a))for(var e=0,f=a.length;e<f;e++)d(a[e]);else d(a);this.context=pa(c);b&&h.merge(this,b);this.selector={rows:null,cols:null,opts:null};r.extend(this,this,Tb)};m.Api=r;h.extend(r.prototype,{any:function(){return 0!==this.count()},concat:w.concat,
-context:[],count:function(){return this.flatten().length},each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new r(b[a],this[a]):null},filter:function(a){var b=[];if(w.filter)b=w.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new r(this.context,b)},flatten:function(){var a=[];return new r(this.context,a.concat.apply(a,this.toArray()))},join:w.join,
-indexOf:w.indexOf||function(a,b){for(var c=b||0,d=this.length;c<d;c++)if(this[c]===a)return c;return-1},iterator:function(a,b,c,d){var e=[],f,g,h,i,n,l=this.context,m,t,p=this.selector;"string"===typeof a&&(d=c,c=b,b=a,a=!1);g=0;for(h=l.length;g<h;g++){var o=new r(l[g]);if("table"===b)f=c.call(o,l[g],g),f!==k&&e.push(f);else if("columns"===b||"rows"===b)f=c.call(o,l[g],this[g],g),f!==k&&e.push(f);else if("column"===b||"column-rows"===b||"row"===b||"cell"===b){t=this[g];"column-rows"===b&&(m=Da(l[g],
-p.opts));i=0;for(n=t.length;i<n;i++)f=t[i],f="cell"===b?c.call(o,l[g],f.row,f.column,g,i):c.call(o,l[g],f,g,i,m),f!==k&&e.push(f)}}return e.length||d?(a=new r(l,a?e.concat.apply([],e):e),b=a.selector,b.rows=p.rows,b.cols=p.cols,b.opts=p.opts,a):this},lastIndexOf:w.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(w.map)b=w.map.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new r(this.context,
-b)},pluck:function(a){return this.map(function(b){return b[a]})},pop:w.pop,push:w.push,reduce:w.reduce||function(a,b){return hb(this,a,b,0,this.length,1)},reduceRight:w.reduceRight||function(a,b){return hb(this,a,b,this.length-1,-1,-1)},reverse:w.reverse,selector:null,shift:w.shift,sort:w.sort,splice:w.splice,toArray:function(){return w.slice.call(this)},to$:function(){return h(this)},toJQuery:function(){return h(this)},unique:function(){return new r(this.context,pa(this))},unshift:w.unshift});r.extend=
-function(a,b,c){if(c.length&&b&&(b instanceof r||b.__dt_wrapper)){var d,e,f,g=function(a,b,c){return function(){var d=b.apply(a,arguments);r.extend(d,d,c.methodExt);return d}};d=0;for(e=c.length;d<e;d++)f=c[d],b[f.name]="function"===typeof f.val?g(a,f.val,f):h.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,r.extend(a,b[f.name],f.propExt)}};r.register=p=function(a,b){if(h.isArray(a))for(var c=0,d=a.length;c<d;c++)r.register(a[c],b);else for(var e=a.split("."),f=Tb,g,j,c=0,d=e.length;c<d;c++){g=
-(j=-1!==e[c].indexOf("()"))?e[c].replace("()",""):e[c];var i;a:{i=0;for(var n=f.length;i<n;i++)if(f[i].name===g){i=f[i];break a}i=null}i||(i={name:g,val:{},methodExt:[],propExt:[]},f.push(i));c===d-1?i.val=b:f=j?i.methodExt:i.propExt}};r.registerPlural=s=function(a,b,c){r.register(a,c);r.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof r?a.length?h.isArray(a[0])?new r(a.context,a[0]):a[0]:k:a})};p("tables()",function(a){var b;if(a){b=r;var c=this.context;if("number"===
-typeof a)a=[c[a]];else var d=h.map(c,function(a){return a.nTable}),a=h(d).filter(a).map(function(){var a=h.inArray(this,d);return c[a]}).toArray();b=new b(a)}else b=this;return b});p("table()",function(a){var a=this.tables(a),b=a.context;return b.length?new r(b[0]):a});s("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});s("tables().body()","table().body()",function(){return this.iterator("table",function(a){return a.nTBody},1)});s("tables().header()",
-"table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});s("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});s("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});p("draw()",function(a){return this.iterator("table",function(b){"page"===a?O(b):("string"===typeof a&&(a="full-hold"===a?!1:!0),T(b,!1===a))})});p("page()",function(a){return a===
-k?this.page.info().page:this.iterator("table",function(b){Ta(b,a)})});p("page.info()",function(){if(0===this.context.length)return k;var a=this.context[0],b=a._iDisplayStart,c=a.oFeatures.bPaginate?a._iDisplayLength:-1,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:d,serverSide:"ssp"===y(a)}});p("page.len()",function(a){return a===k?0!==this.context.length?this.context[0]._iDisplayLength:
-k:this.iterator("table",function(b){Ra(b,a)})});var Ub=function(a,b,c){if(c){var d=new r(a);d.one("draw",function(){c(d.ajax.json())})}if("ssp"==y(a))T(a,b);else{C(a,!0);var e=a.jqXHR;e&&4!==e.readyState&&e.abort();ra(a,[],function(c){na(a);for(var c=sa(a,c),d=0,e=c.length;d<e;d++)N(a,c[d]);T(a,b);C(a,!1)})}};p("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});p("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});p("ajax.reload()",function(a,
-b){return this.iterator("table",function(c){Ub(c,!1===b,a)})});p("ajax.url()",function(a){var b=this.context;if(a===k){if(0===b.length)return k;b=b[0];return b.ajax?h.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){h.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});p("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Ub(c,!1===b,a)})});var $a=function(a,b,c,d,e){var f=[],g,j,i,n,l,m;i=typeof b;if(!b||"string"===i||"function"===
-i||b.length===k)b=[b];i=0;for(n=b.length;i<n;i++){j=b[i]&&b[i].split?b[i].split(","):[b[i]];l=0;for(m=j.length;l<m;l++)(g=c("string"===typeof j[l]?h.trim(j[l]):j[l]))&&g.length&&(f=f.concat(g))}a=v.selector[a];if(a.length){i=0;for(n=a.length;i<n;i++)f=a[i](d,e,f)}return pa(f)},ab=function(a){a||(a={});a.filter&&a.search===k&&(a.search=a.filter);return h.extend({search:"none",order:"current",page:"all"},a)},bb=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a[0].length=
-1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Da=function(a,b){var c,d,e,f=[],g=a.aiDisplay;c=a.aiDisplayMaster;var j=b.search;d=b.order;e=b.page;if("ssp"==y(a))return"removed"===j?[]:X(0,c.length);if("current"==e){c=a._iDisplayStart;for(d=a.fnDisplayEnd();c<d;c++)f.push(g[c])}else if("current"==d||"applied"==d)f="none"==j?c.slice():"applied"==j?g.slice():h.map(c,function(a){return-1===h.inArray(a,g)?a:null});else if("index"==d||"original"==d){c=0;for(d=a.aoData.length;c<d;c++)"none"==
-j?f.push(c):(e=h.inArray(c,g),(-1===e&&"removed"==j||0<=e&&"applied"==j)&&f.push(c))}return f};p("rows()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var e=b;return $a("row",a,function(a){var b=Pb(a);if(b!==null&&!e)return[b];var j=Da(c,e);if(b!==null&&h.inArray(b,j)!==-1)return[b];if(!a)return j;if(typeof a==="function")return h.map(j,function(b){var e=c.aoData[b];return a(b,e._aData,e.nTr)?b:null});b=Sb(ha(c.aoData,j,"nTr"));if(a.nodeName){if(a._DT_RowIndex!==
-k)return[a._DT_RowIndex];if(a._DT_CellIndex)return[a._DT_CellIndex.row];b=h(a).closest("*[data-dt-row]");return b.length?[b.data("dt-row")]:[]}if(typeof a==="string"&&a.charAt(0)==="#"){j=c.aIds[a.replace(/^#/,"")];if(j!==k)return[j.idx]}return h(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()},c,e)},1);c.selector.rows=a;c.selector.opts=b;return c});p("rows().nodes()",function(){return this.iterator("row",function(a,b){return a.aoData[b].nTr||k},1)});p("rows().data()",function(){return this.iterator(!0,
-"rows",function(a,b){return ha(a.aoData,b,"_aData")},1)});s("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var d=b.aoData[c];return"search"===a?d._aFilterData:d._aSortData},1)});s("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){ca(b,c,a)})});s("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,b){return b},1)});s("rows().ids()","row().id()",function(a){for(var b=[],c=this.context,
-d=0,e=c.length;d<e;d++)for(var f=0,g=this[d].length;f<g;f++){var h=c[d].rowIdFn(c[d].aoData[this[d][f]]._aData);b.push((!0===a?"#":"")+h)}return new r(c,b)});s("rows().remove()","row().remove()",function(){var a=this;this.iterator("row",function(b,c,d){var e=b.aoData,f=e[c],g,h,i,n,l;e.splice(c,1);g=0;for(h=e.length;g<h;g++)if(i=e[g],l=i.anCells,null!==i.nTr&&(i.nTr._DT_RowIndex=g),null!==l){i=0;for(n=l.length;i<n;i++)l[i]._DT_CellIndex.row=g}oa(b.aiDisplayMaster,c);oa(b.aiDisplay,c);oa(a[d],c,!1);
-Sa(b);c=b.rowIdFn(f._aData);c!==k&&delete b.aIds[c]});this.iterator("table",function(a){for(var c=0,d=a.aoData.length;c<d;c++)a.aoData[c].idx=c});return this});p("rows.add()",function(a){var b=this.iterator("table",function(b){var c,f,g,h=[];f=0;for(g=a.length;f<g;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?h.push(ma(b,c)[0]):h.push(N(b,c));return h},1),c=this.rows(-1);c.pop();h.merge(c,b);return c});p("row()",function(a,b){return bb(this.rows(a,b))});p("row().data()",function(a){var b=
-this.context;if(a===k)return b.length&&this.length?b[0].aoData[this[0]]._aData:k;b[0].aoData[this[0]]._aData=a;ca(b[0],this[0],"data");return this});p("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});p("row.add()",function(a){a instanceof h&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?ma(b,a)[0]:N(b,a)});return this.row(b[0])});var cb=function(a,b){var c=a.context;if(c.length&&
-(c=c[0].aoData[b!==k?b:a[0]])&&c._details)c._details.remove(),c._detailsShow=k,c._details=k},Vb=function(a,b){var c=a.context;if(c.length&&a.length){var d=c[0].aoData[a[0]];if(d._details){(d._detailsShow=b)?d._details.insertAfter(d.nTr):d._details.detach();var e=c[0],f=new r(e),g=e.aoData;f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<F(g,"_details").length&&(f.on("draw.dt.DT_details",function(a,b){e===b&&f.rows({page:"current"}).eq(0).each(function(a){a=g[a];
-a._detailsShow&&a._details.insertAfter(a.nTr)})}),f.on("column-visibility.dt.DT_details",function(a,b){if(e===b)for(var c,d=aa(b),f=0,h=g.length;f<h;f++)c=g[f],c._details&&c._details.children("td[colspan]").attr("colspan",d)}),f.on("destroy.dt.DT_details",function(a,b){if(e===b)for(var c=0,d=g.length;c<d;c++)g[c]._details&&cb(f,c)}))}}};p("row().child()",function(a,b){var c=this.context;if(a===k)return c.length&&this.length?c[0].aoData[this[0]]._details:k;if(!0===a)this.child.show();else if(!1===
-a)cb(this);else if(c.length&&this.length){var d=c[0],c=c[0].aoData[this[0]],e=[],f=function(a,b){if(h.isArray(a)||a instanceof h)for(var c=0,k=a.length;c<k;c++)f(a[c],b);else a.nodeName&&"tr"===a.nodeName.toLowerCase()?e.push(a):(c=h("<tr><td/></tr>").addClass(b),h("td",c).addClass(b).html(a)[0].colSpan=aa(d),e.push(c[0]))};f(a,b);c._details&&c._details.remove();c._details=h(e);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});p(["row().child.show()","row().child().show()"],function(){Vb(this,
-!0);return this});p(["row().child.hide()","row().child().hide()"],function(){Vb(this,!1);return this});p(["row().child.remove()","row().child().remove()"],function(){cb(this);return this});p("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var ec=/^(.+):(name|visIdx|visible)$/,Wb=function(a,b,c,d,e){for(var c=[],d=0,f=e.length;d<f;d++)c.push(B(a,e[d],b));return c};p("columns()",function(a,b){a===k?a="":h.isPlainObject(a)&&
-(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var e=a,f=b,g=c.aoColumns,j=F(g,"sName"),i=F(g,"nTh");return $a("column",e,function(a){var b=Pb(a);if(a==="")return X(g.length);if(b!==null)return[b>=0?b:g.length+b];if(typeof a==="function"){var e=Da(c,f);return h.map(g,function(b,f){return a(f,Wb(c,f,0,0,e),i[f])?f:null})}var k=typeof a==="string"?a.match(ec):"";if(k)switch(k[2]){case "visIdx":case "visible":b=parseInt(k[1],10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null});
-return[m[m.length+b]]}return[Z(c,b)];case "name":return h.map(j,function(a,b){return a===k[1]?b:null});default:return[]}if(a.nodeName&&a._DT_CellIndex)return[a._DT_CellIndex.column];b=h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray();if(b.length||!a.nodeName)return b;b=h(a).closest("*[data-dt-column]");return b.length?[b.data("dt-column")]:[]},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});s("columns().header()","column().header()",function(){return this.iterator("column",
-function(a,b){return a.aoColumns[b].nTh},1)});s("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});s("columns().data()","column().data()",function(){return this.iterator("column-rows",Wb,1)});s("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});s("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,
-c,d,e,f){return ha(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});s("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return ha(a.aoData,e,"anCells",b)},1)});s("columns().visible()","column().visible()",function(a,b){return this.iterator("column",function(c,d){if(a===k)return c.aoColumns[d].bVisible;var e=c.aoColumns,f=e[d],g=c.aoData,j,i,n;if(a!==k&&f.bVisible!==a){if(a){var l=h.inArray(!0,F(e,"bVisible"),d+1);j=0;for(i=g.length;j<
-i;j++)n=g[j].nTr,e=g[j].anCells,n&&n.insertBefore(e[d],e[l]||null)}else h(F(c.aoData,"anCells",d)).detach();f.bVisible=a;ea(c,c.aoHeader);ea(c,c.aoFooter);(b===k||b)&&U(c);u(c,null,"column-visibility",[c,d,a,b]);ya(c)}})});s("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?$(b,c):c},1)});p("columns.adjust()",function(){return this.iterator("table",function(a){U(a)},1)});p("column.index()",function(a,b){if(0!==this.context.length){var c=
-this.context[0];if("fromVisible"===a||"toData"===a)return Z(c,b);if("fromData"===a||"toVisible"===a)return $(c,b)}});p("column()",function(a,b){return bb(this.columns(a,b))});p("cells()",function(a,b,c){h.isPlainObject(a)&&(a.row===k?(c=a,a=null):(c=b,b=null));h.isPlainObject(b)&&(c=b,b=null);if(null===b||b===k)return this.iterator("table",function(b){var d=a,e=ab(c),f=b.aoData,g=Da(b,e),j=Sb(ha(f,g,"anCells")),i=h([].concat.apply([],j)),l,n=b.aoColumns.length,m,p,r,u,v,s;return $a("cell",d,function(a){var c=
-typeof a==="function";if(a===null||a===k||c){m=[];p=0;for(r=g.length;p<r;p++){l=g[p];for(u=0;u<n;u++){v={row:l,column:u};if(c){s=f[l];a(v,B(b,l,u),s.anCells?s.anCells[u]:null)&&m.push(v)}else m.push(v)}}return m}if(h.isPlainObject(a))return[a];c=i.filter(a).map(function(a,b){return{row:b._DT_CellIndex.row,column:b._DT_CellIndex.column}}).toArray();if(c.length||!a.nodeName)return c;s=h(a).closest("*[data-dt-row]");return s.length?[{row:s.data("dt-row"),column:s.data("dt-column")}]:[]},b,e)});var d=
-this.columns(b,c),e=this.rows(a,c),f,g,j,i,n,l=this.iterator("table",function(a,b){f=[];g=0;for(j=e[b].length;g<j;g++){i=0;for(n=d[b].length;i<n;i++)f.push({row:e[b][g],column:d[b][i]})}return f},1);h.extend(l.selector,{cols:b,rows:a,opts:c});return l});s("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a=a.aoData[b])&&a.anCells?a.anCells[c]:k},1)});p("cells().data()",function(){return this.iterator("cell",function(a,b,c){return B(a,b,c)},1)});s("cells().cache()",
-"cell().cache()",function(a){a="search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]},1)});s("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,d){return B(b,c,d,a)},1)});s("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,b,c){return{row:b,column:c,columnVisible:$(a,c)}},1)});s("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,
-c,d){ca(b,c,a,d)})});p("cell()",function(a,b,c){return bb(this.cells(a,b,c))});p("cell().data()",function(a){var b=this.context,c=this[0];if(a===k)return b.length&&c.length?B(b[0],c[0].row,c[0].column):k;jb(b[0],c[0].row,c[0].column,a);ca(b[0],c[0].row,"data",c[0].column);return this});p("order()",function(a,b){var c=this.context;if(a===k)return 0!==c.length?c[0].aaSorting:k;"number"===typeof a?a=[[a,b]]:h.isArray(a[0])||(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=
-a.slice()})});p("order.listener()",function(a,b,c){return this.iterator("table",function(d){Oa(d,a,b,c)})});p("order.fixed()",function(a){if(!a){var b=this.context,b=b.length?b[0].aaSortingFixed:k;return h.isArray(b)?{pre:b}:b}return this.iterator("table",function(b){b.aaSortingFixed=h.extend(!0,{},a)})});p(["columns().order()","column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];h.each(b[d],function(b,c){e.push([c,a])});c.aaSorting=e})});p("search()",function(a,
-b,c,d){var e=this.context;return a===k?0!==e.length?e[0].oPreviousSearch.sSearch:k:this.iterator("table",function(e){e.oFeatures.bFilter&&fa(e,h.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});s("columns().search()","column().search()",function(a,b,c,d){return this.iterator("column",function(e,f){var g=e.aoPreSearchCols;if(a===k)return g[f].sSearch;e.oFeatures.bFilter&&(h.extend(g[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===
-c?!0:c,bCaseInsensitive:null===d?!0:d}),fa(e,e.oPreviousSearch,1))})});p("state()",function(){return this.context.length?this.context[0].oSavedState:null});p("state.clear()",function(){return this.iterator("table",function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});p("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null});p("state.save()",function(){return this.iterator("table",function(a){ya(a)})});m.versionCheck=m.fnVersionCheck=function(a){for(var b=
-m.version.split("."),a=a.split("."),c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;h.each(m.settings,function(a,e){var f=e.nScrollHead?h("table",e.nScrollHead)[0]:null,g=e.nScrollFoot?h("table",e.nScrollFoot)[0]:null;if(e.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){var b=!1;h.isPlainObject(a)&&(b=a.api,a=a.visible);var c=h.map(m.settings,function(b){if(!a||
-a&&h(b.nTable).is(":visible"))return b.nTable});return b?new r(c):c};m.util={throttle:ua,escapeRegex:va};m.camelToHungarian=K;p("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,b){p(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0].match(/\.dt\b/)||(a[0]+=".dt");var d=h(this.tables().nodes());d[b].apply(d,a);return this})});p("clear()",function(){return this.iterator("table",
-function(a){na(a)})});p("settings()",function(){return new r(this.context,this.context)});p("init()",function(){var a=this.context;return a.length?a[0].oInit:null});p("data()",function(){return this.iterator("table",function(a){return F(a.aoData,"_aData")}).flatten()});p("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(e),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),
-p;b.bDestroying=!0;u(b,"aoDestroyCallback","destroy",[b]);a||(new r(b)).columns().visible(!0);k.unbind(".DT").find(":not(tbody *)").unbind(".DT");h(D).unbind(".DT-"+b.sInstance);e!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&e!=j.parentNode&&(i.children("tfoot").detach(),i.append(j));b.aaSorting=[];b.aaSortingFixed=[];xa(b);h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);b.bJUI&&(h("th span."+
-d.sSortIcon+", td span."+d.sSortIcon,g).detach(),h("th, td",g).each(function(){var a=h("div."+d.sSortJUIWrapper,this);h(this).append(a.contents());a.detach()}));f.children().detach();f.append(l);g=a?"remove":"detach";i[g]();k[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),i.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%p])}));c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,1)})});h.each(["column",
-"row","cell"],function(a,b){p(b+"s().every()",function(a){var d=this.selector.opts,e=this;return this.iterator(b,function(f,g,h,i,n){a.call(e[b](g,"cell"===b?h:d,"cell"===b?d:k),g,h,i,n)})})});p("i18n()",function(a,b,c){var d=this.context[0],a=Q(a)(d.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:a._);return a.replace("%d",c)});m.version="1.10.11";m.settings=[];m.models={};m.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow={nTr:null,anCells:null,
-_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};m.defaults=
-{aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,
-this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+
-"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",
-sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};
-Y(m.defaults);m.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};Y(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,
-bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],
-aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,
-aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==y(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==y(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=
-this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};m.ext=v={buttons:{},classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},
-header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(v,{afnFiltering:v.search,aTypes:v.type.detect,ofnSearch:v.type.search,oSort:v.type.order,afnSortData:v.order,aoFeatures:v.feature,oApi:v.internal,oStdClasses:v.classes,oPagination:v.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",
-sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",
-sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var Ea="",Ea="",H=Ea+"ui-state-default",ia=Ea+"css_right ui-icon ui-icon-",Xb=Ea+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";h.extend(m.ext.oJUIClasses,
-m.ext.classes,{sPageButton:"fg-button ui-button "+H,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:H+" sorting_asc",sSortDesc:H+" sorting_desc",sSortable:H+" sorting",sSortableAsc:H+" sorting_asc_disabled",sSortableDesc:H+" sorting_desc_disabled",sSortableNone:H+" sorting_disabled",sSortJUIAsc:ia+"triangle-1-n",sSortJUIDesc:ia+"triangle-1-s",sSortJUI:ia+"carat-2-n-s",
-sSortJUIAscAllowed:ia+"carat-1-n",sSortJUIDescAllowed:ia+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+H,sScrollFoot:"dataTables_scrollFoot "+H,sHeaderTH:H,sFooterTH:H,sJUIHeader:Xb+" ui-corner-tl ui-corner-tr",sJUIFooter:Xb+" ui-corner-bl ui-corner-br"});var Mb=m.ext.pager;h.extend(Mb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(a,b){return[Aa(a,
-b)]},simple_numbers:function(a,b){return["previous",Aa(a,b),"next"]},full_numbers:function(a,b){return["first","previous",Aa(a,b),"next","last"]},_numbers:Aa,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,j=a.oLanguage.oPaginate,i=a.oLanguage.oAria.paginate||{},k,l,m=0,p=function(b,d){var o,r,u,s,v=function(b){Ta(a,b.data.action,true)};o=0;for(r=d.length;o<r;o++){s=d[o];if(h.isArray(s)){u=h("<"+(s.DT_el||"div")+"/>").appendTo(b);p(u,s)}else{k=null;
-l="";switch(s){case "ellipsis":b.append('<span class="ellipsis">&#x2026;</span>');break;case "first":k=j.sFirst;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "previous":k=j.sPrevious;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":k=j.sNext;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;case "last":k=j.sLast;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;default:k=s+1;l=e===s?g.sPageButtonActive:""}if(k!==null){u=h("<a>",{"class":g.sPageButton+" "+l,"aria-controls":a.sTableId,"aria-label":i[s],
-"data-dt-idx":m,tabindex:a.iTabIndex,id:c===0&&typeof s==="string"?a.sTableId+"_"+s:null}).html(k).appendTo(b);Wa(u,{action:s},v);m++}}}},r;try{r=h(b).find(I.activeElement).data("dt-idx")}catch(o){}p(h(b).empty(),d);r&&h(b).find("[data-dt-idx="+r+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&(!bc.test(a)||!cc.test(a)))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||M(a)?"date":
-null},function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c,!0)?"html-num-fmt"+c:null},function(a){return M(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(m.ext.type.search,{html:function(a){return M(a)?a:"string"===typeof a?a.replace(Ob," ").replace(Ca,""):""},string:function(a){return M(a)?a:"string"===typeof a?a.replace(Ob,
-" "):a}});var Ba=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Qb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(v.type.order,{"date-pre":function(a){return Date.parse(a)||0},"html-pre":function(a){return M(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return M(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return a<b?-1:a>b?1:0},"string-desc":function(a,
-b){return a<b?1:a>b?-1:0}});db("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,d){h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,d){h("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(h("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);h(a.nTable).on("order.dt.DT",function(e,
-f,g,h){if(a===f){e=c.idx;b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass(h[e]=="asc"?d.sSortJUIAsc:h[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)}})}}});var Yb=function(a){return"string"===typeof a?a.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):a};m.render={number:function(a,
-b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return Yb(f);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+f+(e||"")}}},text:function(){return{display:Yb}}};h.extend(m.ext.internal,{_fnExternApiFunc:Nb,_fnBuildAjax:ra,_fnAjaxUpdate:lb,_fnAjaxParameters:ub,_fnAjaxUpdateDraw:vb,_fnAjaxDataSrc:sa,_fnAddColumn:Ga,_fnColumnOptions:ja,
-_fnAdjustColumnSizing:U,_fnVisibleToColumnIndex:Z,_fnColumnIndexToVisible:$,_fnVisbleColumns:aa,_fnGetColumns:la,_fnColumnTypes:Ia,_fnApplyColumnDefs:ib,_fnHungarianMap:Y,_fnCamelToHungarian:K,_fnLanguageCompat:Fa,_fnBrowserDetect:gb,_fnAddData:N,_fnAddTr:ma,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:B,_fnSetCellData:jb,_fnSplitObjNotation:La,_fnGetObjectDataFn:Q,_fnSetObjectDataFn:R,
-_fnGetDataMaster:Ma,_fnClearTable:na,_fnDeleteIndex:oa,_fnInvalidate:ca,_fnGetRowElements:Ka,_fnCreateTr:Ja,_fnBuildHead:kb,_fnDrawHead:ea,_fnDraw:O,_fnReDraw:T,_fnAddOptionsHtml:nb,_fnDetectHeader:da,_fnGetUniqueThs:qa,_fnFeatureHtmlFilter:pb,_fnFilterComplete:fa,_fnFilterCustom:yb,_fnFilterColumn:xb,_fnFilter:wb,_fnFilterCreateSearch:Qa,_fnEscapeRegex:va,_fnFilterData:zb,_fnFeatureHtmlInfo:sb,_fnUpdateInfo:Cb,_fnInfoMacros:Db,_fnInitialise:ga,_fnInitComplete:ta,_fnLengthChange:Ra,_fnFeatureHtmlLength:ob,
-_fnFeatureHtmlPaginate:tb,_fnPageChange:Ta,_fnFeatureHtmlProcessing:qb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:rb,_fnScrollDraw:ka,_fnApplyToChildren:J,_fnCalculateColumnWidths:Ha,_fnThrottle:ua,_fnConvertToWidth:Fb,_fnGetWidestNode:Gb,_fnGetMaxLenString:Hb,_fnStringToCss:x,_fnSortFlatten:W,_fnSort:mb,_fnSortAria:Jb,_fnSortListener:Va,_fnSortAttachListener:Oa,_fnSortingClasses:xa,_fnSortData:Ib,_fnSaveState:ya,_fnLoadState:Kb,_fnSettingsFromNode:za,_fnLog:L,_fnMap:E,_fnBindAction:Wa,_fnCallbackReg:z,
-_fnCallbackFire:u,_fnLengthOverflow:Sa,_fnRenderer:Pa,_fnDataSource:y,_fnRowAttributes:Na,_fnCalculateEnd:function(){}});h.fn.dataTable=m;m.$=h;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable});


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/WidgetCDNChartController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/WidgetCDNChartController.js b/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/WidgetCDNChartController.js
deleted file mode 100644
index 286ba4e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/WidgetCDNChartController.js
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var WidgetCDNChartController = function(cdn, $scope, $timeout, $filter, $q, cdnService, cacheStatsService, dateUtils, locationUtils, numberUtils) {
-
-	var chartSeries,
-		chartOptions;
-
-	var getCDN = function(id) {
-		cdnService.getCDN(id)
-			.then(function(result) {
-				$scope.cdn = result;
-				registerResizeListener();
-				getCurrentStats($scope.cdn.name);
-				getChartData($scope.cdn.name, moment().subtract(1, 'days'), moment().subtract(10, 'seconds'));
-			});
-	};
-
-	var getCurrentStats = function(cdnName) {
-		cdnService.getCurrentStats()
-			.then(function(result) {
-				$scope.currentStats = _.find(result.currentStats, function(item) {
-					return item.cdn == cdnName;
-				});
-			});
-	};
-
-	var getChartData = function(cdnName, start, end) {
-		var promises = [];
-
-		// get cdn bandwidth
-		promises.push(cacheStatsService.getBandwidth(cdnName, start, end));
-
-		// get cdn connections
-		promises.push(cacheStatsService.getConnections(cdnName, start, end));
-
-		$q.all(promises)
-			.then(
-				function(responses) {
-					// set chart data
-					var bandwidthChartData = buildBandwidthChartData(responses[0], start),
-						connectionsChartData = buildConnectionsChartData(responses[1], start);
-
-					$timeout(function () {
-						buildChart(bandwidthChartData, connectionsChartData);
-					}, 100);
-				},
-				function(fault) {
-					buildChart([], []); // build an empty chart
-				});
-
-	};
-
-	var buildBandwidthChartData = function(result, start) {
-		var normalizedChartData = [],
-			series = result.series;
-
-		if (angular.isDefined(series)) {
-			_.each(series.values, function(seriesItem) {
-				if (moment(seriesItem[0]).isSame(start) || moment(seriesItem[0]).isAfter(start)) {
-					normalizedChartData.push([ moment(seriesItem[0]).valueOf(), numberUtils.convertTo(seriesItem[1], $scope.unitSize) ]); // converts data to appropriate unit
-				}
-			});
-		}
-
-		return normalizedChartData;
-	};
-
-	var buildConnectionsChartData = function(result, start) {
-		var normalizedChartData = [],
-			series = result.series;
-
-		if (angular.isDefined(series)) {
-			_.each(series.values, function(seriesItem) {
-				if (moment(seriesItem[0]).isSame(start) || moment(seriesItem[0]).isAfter(start)) {
-					if (_.isNumber(seriesItem[1])) {
-						normalizedChartData.push([ moment(seriesItem[0]).valueOf(), seriesItem[1] ]);
-					}
-				}
-			});
-		}
-
-		return normalizedChartData;
-	};
-
-	var buildChart = function(bandwidthChartData, connectionsChartData) {
-
-		chartOptions = {
-			xaxis: {
-				mode: "time",
-				timezone: "utc",
-				twelveHourClock: false
-			},
-			yaxes: [
-				{
-					position: "left",
-					axisLabel: "Bandwidth (Gbps)",
-					axisLabelUseCanvas: true,
-					axisLabelFontSizePixels: 12,
-					axisLabelFontFamily: 'Verdana, Arial',
-					axisLabelPadding: 3
-				},
-				{
-					position: "right",
-					axisLabel: "Connections",
-					axisLabelUseCanvas: true,
-					axisLabelFontSizePixels: 12,
-					axisLabelFontFamily: 'Verdana, Arial',
-					axisLabelPadding: 3
-				}
-			],
-			legend: {
-				position: "nw"
-			},
-			grid: {
-				hoverable: true,
-				axisMargin: 20
-			},
-			tooltip: {
-				show: true,
-				content: function(label, xval, yval, flotItem){
-					var tooltipString = dateUtils.dateFormat(xval, "UTC: ddd mmm d yyyy H:MM:ss tt (Z)") + '<br>';
-					tooltipString += '<span>' + label + ': ' + $filter('number')(yval, 2) + '</span><br>'
-					return tooltipString;
-				}
-			}
-		};
-
-		chartSeries = [
-			{ label: "Bandwidth", yaxis: 1, color: '#3498DB', data: bandwidthChartData },
-			{ label: "Connections", yaxis: 2, color: '#E74C3C', data: connectionsChartData }
-		];
-
-		plotChart();
-
-	};
-
-	var registerResizeListener = function() {
-		$(window).resize(plotChart);
-	};
-
-	var plotChart = function() {
-		if (chartOptions && chartSeries) {
-			$.plot($("#bps-chart-" + $scope.cdn.id), chartSeries, chartOptions);
-		}
-	};
-
-	$scope.cdn;
-
-	$scope.unitSize = 'Gb';
-
-	$scope.randomId = '_' + Math.random().toString(36).substr(2, 9);
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		var cdnId;
-		if (cdn) {
-			cdnId = cdn.id;
-		} else {
-			// cdn wasn't passed in. we need to figure it out on our own
-			cdnId = $('#' + $scope.randomId).closest('.chartContainer').data('cdnid');
-		}
-		getCDN(cdnId);
-	});
-
-};
-
-WidgetCDNChartController.$inject = ['cdn', '$scope', '$timeout', '$filter', '$q', 'cdnService', 'cacheStatsService', 'dateUtils', 'locationUtils', 'numberUtils'];
-module.exports = WidgetCDNChartController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/_widget.cdnChart.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/_widget.cdnChart.scss b/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/_widget.cdnChart.scss
deleted file mode 100644
index 68dea14..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/_widget.cdnChart.scss
+++ /dev/null
@@ -1,30 +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.
-
-*/
-
-.bps-chart-container {
-  position: relative;
-  text-align: center;
-  background-color: transparent;
-  padding: 30px 60px;
-
-  .bps-chart {
-    width: 100%;
-    height: 250px;
-  }
-
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/index.js b/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/index.js
deleted file mode 100644
index 58cc63d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.widget.cdnChart', [])
-	.controller('WidgetCDNChartController', require('./WidgetCDNChartController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/widget.cdnChart.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/widget.cdnChart.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/widget.cdnChart.tpl.html
deleted file mode 100644
index 157f6c2..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/cdnChart/widget.cdnChart.tpl.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div id="{{::randomId}}" class="dashboard_graph">
-    <div class="x_title">
-        <h2><a ng-click="navigateToPath('/admin/cdns/' + cdn.id)">{{::cdn.name}}</a></h2>
-        <ul class="nav navbar-right panel_toolbox">
-            <li><a class="collapse-link"><i class="fa fa-chevron-up"></i></a></li>
-            <li><a class="close-link"><i class="fa fa-close"></i></a></li>
-        </ul>
-        <div class="clearfix"></div>
-    </div>
-    <div class="col-md-9 col-sm-9 col-xs-12">
-        <div class="bps-chart-container">
-            <div id="bps-chart-{{::cdn.id}}" class="bps-chart"></div>
-        </div>
-    </div>
-    <div class="col-md-3 col-sm-3 col-xs-12 bg-white">
-        <div class="x_title">
-            <h3>Statistics</h3>
-            <div class="clearfix"></div>
-        </div>
-        <div class="col-md-12 col-sm-12 col-xs-6">
-            <table class="countries_list">
-                <tbody>
-                    <tr>
-                        <td>Utilization %</td>
-                        <td class="fs15 fw700 text-right">{{currentStats.bandwidth/currentStats.capacity | percentFilter}} of {{currentStats.capacity | number:0}} Gbps</td>
-                    </tr>
-                    <tr>
-                        <td>Current Bandwidth</td>
-                        <td class="fs15 fw700 text-right">{{currentStats.bandwidth | number:2}} Gbps</td>
-                    </tr>
-                    <tr>
-                        <td>Current Connections</td>
-                        <td class="fs15 fw700 text-right">{{currentStats.connections | number:0}}</td>
-                    </tr>
-                </tbody>
-            </table>
-        </div>
-    </div>
-    <div class="clearfix"></div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/changeLogs/WidgetChangeLogsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/changeLogs/WidgetChangeLogsController.js b/traffic_ops/experimental/ui/app/src/common/modules/widget/changeLogs/WidgetChangeLogsController.js
deleted file mode 100644
index 45e46e9..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/changeLogs/WidgetChangeLogsController.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var WidgetChangeLogsController = function(changeLogs, $scope, locationUtils) {
-
-	$scope.getRelativeTime = function(date) {
-		return moment(date).fromNow();
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	var init = function() {
-		if (changeLogs) {
-			// only set this if it's passed in
-			$scope.changeLogs = changeLogs;
-		}
-	};
-	init();
-
-};
-
-WidgetChangeLogsController.$inject = ['changeLogs', '$scope', 'locationUtils'];
-module.exports = WidgetChangeLogsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/changeLogs/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/changeLogs/index.js b/traffic_ops/experimental/ui/app/src/common/modules/widget/changeLogs/index.js
deleted file mode 100644
index 5fa0384..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/changeLogs/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.widget.changeLogs', [])
-	.controller('WidgetChangeLogsController', require('./WidgetChangeLogsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/changeLogs/widget.changeLogs.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/changeLogs/widget.changeLogs.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/widget/changeLogs/widget.changeLogs.tpl.html
deleted file mode 100644
index 15c615d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/changeLogs/widget.changeLogs.tpl.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_title">
-    <h2>Change Logs</h2>
-    <ul class="nav navbar-right panel_toolbox">
-        <li><a class="collapse-link"><i class="fa fa-chevron-up"></i></a></li>
-        <li><a class="close-link"><i class="fa fa-close"></i></a></li>
-    </ul>
-    <div class="clearfix"></div>
-</div>
-<div class="x_content">
-    <div class="dashboard-widget-content">
-        <ul class="list-unstyled timeline widget">
-            <li ng-repeat="changeLog in ::changeLogs">
-                <div class="block">
-                    <div class="block_content">
-                        <h2 class="title">{{::changeLog.level}}</h2>
-                        <div class="byline">
-                            <span>{{::getRelativeTime(changeLog.lastUpdated)}}</span> by <a>{{::changeLog.user}}</a>
-                        </div>
-                        <p class="excerpt">{{::changeLog.message}}</p>
-                    </div>
-                </div>
-            </li>
-        </ul>
-    </div>
-    <div class="text-center">
-        <a>
-            <strong><a ng-click="navigateToPath('/admin/change-logs')">See All Change Logs</a></strong>
-            <i class="fa fa-angle-right"></i>
-        </a>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/WidgetRoutingController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/WidgetRoutingController.js b/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/WidgetRoutingController.js
deleted file mode 100644
index da97948..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/WidgetRoutingController.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var WidgetRoutingController = function($scope, cdnService) {
-
-	var getRoutingMethods = function() {
-		cdnService.getRoutingMethods()
-			.then(function(response) {
-				$scope.native = response.cz;
-				$scope.thirdParty = response.geo;
-				$scope.federated = response.fed;
-				$scope.miss = response.miss;
-				$scope.static = response.staticRoute;
-				$scope.dsr = response.dsr;
-				$scope.error = response.err;
-				$scope.regionalAlternate = response.regionalAlternate;
-				$scope.regionalDenied = response.regionalDenied;
-			});
-	};
-
-	var init = function() {
-		getRoutingMethods();
-	};
-	init();
-
-};
-
-WidgetRoutingController.$inject = ['$scope', 'cdnService'];
-module.exports = WidgetRoutingController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/_widget.routing.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/_widget.routing.scss b/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/_widget.routing.scss
deleted file mode 100644
index 5df3a2b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/_widget.routing.scss
+++ /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.
-
-*/
-
-.widget_summary .w_right span {
-  font-size: 16px;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/index.js b/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/index.js
deleted file mode 100644
index 237950c..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.widget.routing', [])
-	.controller('WidgetRoutingController', require('./WidgetRoutingController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/widget.routing.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/widget.routing.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/widget.routing.tpl.html
deleted file mode 100644
index 6af1369..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/routing/widget.routing.tpl.html
+++ /dev/null
@@ -1,157 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_title">
-    <h2>Routing Methods</h2>
-    <ul class="nav navbar-right panel_toolbox">
-        <li><a class="collapse-link"><i class="fa fa-chevron-up"></i></a></li>
-        <li><a class="close-link"><i class="fa fa-close"></i></a></li>
-    </ul>
-    <div class="clearfix"></div>
-</div>
-<div class="x_content">
-    <div class="widget_summary">
-        <div class="w_left w_25">
-            <span>Native</span>
-        </div>
-        <div class="w_center w_55">
-            <div class="progress">
-                <div class="progress-bar" role="progressbar" ng-style="{'width': native + '%'}" style="background-color: #357EBD;"></div>
-            </div>
-        </div>
-        <div class="w_right w_20">
-            <span>{{native | number:3}}%</span>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="widget_summary">
-        <div class="w_left w_25">
-            <span>3rd Party</span>
-        </div>
-        <div class="w_center w_55">
-            <div class="progress">
-                <div class="progress-bar" role="progressbar" ng-style="{'width': thirdParty + '%'}" style="background-color: #263C53;"></div>
-            </div>
-        </div>
-        <div class="w_right w_20">
-            <span>{{thirdParty | number:3}}%</span>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="widget_summary">
-        <div class="w_left w_25">
-            <span>Federated</span>
-        </div>
-        <div class="w_center w_55">
-            <div class="progress">
-                <div class="progress-bar" role="progressbar" ng-style="{'width': federated + '%'}" style="background-color: #8a00e6;"></div>
-            </div>
-        </div>
-        <div class="w_right w_20">
-            <span>{{federated | number:3}}%</span>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="widget_summary">
-        <div class="w_left w_25">
-            <span>Miss</span>
-        </div>
-        <div class="w_center w_55">
-            <div class="progress">
-                <div class="progress-bar" role="progressbar" ng-style="{'width': miss + '%'}" style="background-color: #a94442;"></div>
-            </div>
-        </div>
-        <div class="w_right w_20">
-            <span>{{miss | number:3}}%</span>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="widget_summary">
-        <div class="w_left w_25">
-            <span>Static</span>
-        </div>
-        <div class="w_center w_55">
-            <div class="progress">
-                <div class="progress-bar" role="progressbar" ng-style="{'width': static + '%'}" style="background-color: #cccccc;"></div>
-            </div>
-        </div>
-        <div class="w_right w_20">
-            <span>{{static | number:3}}%</span>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="widget_summary">
-        <div class="w_left w_25">
-            <span>DSR</span>
-        </div>
-        <div class="w_center w_55">
-            <div class="progress">
-                <div class="progress-bar" role="progressbar" ng-style="{'width': dsr + '%'}" style="background-color: #3c763d;"></div>
-            </div>
-        </div>
-        <div class="w_right w_20">
-            <span>{{dsr | number:3}}%</span>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="widget_summary">
-        <div class="w_left w_25">
-            <span>Error</span>
-        </div>
-        <div class="w_center w_55">
-            <div class="progress">
-                <div class="progress-bar" role="progressbar" ng-style="{'width': error + '%'}" style="background-color: #E74C3C"></div>
-            </div>
-        </div>
-        <div class="w_right w_20">
-            <span>{{error | number:3}}%</span>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="widget_summary">
-        <div class="w_left w_25">
-            <span>Regional Alternate</span>
-        </div>
-        <div class="w_center w_55">
-            <div class="progress">
-                <div class="progress-bar" role="progressbar" ng-style="{'width': regionalAlternate + '%'}" style="background-color: #666666;"></div>
-            </div>
-        </div>
-        <div class="w_right w_20">
-            <span>{{regionalAlternate | number:3}}%</span>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="widget_summary">
-        <div class="w_left w_25">
-            <span>Regional Denied</span>
-        </div>
-        <div class="w_center w_55">
-            <div class="progress">
-                <div class="progress-bar" role="progressbar" ng-style="{'width': regionalDenied + '%'}" style="background-color: #666666;"></div>
-            </div>
-        </div>
-        <div class="w_right w_20">
-            <span>{{regionalDenied | number:3}}%</span>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/service/application/ApplicationService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/service/application/ApplicationService.js b/traffic_ops/experimental/ui/app/src/common/service/application/ApplicationService.js
deleted file mode 100644
index 1fde86d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/service/application/ApplicationService.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ApplicationService = function($rootScope, $anchorScroll, $http) {
-
-    this.startup = function() {
-        // anything you need to do at startup
-    };
-
-    $rootScope.$on("$viewContentLoaded", function() {
-        $anchorScroll(); // scrolls window to top
-    });
-
-    var init = function() {
-        $http.defaults.withCredentials = true;
-    };
-    init();
-
-};
-
-ApplicationService.$inject = ['$rootScope', '$anchorScroll', '$http'];
-module.exports = ApplicationService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/service/application/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/service/application/index.js b/traffic_ops/experimental/ui/app/src/common/service/application/index.js
deleted file mode 100644
index fa62619..0000000
--- a/traffic_ops/experimental/ui/app/src/common/service/application/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.application', [])
-    .service('applicationService', require('./ApplicationService'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/service/utils/DateUtils.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/service/utils/DateUtils.js b/traffic_ops/experimental/ui/app/src/common/service/utils/DateUtils.js
deleted file mode 100644
index e554d02..0000000
--- a/traffic_ops/experimental/ui/app/src/common/service/utils/DateUtils.js
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var DateUtils = function() {
-
-	this.dateFormat = function () {
-		// source: http://blog.stevenlevithan.com/archives/date-time-format
-		var	token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
-			timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
-			timezoneClip = /[^-+\dA-Z]/g,
-			pad = function (val, len) {
-				val = String(val);
-				len = len || 2;
-				while (val.length < len) val = "0" + val;
-				return val;
-			};
-
-		// Regexes and supporting functions are cached through closure
-		return function (date, mask, utc) {
-			var dF = this.dateFormat;
-
-			// You can't provide utc if you skip other args (use the "UTC:" mask prefix)
-			if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
-				mask = date;
-				date = undefined;
-			}
-
-			// Passing date through Date applies Date.parse, if necessary
-			date = date ? new Date(date) : new Date;
-			if (isNaN(date)) throw SyntaxError("invalid date");
-
-			mask = String(dF.masks[mask] || mask || dF.masks["default"]);
-
-			// Allow setting the utc argument via the mask
-			if (mask.slice(0, 4) == "UTC:") {
-				mask = mask.slice(4);
-				utc = true;
-			}
-
-			var	_ = utc ? "getUTC" : "get",
-				d = date[_ + "Date"](),
-				D = date[_ + "Day"](),
-				m = date[_ + "Month"](),
-				y = date[_ + "FullYear"](),
-				H = date[_ + "Hours"](),
-				M = date[_ + "Minutes"](),
-				s = date[_ + "Seconds"](),
-				L = date[_ + "Milliseconds"](),
-				o = utc ? 0 : date.getTimezoneOffset(),
-				flags = {
-					d:    d,
-					dd:   pad(d),
-					ddd:  dF.i18n.dayNames[D],
-					dddd: dF.i18n.dayNames[D + 7],
-					m:    m + 1,
-					mm:   pad(m + 1),
-					mmm:  dF.i18n.monthNames[m],
-					mmmm: dF.i18n.monthNames[m + 12],
-					yy:   String(y).slice(2),
-					yyyy: y,
-					h:    H % 12 || 12,
-					hh:   pad(H % 12 || 12),
-					H:    H,
-					HH:   pad(H),
-					M:    M,
-					MM:   pad(M),
-					s:    s,
-					ss:   pad(s),
-					l:    pad(L, 3),
-					L:    pad(L > 99 ? Math.round(L / 10) : L),
-					t:    H < 12 ? "a"  : "p",
-					tt:   H < 12 ? "am" : "pm",
-					T:    H < 12 ? "A"  : "P",
-					TT:   H < 12 ? "AM" : "PM",
-					Z:    utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
-					o:    (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
-					S:    ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
-				};
-
-			return mask.replace(token, function ($0) {
-				return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
-			});
-		};
-	}();
-
-	this.dateFormat.masks = {
-		"default":      "ddd mmm dd yyyy HH:MM:ss",
-		shortDate:      "m/d/yy",
-		mediumDate:     "mmm d, yyyy",
-		longDate:       "mmmm d, yyyy",
-		fullDate:       "dddd, mmmm d, yyyy",
-		shortTime:      "h:MM TT",
-		mediumTime:     "h:MM:ss TT",
-		longTime:       "h:MM:ss TT Z",
-		isoDate:        "yyyy-mm-dd",
-		isoTime:        "HH:MM:ss",
-		isoDateTime:    "yyyy-mm-dd'T'HH:MM:ss",
-		isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
-	};
-
-	this.dateFormat.i18n = {
-		dayNames: [
-			"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
-			"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
-		],
-		monthNames: [
-			"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
-			"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
-		]
-	};
-
-};
-
-DateUtils.$inject = [];
-module.exports = DateUtils;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/service/utils/FormUtils.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/service/utils/FormUtils.js b/traffic_ops/experimental/ui/app/src/common/service/utils/FormUtils.js
deleted file mode 100644
index e930043..0000000
--- a/traffic_ops/experimental/ui/app/src/common/service/utils/FormUtils.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormUtils = function() {
-
-    this.hasError = function(input) {
-        return input && !input.$focused && input.$dirty && input.$invalid;
-    };
-
-    this.hasPropertyError = function(input, property) {
-        return input && !input.$focused && input.$dirty && input.$error[property];
-    };
-
-};
-
-FormUtils.$inject = [];
-module.exports = FormUtils;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/service/utils/LocationUtils.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/service/utils/LocationUtils.js b/traffic_ops/experimental/ui/app/src/common/service/utils/LocationUtils.js
deleted file mode 100644
index 8defa68..0000000
--- a/traffic_ops/experimental/ui/app/src/common/service/utils/LocationUtils.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var LocationUtils = function($location) {
-
-    this.navigateToPath = function(path) {
-        $location.url(path);
-    };
-
-};
-
-LocationUtils.$inject = ['$location'];
-module.exports = LocationUtils;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/service/utils/NumberUtils.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/service/utils/NumberUtils.js b/traffic_ops/experimental/ui/app/src/common/service/utils/NumberUtils.js
deleted file mode 100644
index 9a66563..0000000
--- a/traffic_ops/experimental/ui/app/src/common/service/utils/NumberUtils.js
+++ /dev/null
@@ -1,80 +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 NumberUtils = function($filter) {
-
-	var k = 1000,
-		sizes = ['B', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb'];
-
-	this.addCommas = function(nStr)
-	{
-		nStr += '';
-		x = nStr.split('.');
-		x1 = x[0];
-		x2 = x.length > 1 ? '.' + x[1] : '';
-		var rgx = /(\d+)(\d{3})/;
-		while (rgx.test(x1)) {
-			x1 = x1.replace(rgx, '$1' + ',' + '$2');
-		}
-		return x1 + x2;
-	};
-
-	/**
-	 * This function takes big scary kilobit numbers and 'shrinks' them to a friendly version
-	 * i.e. 10,000 kilobits is easier read as 10 megabits...
-	 */
-	this.shrink = function(kilounits) {
-		if (!angular.isNumber(kilounits) || kilounits == 0) return [ 0, 'Kb' ];
-		var units = kilounits * 1000;
-		var i = Math.floor(Math.log(units) / Math.log(k));
-		if (i < 1) { i = 1 } // kilobits is the lowest we will go
-		if (i > 5) { i = 5 } // petabits is the highest we will go
-		return [ Math.round((units / Math.pow(k, i)) * 100) / 100, sizes[i] ];
-	};
-
-	this.convertTo = function(kilounits, size) {
-		if (!angular.isNumber(kilounits)) return null;
-		if (kilounits == 0) return 0;
-		var units = kilounits * 1000;
-		var i = sizes.indexOf(size);
-		if (i == -1) {
-			return 0;
-		}
-		return Math.round((units / Math.pow(k, i)) * 100) / 100;
-	};
-
-	this.average = function(arr)
-	{
-		if (!angular.isArray(arr) || arr.length == 0 ) return 0;
-		return _.reduce(arr, function(memo, num) {
-				return memo + num;
-			}, 0) / arr.length;
-	}
-
-	this.ratio = function(numerator, denominator)
-	{
-		if (numerator === 0 || denominator === 0) {
-			return 'N/A';
-		} else {
-			return $filter('number')(numerator/denominator, 2) + ':1';
-		}
-	}
-
-};
-
-NumberUtils.$inject = ['$filter'];
-module.exports = NumberUtils;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/service/utils/ServerUtils.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/service/utils/ServerUtils.js b/traffic_ops/experimental/ui/app/src/common/service/utils/ServerUtils.js
deleted file mode 100644
index a4d2c4c..0000000
--- a/traffic_ops/experimental/ui/app/src/common/service/utils/ServerUtils.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ServerUtils = function() {
-
-	this.isOffline = function(status) {
-		return (status == 'OFFLINE' || status == 'ADMIN_DOWN');
-	};
-
-	this.offlineReason = function(server) {
-		return (server.offlineReason) ? server.offlineReason : 'None';
-	};
-
-};
-
-ServerUtils.$inject = [];
-module.exports = ServerUtils;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/service/utils/StringUtils.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/service/utils/StringUtils.js b/traffic_ops/experimental/ui/app/src/common/service/utils/StringUtils.js
deleted file mode 100644
index 2e5bb38..0000000
--- a/traffic_ops/experimental/ui/app/src/common/service/utils/StringUtils.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormUtils = function() {
-
-    this.labelize = function(string) {
-        return string.replace(/([A-Z])/g, ' $1').replace(/^./, function(str){ return str.toUpperCase(); });
-    };
-
-};
-
-FormUtils.$inject = [];
-module.exports = FormUtils;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/service/utils/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/service/utils/index.js b/traffic_ops/experimental/ui/app/src/common/service/utils/index.js
deleted file mode 100644
index ee06536..0000000
--- a/traffic_ops/experimental/ui/app/src/common/service/utils/index.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.utils', [])
-    .service('dateUtils', require('./DateUtils'))
-    .service('formUtils', require('./FormUtils'))
-    .service('locationUtils', require('./LocationUtils'))
-    .service('numberUtils', require('./NumberUtils'))
-    .service('serverUtils', require('./ServerUtils'))
-    .service('stringUtils', require('./StringUtils'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/templates/master.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/templates/master.tpl.html b/traffic_ops/experimental/ui/app/src/common/templates/master.tpl.html
deleted file mode 100644
index a1e5a94..0000000
--- a/traffic_ops/experimental/ui/app/src/common/templates/master.tpl.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="main_container">
-
-    <!-- navigation -->
-    <div class="main-nav col-md-3" ui-view="navigation"></div>
-
-    <!-- header -->
-    <div class="top_nav" ui-view="header"></div>
-
-    <!-- page content -->
-    <div class="main-content" role="main">
-
-        <!-- messages -->
-        <div ui-view="message"></div>
-
-        <!-- the content -->
-        <div ui-view="content"></div>
-
-    </div>
-
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/index.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/index.html b/traffic_ops/experimental/ui/app/src/index.html
deleted file mode 100644
index a62a648..0000000
--- a/traffic_ops/experimental/ui/app/src/index.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<!doctype html>
-
-    <head>
-
-        <title>Traffic Ops</title>
-
-        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-        <meta charset="utf-8">
-        <meta http-equiv="X-UA-Compatible" content="IE=edge">
-        <meta name="description" content="">
-        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
-
-        <link rel="shortcut icon" href="resources/assets/images/favicon.png" type="image/x-icon" />
-        <link rel="stylesheet" media="all" href="resources/styles/theme.css">
-        <link rel="stylesheet" media="all" href="resources/styles/loading.css">
-        <link rel="stylesheet" media="all" href="resources/styles/main.css">
-        <link rel="stylesheet" media="all" href="resources/assets/css/custom.css">
-
-        <link rel="stylesheet" media="all" href="resources/assets/css/jquery.dataTables.min.css">
-
-    </head>
-
-    <body class="nav-md" ng-app="trafficPortal">
-
-        <div class="app container body" ui-view></div>
-
-        <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.js"></script>
-        <script src="https://cdnjs.cloudflare.com/ajax/libs/jsdiff/3.2.0/diff.js"></script>
-
-        <script src="resources/assets/js/shared-libs.js"></script>
-        <script src="resources/assets/js/app.js"></script>
-        <script src="resources/assets/js/config.js"></script>
-
-        <script src="resources/assets/js/underscore-min_1.8.3.js"></script>
-        <script src="resources/assets/js/jquery.dataTables.min.js"></script>
-        <script src="resources/assets/js/ng-map_1.17.6.min.js"></script>
-
-    </body>
-
-</html>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/AdminController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/AdminController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/AdminController.js
deleted file mode 100644
index 54d348c..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/AdminController.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var AdminController = function() {};
-
-AdminController.$inject = [];
-module.exports = AdminController;

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/asns/AsnsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/asns/AsnsController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/asns/AsnsController.js
deleted file mode 100644
index c3e10f8..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/asns/AsnsController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var AsnsController = function() {
-};
-
-AsnsController.$inject = [];
-module.exports = AsnsController;

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/CdnsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/CdnsController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/CdnsController.js
deleted file mode 100644
index 9f121b0..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/CdnsController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var CdnsController = function() {
-};
-
-CdnsController.$inject = [];
-module.exports = CdnsController;

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/config/ConfigController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/config/ConfigController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/config/ConfigController.js
deleted file mode 100644
index 0615ea6..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/config/ConfigController.js
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ConfigController = function(cdn, currentSnapshot, newSnapshot, $scope, $state, $timeout, $uibModal, locationUtils, cdnService) {
-
-	$scope.cdn = cdn;
-
-	var oldConfig = currentSnapshot.config || null,
-		newConfig = newSnapshot.config || null;
-
-	var oldContentRouters = currentSnapshot.contentRouters || null,
-		newContentRouters = newSnapshot.contentRouters || null;
-
-	var oldMonitors = currentSnapshot.monitors || null,
-		newMonitors = newSnapshot.monitors || null;
-
-	var oldContentServers = currentSnapshot.contentServers || null,
-		newContentServers = newSnapshot.contentServers || null;
-
-	var oldDeliveryServices = currentSnapshot.deliveryServices || null,
-		newDeliveryServices = newSnapshot.deliveryServices || null;
-
-	var oldEdgeLocations = currentSnapshot.edgeLocations || null,
-		newEdgeLocations = newSnapshot.edgeLocations || null;
-
-	var oldStats = currentSnapshot.stats || null,
-		newStats = newSnapshot.stats || null;
-
-	var performDiff = function(oldJSON, newJSON, destination) {
-		var div = null,
-			prepend = '',
-			added = 0,
-			removed = 0;
-
-		var display = document.getElementById(destination),
-			fragment = document.createDocumentFragment();
-
-		if (oldJSON) {
-			var diff = JsDiff.diffJson(oldJSON, newJSON);
-			diff.forEach(function(part){
-				if (part.added) {
-					added++;
-				} else if (part.removed) {
-					removed++;
-				}
-				prepend = part.added ? '++' : part.removed ? '--' : '';
-				div = document.createElement('div');
-				div.className = part.added ? 'added' : part.removed ? 'removed' : 'no-change';
-
-				div.appendChild(document.createTextNode(prepend + part.value));
-				fragment.appendChild(div);
-			});
-
-			$scope[destination + "Count"].added = added;
-			$scope[destination + "Count"].removed = removed;
-			display.innerHTML = '';
-			display.appendChild(fragment);
-		} else {
-			display.innerHTML = 'Diff failed. You may need to perform your first snapshot.';
-		}
-
-	};
-
-	var snapshot = function() {
-		cdnService.snapshot(cdn);
-	};
-
-	$scope.configCount = {
-		added: 0,
-		removed: 0,
-		templateUrl: 'configPopoverTemplate.html'
-	};
-
-	$scope.contentRoutersCount = {
-		added: 0,
-		removed: 0,
-		templateUrl: 'crPopoverTemplate.html'
-	};
-
-	$scope.monitorsCount = {
-		added: 0,
-		removed: 0,
-		templateUrl: 'mPopoverTemplate.html'
-	};
-
-	$scope.contentServersCount = {
-		added: 0,
-		removed: 0,
-		templateUrl: 'csPopoverTemplate.html'
-	};
-
-	$scope.deliveryServicesCount = {
-		added: 0,
-		removed: 0,
-		templateUrl: 'dsPopoverTemplate.html'
-	};
-
-	$scope.edgeLocationsCount = {
-		added: 0,
-		removed: 0,
-		templateUrl: 'elPopoverTemplate.html'
-	};
-
-	$scope.statsCount = {
-		added: 0,
-		removed: 0,
-		templateUrl: 'statsPopoverTemplate.html'
-	};
-
-	$scope.diffConfig = function(timeout) {
-		$('#config').html('<i class="fa fa-refresh fa-spin fa-1x fa-fw"></i> Generating diff...');
-		$timeout(function() {
-			performDiff(oldConfig, newConfig, 'config');
-		}, timeout);
-	};
-
-	$scope.diffContentRouters = function(timeout) {
-		$('#contentRouters').html('<i class="fa fa-refresh fa-spin fa-1x fa-fw"></i> Generating diff...');
-		$timeout(function() {
-			performDiff(oldContentRouters, newContentRouters, 'contentRouters');
-		}, timeout);
-	};
-
-	$scope.diffMonitors = function(timeout) {
-		$('#monitors').html('<i class="fa fa-refresh fa-spin fa-1x fa-fw"></i> Generating diff...');
-		$timeout(function() {
-			performDiff(oldMonitors, newMonitors, 'monitors');
-		}, timeout);
-	};
-
-	$scope.diffContentServers = function(timeout) {
-		$('#contentServers').html('<i class="fa fa-refresh fa-spin fa-1x fa-fw"></i> Generating diff...');
-		$timeout(function() {
-			performDiff(oldContentServers, newContentServers, 'contentServers');
-		}, timeout);
-	};
-
-	$scope.diffDeliveryServices = function(timeout) {
-		$('#deliveryServices').html('<i class="fa fa-refresh fa-spin fa-1x fa-fw"></i> Generating diff...');
-		$timeout(function() {
-			performDiff(oldDeliveryServices, newDeliveryServices, 'deliveryServices');
-		}, timeout);
-	};
-
-	$scope.diffEdgeLocations = function(timeout) {
-		$('#edgeLocations').html('<i class="fa fa-refresh fa-spin fa-1x fa-fw"></i> Generating diff...');
-		$timeout(function() {
-			performDiff(oldEdgeLocations, newEdgeLocations, 'edgeLocations');
-		}, timeout);
-	};
-
-	$scope.diffStats = function(timeout) {
-		$('#stats').html('<i class="fa fa-refresh fa-spin fa-1x fa-fw"></i> Generating diff...');
-		$timeout(function() {
-			performDiff(oldStats, newStats, 'stats');
-		}, timeout);
-	};
-
-	$scope.confirmSnapshot = function(cdn) {
-		var params = {
-			title: 'Perform Snapshot',
-			message: 'Are you sure you want to snapshot the ' + cdn.name + ' config?'
-		};
-		var modalInstance = $uibModal.open({
-			templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html',
-			controller: 'DialogConfirmController',
-			size: 'sm',
-			resolve: {
-				params: function () {
-					return params;
-				}
-			}
-		});
-		modalInstance.result.then(function() {
-			snapshot();
-		}, function () {
-			// do nothing
-		});
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$scope.diffConfig(0);
-		$scope.diffContentRouters(0);
-		$scope.diffMonitors(0);
-		$scope.diffContentServers(0);
-		$scope.diffDeliveryServices(0);
-		$scope.diffEdgeLocations(0);
-		$scope.diffStats(0);
-	});
-
-};
-
-ConfigController.$inject = ['cdn', 'currentSnapshot', 'newSnapshot', '$scope', '$state', '$timeout', '$uibModal', 'locationUtils', 'cdnService'];
-module.exports = ConfigController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/config/_config.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/config/_config.scss b/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/config/_config.scss
deleted file mode 100644
index e75548e..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/config/_config.scss
+++ /dev/null
@@ -1,50 +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.
-
-*/
-
-#snapshotContainer {
-
-  pre {
-    margin: 20px 0 20px 0;
-  }
-
-  .nav-tabs {
-    border-bottom: 1px solid #ddd;
-  }
-
-  .tab {
-    padding: 20px 20px 0 20px;
-  }
-
-  .tab-heading {
-    font-size: 17px;
-  }
-
-  .added {
-    background-color: #dff0d8;
-    color: #3c763d;
-  }
-
-  .removed {
-    background-color: #f2dede;
-    color: #a94442;
-  }
-
-  .no-change {
-    color: grey;
-  }
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/config/config.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/config/config.tpl.html b/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/config/config.tpl.html
deleted file mode 100644
index 75f26bb..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/cdns/config/config.tpl.html
+++ /dev/null
@@ -1,124 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/cdns')">CDNs</a></li>
-            <li><a ng-click="navigateToPath('/admin/cdns/' + cdn.id)">{{::cdn.name}}</a></li>
-            <li class="active">Config Changes</li>
-        </ol>
-        <div class="pull-right" ng-show="!settings.isNew">
-            <button type="button" class="btn btn-default" ng-click="navigateToPath('/admin/cdns/' + cdn.id)">Cancel</button>
-            <button class="btn btn-primary" title="Snapshot {{cdn.name}} Config" ng-click="confirmSnapshot(cdn)"><i class="fa fa-camera"></i>&nbsp;&nbsp;Perform Snapshot</button>
-        </div>
-
-        <div class="clearfix"></div>
-    </div>
-    <div id="snapshotContainer" class="x_content">
-        <uib-tabset active="active" justified="true">
-            <uib-tab index="0" class="tab" ng-click="diffConfig(500)">
-                <uib-tab-heading uib-popover-template="configCount.templateUrl" popover-title="{{configCount.added + configCount.removed}} Total Changes" popover-trigger="mouseenter" popover-placement="top" popover-append-to-body="true">
-                    General [ {{configCount.added}} | {{configCount.removed}} ]
-                </uib-tab-heading>
-                <pre id="config"></pre>
-            </uib-tab>
-            <uib-tab index="1" class="tab" ng-click="diffContentRouters(500)">
-                <uib-tab-heading uib-popover-template="contentRoutersCount.templateUrl" popover-title="{{contentRoutersCount.added + contentRoutersCount.removed}} Total Changes" popover-trigger="mouseenter" popover-placement="top" popover-append-to-body="true">
-                    Traffic Routers [ {{contentRoutersCount.added}} | {{contentRoutersCount.removed}} ]
-                </uib-tab-heading>
-                <pre id="contentRouters"></pre>
-            </uib-tab>
-            <uib-tab index="1" class="tab" ng-click="diffMonitors(500)">
-                <uib-tab-heading uib-popover-template="monitorsCount.templateUrl" popover-title="{{monitorsCount.added + monitorsCount.removed}} Total Changes" popover-trigger="mouseenter" popover-placement="top" popover-append-to-body="true">
-                    Traffic Monitors [ {{monitorsCount.added}} | {{monitorsCount.removed}} ]
-                </uib-tab-heading>
-                <pre id="monitors"></pre>
-            </uib-tab>
-            <uib-tab index="2" class="tab" ng-click="diffContentServers(500)">
-                <uib-tab-heading uib-popover-template="contentServersCount.templateUrl" popover-title="{{contentServersCount.added + contentServersCount.removed}} Total Changes" popover-trigger="mouseenter" popover-placement="top" popover-append-to-body="true">
-                    Traffic Servers [ {{contentServersCount.added}} | {{contentServersCount.removed}} ]
-                </uib-tab-heading>
-                <pre id="contentServers"></pre>
-            </uib-tab>
-            <uib-tab index="3" class="tab" ng-click="diffDeliveryServices(500)">
-                <uib-tab-heading uib-popover-template="deliveryServicesCount.templateUrl" popover-title="{{deliveryServicesCount.added + deliveryServicesCount.removed}} Total Changes" popover-trigger="mouseenter" popover-placement="top" popover-append-to-body="true">
-                    Delivery Services [ {{deliveryServicesCount.added}} | {{deliveryServicesCount.removed}} ]
-                </uib-tab-heading>
-                <pre id="deliveryServices"></pre>
-            </uib-tab>
-            <uib-tab index="4" class="tab" ng-click="diffEdgeLocations(500)">
-                <uib-tab-heading uib-popover-template="edgeLocationsCount.templateUrl" popover-title="{{edgeLocationsCount.added + edgeLocationsCount.removed}} Total Changes" popover-trigger="mouseenter" popover-placement="top" popover-append-to-body="true">
-                    Edge Cache Groups [ {{edgeLocationsCount.added}} | {{edgeLocationsCount.removed}} ]
-                </uib-tab-heading>
-                <pre id="edgeLocations"></pre>
-            </uib-tab>
-            <uib-tab index="5" class="tab" ng-click="diffStats(500)">
-                <uib-tab-heading uib-popover-template="statsCount.templateUrl" popover-title="{{statsCount.added + statsCount.removed}} Total Changes" popover-trigger="mouseenter" popover-placement="top" popover-append-to-body="true">
-                    Stats [ {{statsCount.added}} | {{statsCount.removed}} ]
-                </uib-tab-heading>
-                <pre id="stats"></pre>
-            </uib-tab>
-        </uib-tabset>
-        <div class="modal-footer">
-            <button type="button" class="btn btn-default" ng-click="navigateToPath('/admin/cdns/' + cdn.id)">Cancel</button>
-            <button class="btn btn-primary" title="Snapshot {{cdn.name}} Config" ng-click="confirmSnapshot(cdn)"><i class="fa fa-camera"></i>&nbsp;&nbsp;Perform Snapshot</button>
-        </div>
-    </div>
-</div>
-
-<!--- start: templates for popovers --->
-
-<script type="text/ng-template" id="configPopoverTemplate.html">
-    <div>{{configCount.added}} additions (++)</div>
-    <div>{{configCount.removed}} removals (--)</div>
-</script>
-
-<script type="text/ng-template" id="crPopoverTemplate.html">
-    <div>{{contentRoutersCount.added}} additions (++)</div>
-    <div>{{contentRoutersCount.removed}} removals (--)</div>
-</script>
-
-<script type="text/ng-template" id="mPopoverTemplate.html">
-    <div>{{monitorsCount.added}} additions (++)</div>
-    <div>{{monitorsCount.removed}} removals (--)</div>
-</script>
-
-<script type="text/ng-template" id="csPopoverTemplate.html">
-    <div>{{contentServersCount.added}} additions (++)</div>
-    <div>{{contentServersCount.removed}} removals (--)</div>
-</script>
-
-<script type="text/ng-template" id="dsPopoverTemplate.html">
-    <div>{{deliveryServicesCount.added}} additions (++)</div>
-    <div>{{deliveryServicesCount.removed}} removals (--)</div>
-</script>
-
-<script type="text/ng-template" id="elPopoverTemplate.html">
-    <div>{{edgeLocationsCount.added}} additions (++)</div>
-    <div>{{edgeLocationsCount.removed}} removals (--)</div>
-</script>
-
-<script type="text/ng-template" id="statsPopoverTemplate.html">
-    <div>{{statsCount.added}} additions (++)</div>
-    <div>{{statsCount.removed}} removals (--)</div>
-</script>
-
-<!--- end: templates for popovers --->
-



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/table.deliveryServiceRegexes.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/table.deliveryServiceRegexes.tpl.html b/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/table.deliveryServiceRegexes.tpl.html
new file mode 100644
index 0000000..62ee3c5
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/table.deliveryServiceRegexes.tpl.html
@@ -0,0 +1,53 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
+            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
+            <li class="active">Regexes</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Create Delivery Service Regex" ng-click="createRegex(deliveryService.id)"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="regexesTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>type</th>
+                <th>pattern</th>
+                <th>order</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editRegex(deliveryService.id, regex.id)" ng-repeat="regex in ::regexes | orderBy:['setNumber']">
+                <td>{{::regex.typeName}}</td>
+                <td>{{::regex.pattern}}</td>
+                <td>{{::regex.setNumber}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceServers/TableDSServersUnassignedController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceServers/TableDSServersUnassignedController.js b/traffic_portal/app/src/common/modules/table/deliveryServiceServers/TableDSServersUnassignedController.js
new file mode 100644
index 0000000..ac7c42f
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceServers/TableDSServersUnassignedController.js
@@ -0,0 +1,107 @@
+/*
+ * 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 TableDSServersUnassignedController = function(deliveryService, eligibleServers, assignedServers, $scope, $uibModalInstance) {
+
+	var selectedServerIds = [];
+
+	var addServer = function(serverId) {
+		if (_.indexOf(selectedServerIds, serverId) == -1) {
+			selectedServerIds.push(serverId);
+		}
+	};
+
+	var removeServer = function(serverId) {
+		selectedServerIds = _.without(selectedServerIds, serverId);
+	};
+
+	var addAll = function() {
+		markServers(true);
+		selectedServerIds = _.pluck(eligibleServers, 'id');
+	};
+
+	var removeAll = function() {
+		markServers(false);
+		selectedServerIds = [];
+	};
+
+	var markServers = function(selected) {
+		$scope.selectedServers = _.map(eligibleServers, function(server) {
+			server['selected'] = selected;
+			return server;
+		});
+	};
+
+	$scope.deliveryService = deliveryService;
+
+	$scope.selectedServers = _.map(eligibleServers, function(eligibleServer) {
+		var isAssigned = _.find(assignedServers, function(assignedServer) { return assignedServer.id == eligibleServer.id });
+		if (isAssigned) {
+			eligibleServer['selected'] = true; // so the checkbox will be checked
+			selectedServerIds.push(eligibleServer.id); // so the server is added to selected servers
+		}
+		return eligibleServer;
+	});
+
+	$scope.allSelected = function() {
+		return eligibleServers.length == selectedServerIds.length;
+	};
+
+	$scope.selectAll = function($event) {
+		var checkbox = $event.target;
+		if (checkbox.checked) {
+			addAll();
+		} else {
+			removeAll();
+		}
+	};
+
+	$scope.updateServers = function($event, serverId) {
+		var checkbox = $event.target;
+		if (checkbox.checked) {
+			addServer(serverId);
+		} else {
+			removeServer(serverId);
+		}
+	};
+
+	$scope.submit = function() {
+		$uibModalInstance.close(selectedServerIds);
+	};
+
+	$scope.cancel = function () {
+		$uibModalInstance.dismiss('cancel');
+	};
+
+	angular.element(document).ready(function () {
+		$('#dsServersUnassignedTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"order": [[ 1, 'asc' ]],
+			"columnDefs": [
+				{ 'orderable': false, 'targets': 0 },
+				{ "width": "5%", "targets": 0 }
+			]
+		});
+	});
+
+};
+
+TableDSServersUnassignedController.$inject = ['deliveryService', 'eligibleServers', 'assignedServers', '$scope', '$uibModalInstance'];
+module.exports = TableDSServersUnassignedController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js b/traffic_portal/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js
new file mode 100644
index 0000000..f27aaad
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceServers/TableDeliveryServiceServersController.js
@@ -0,0 +1,86 @@
+/*
+ * 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 TableDeliveryServiceServersController = function(deliveryService, servers, $scope, $state, $uibModal, locationUtils, serverUtils, deliveryServiceService) {
+
+	$scope.deliveryService = deliveryService;
+
+	$scope.servers = servers;
+
+	$scope.removeServer = function(dsId, serverId) {
+		deliveryServiceService.deleteDeliveryServiceServer(dsId, serverId)
+			.then(
+				function() {
+					$scope.refresh();
+				}
+			);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.selectServers = function() {
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/table/deliveryServiceServers/table.dsServersUnassigned.tpl.html',
+			controller: 'TableDSServersUnassignedController',
+			size: 'lg',
+			resolve: {
+				deliveryService: function() {
+					return deliveryService;
+				},
+				eligibleServers: function(serverService) {
+					return serverService.getEligibleDeliveryServiceServers(deliveryService.id);
+				},
+				assignedServers: function() {
+					return servers;
+				}
+			}
+		});
+		modalInstance.result.then(function(selectedServerIds) {
+			deliveryServiceService.assignDeliveryServiceServers(deliveryService.id, selectedServerIds)
+				.then(
+					function() {
+						$scope.refresh();
+					}
+				);
+		}, function () {
+			// do nothing
+		});
+	};
+
+
+	$scope.isOffline = serverUtils.isOffline;
+
+	$scope.offlineReason = serverUtils.offlineReason;
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#serversTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableDeliveryServiceServersController.$inject = ['deliveryService', 'servers', '$scope', '$state', '$uibModal', 'locationUtils', 'serverUtils', 'deliveryServiceService'];
+module.exports = TableDeliveryServiceServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceServers/index.js b/traffic_portal/app/src/common/modules/table/deliveryServiceServers/index.js
new file mode 100644
index 0000000..029d37b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceServers/index.js
@@ -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.
+ */
+
+module.exports = angular.module('trafficPortal.table.deliveryServiceServers', [])
+	.controller('TableDeliveryServiceServersController', require('./TableDeliveryServiceServersController'))
+	.controller('TableDSServersUnassignedController', require('./TableDSServersUnassignedController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html b/traffic_portal/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html
new file mode 100644
index 0000000..b93bb32
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html
@@ -0,0 +1,78 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
+            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
+            <li class="active">Servers</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Link Servers to Delivery Service" ng-click="selectServers()"><i class="fa fa-link"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="serversTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Update?</th>
+                <th>hostName</th>
+                <th>domainName</th>
+                <th>ipAddress</th>
+                <th>ip6Address</th>
+                <th>status</th>
+                <th>type</th>
+                <th>profile</th>
+                <th>cdn</th>
+                <th>cachegroup</th>
+                <th></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="server in ::servers" ng-class="::{'active': server.updPending}">
+                <td class="update-column">
+                    <i class="fa fa-flag" ng-if="server.updPending"></i>
+                    <i class="fa fa-ban" ng-if="!server.updPending"></i>
+                </td>
+                <td>{{::server.hostName}}</td>
+                <td>{{::server.domainName}}</td>
+                <td>{{::server.ipAddress}}</td>
+                <td>{{::server.ip6Address}}</td>
+                <td>
+                    <span ng-if="!isOffline(server.status)">{{::server.status}}</span>
+                    <span ng-if="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
+                </td>
+                <td>{{::server.type}}</td>
+                <td>{{::server.profile}}</td>
+                <td>{{::server.cdnName}}</td>
+                <td>{{::server.cachegroup}}</td>
+                <td><button type="button" class="btn btn-link" title="Unlink Server from Delivery Service" ng-click="removeServer(deliveryService.id, server.id)"><i class="fa fa-chain-broken"></i></button></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceServers/table.dsServersUnassigned.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceServers/table.dsServersUnassigned.tpl.html b/traffic_portal/app/src/common/modules/table/deliveryServiceServers/table.dsServersUnassigned.tpl.html
new file mode 100644
index 0000000..7c15cf1
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceServers/table.dsServersUnassigned.tpl.html
@@ -0,0 +1,49 @@
+<!--
+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="modal-header">
+    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+    <h3 class="modal-title">Assign Servers to {{::deliveryService.xmlId}}</h3>
+</div>
+<div class="modal-body">
+    <table id="dsServersUnassignedTable" class="table responsive-utilities jambo_table" style="table-layout:fixed; width:100%;">
+        <thead>
+        <tr class="headings">
+            <th style="padding-left: 10px;"><input type="checkbox" ng-click="selectAll($event)" ng-checked="allSelected()"></th>
+            <th>hostName</th>
+            <th>cachegroup</th>
+            <th>profile</th>
+        </tr>
+        </thead>
+        <tbody>
+        <tr ng-repeat="server in ::selectedServers">
+            <td><input type="checkbox" ng-click="updateServers($event, server.id)" ng-checked="server.selected"></td>
+            <td>{{::server.hostName}}</td>
+            <td>{{::server.cachegroup}}</td>
+            <td>{{::server.profile}}</td>
+        </tr>
+        </tbody>
+    </table>
+</div>
+<div class="modal-footer">
+    <button class="btn btn-link" ng-click="cancel()">cancel</button>
+    <button class="btn btn-primary" ng-click="submit()">Submit</button>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/TableDeliveryServiceStaticDnsEntriesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/TableDeliveryServiceStaticDnsEntriesController.js b/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/TableDeliveryServiceStaticDnsEntriesController.js
new file mode 100644
index 0000000..99f191d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/TableDeliveryServiceStaticDnsEntriesController.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.
+ */
+
+var TableDeliveryServiceStaticDnsEntriesController = function(deliveryService, staticDnsEntries, $scope, $state, locationUtils) {
+
+	$scope.deliveryService = deliveryService;
+
+	$scope.staticDnsEntries = staticDnsEntries;
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#staticDnsEntriesTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableDeliveryServiceStaticDnsEntriesController.$inject = ['deliveryService', 'staticDnsEntries', '$scope', '$state', 'locationUtils'];
+module.exports = TableDeliveryServiceStaticDnsEntriesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/index.js b/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/index.js
new file mode 100644
index 0000000..8de9a14
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.deliveryServiceStaticDnsEntries', [])
+	.controller('TableDeliveryServiceStaticDnsEntriesController', require('./TableDeliveryServiceStaticDnsEntriesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/table.deliveryServiceStaticDnsEntries.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/table.deliveryServiceStaticDnsEntries.tpl.html b/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/table.deliveryServiceStaticDnsEntries.tpl.html
new file mode 100644
index 0000000..1396158
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceStaticDnsEntries/table.deliveryServiceStaticDnsEntries.tpl.html
@@ -0,0 +1,58 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
+            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
+            <li class="active">Static DNS Entries</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="staticDnsEntriesTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>host</th>
+                <th>address</th>
+                <th>type</th>
+                <th>ttl</th>
+                <th>deliveryservice</th>
+                <th>cachegroup</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="staticDnsEntry in ::staticDnsEntries">
+                <td>{{::staticDnsEntry.host}}</td>
+                <td>{{::staticDnsEntry.address}}</td>
+                <td>{{::staticDnsEntry.type}}</td>
+                <td>{{::staticDnsEntry.ttl}}</td>
+                <td>{{::staticDnsEntry.deliveryservice}}</td>
+                <td>{{::staticDnsEntry.cachegroup}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/TableDeliveryServiceUsersController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/TableDeliveryServiceUsersController.js b/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/TableDeliveryServiceUsersController.js
new file mode 100644
index 0000000..f16131f
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/TableDeliveryServiceUsersController.js
@@ -0,0 +1,55 @@
+/*
+ * 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 TableDeliveryServiceUsersController = function(deliveryService, users, $scope, $state, locationUtils) {
+
+	$scope.deliveryService = deliveryService;
+
+	$scope.users = users;
+
+	$scope.addUser = function() {
+		alert('not hooked up yet: addUser to ds');
+	};
+
+	$scope.removeUser = function() {
+		alert('not hooked up yet: removeUser from ds');
+	};
+
+	$scope.isAdmin = function(user) {
+		return user.role == 4;
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#usersTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableDeliveryServiceUsersController.$inject = ['deliveryService', 'users', '$scope', '$state', 'locationUtils'];
+module.exports = TableDeliveryServiceUsersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/index.js b/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/index.js
new file mode 100644
index 0000000..6cf5b1e
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.deliveryServiceUsers', [])
+	.controller('TableDeliveryServiceUsersController', require('./TableDeliveryServiceUsersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/table.deliveryServiceUsers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/table.deliveryServiceUsers.tpl.html b/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/table.deliveryServiceUsers.tpl.html
new file mode 100644
index 0000000..2e9a21e
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceUsers/table.deliveryServiceUsers.tpl.html
@@ -0,0 +1,60 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
+            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
+            <li class="active">Users</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+            <button class="btn btn-primary" ng-click="addUser()">Add</button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="usersTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Full Name</th>
+                <th>Username</th>
+                <th>Email</th>
+                <th>Role</th>
+                <th></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editUser(user.id)" ng-repeat="user in ::users">
+                <td>{{::user.fullName}}</td>
+                <td>{{::user.username}}</td>
+                <td>{{::user.email}}</td>
+                <td>{{::user.rolename}}</td>
+                <td><button type="button" class="btn btn-link" title="Remove from Delivery Service" ng-click="removeUser()" ng-hide="isAdmin(user)"><i class="fa fa-trash-o"></i></button></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServices/TableDeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServices/TableDeliveryServicesController.js b/traffic_portal/app/src/common/modules/table/deliveryServices/TableDeliveryServicesController.js
new file mode 100644
index 0000000..44d82f8
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServices/TableDeliveryServicesController.js
@@ -0,0 +1,74 @@
+/*
+ * 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 TableDeliveryServicesController = function(deliveryServices, $scope, $state, $uibModal, locationUtils) {
+
+    $scope.deliveryServices = deliveryServices;
+
+    $scope.editDeliveryService = function(ds) {
+        var path = '/configure/delivery-services/' + ds.id + '?type=' + ds.type;
+        locationUtils.navigateToPath(path);
+    };
+
+    var createDeliveryService = function(typeName) {
+        var path = '/configure/delivery-services/new?type=' + typeName;
+        locationUtils.navigateToPath(path);
+    };
+
+    $scope.refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+    $scope.selectDSType = function() {
+        var params = {
+            title: 'Create Delivery Service',
+            message: "Please select a content routing type"
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+            controller: 'DialogSelectController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                },
+                collection: function(typeService) {
+                    return typeService.getTypes( { useInTable: 'deliveryservice'} );
+                }
+            }
+        });
+        modalInstance.result.then(function(type) {
+            createDeliveryService(type.name);
+        }, function () {
+            // do nothing
+        });
+    };
+
+    angular.element(document).ready(function () {
+        $('#deliveryServicesTable').dataTable({
+            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+            "iDisplayLength": 25,
+            "aaSorting": []
+        });
+    });
+
+};
+
+TableDeliveryServicesController.$inject = ['deliveryServices', '$scope', '$state', '$uibModal', 'locationUtils'];
+module.exports = TableDeliveryServicesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServices/index.js b/traffic_portal/app/src/common/modules/table/deliveryServices/index.js
new file mode 100644
index 0000000..9e75882
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServices/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.deliveryServices', [])
+    .controller('TableDeliveryServicesController', require('./TableDeliveryServicesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServices/table.deliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServices/table.deliveryServices.tpl.html b/traffic_portal/app/src/common/modules/table/deliveryServices/table.deliveryServices.tpl.html
new file mode 100644
index 0000000..3b97e89
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServices/table.deliveryServices.tpl.html
@@ -0,0 +1,65 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Delivery Services</li>
+        </ol>
+        <div class="pull-right" role="group" ng-if="!settings.isNew">
+            <button class="btn btn-primary" title="Create Delivery Service" ng-click="selectDSType()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="deliveryServicesTable" class="table responsive-utilities jambo_table">
+            <thead>
+                <tr class="headings">
+                    <th>xmlId</th>
+                    <th>orgServerFqdn</th>
+                    <th>active</th>
+                    <th>type</th>
+                    <th>protocol</th>
+                    <th>cdn</th>
+                    <th>ipv6RoutingEnabled</th>
+                    <th>dscp</th>
+                    <th>signed</th>
+                    <th>qstringIgnore</th>
+                </tr>
+            </thead>
+            <tbody>
+                <tr ng-click="editDeliveryService(deliveryService)" ng-repeat="deliveryService in ::deliveryServices">
+                    <td>{{::deliveryService.xmlId}}</td>
+                    <td>{{::deliveryService.orgServerFqdn}}</td>
+                    <td>{{::deliveryService.active}}</td>
+                    <td>{{::deliveryService.type}}</td>
+                    <td>{{::deliveryService.protocol}}</td>
+                    <td>{{::deliveryService.cdnName}}</td>
+                    <td>{{::deliveryService.ipv6RoutingEnabled}}</td>
+                    <td>{{::deliveryService.dscp}}</td>
+                    <td>{{::deliveryService.signed}}</td>
+                    <td>{{::deliveryService.qstringIgnore}}</td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/divisionRegions/TableDivisionRegionsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/divisionRegions/TableDivisionRegionsController.js b/traffic_portal/app/src/common/modules/table/divisionRegions/TableDivisionRegionsController.js
new file mode 100644
index 0000000..e953251
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/divisionRegions/TableDivisionRegionsController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableDivisionRegionsController = function(division, divisionRegions, $scope, $state, locationUtils) {
+
+	$scope.division = division;
+
+	$scope.divisionRegions = divisionRegions;
+
+	$scope.editRegion = function(id) {
+		locationUtils.navigateToPath('/admin/regions/' + id);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#regionsTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableDivisionRegionsController.$inject = ['division', 'divisionRegions', '$scope', '$state', 'locationUtils'];
+module.exports = TableDivisionRegionsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/divisionRegions/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/divisionRegions/index.js b/traffic_portal/app/src/common/modules/table/divisionRegions/index.js
new file mode 100644
index 0000000..785d4e9
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/divisionRegions/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.divisionRegions', [])
+	.controller('TableDivisionRegionsController', require('./TableDivisionRegionsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/divisionRegions/table.divisionRegions.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/divisionRegions/table.divisionRegions.tpl.html b/traffic_portal/app/src/common/modules/table/divisionRegions/table.divisionRegions.tpl.html
new file mode 100644
index 0000000..6f9ad6c
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/divisionRegions/table.divisionRegions.tpl.html
@@ -0,0 +1,52 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/divisions')">Divisions</a></li>
+            <li><a ng-click="navigateToPath('/admin/divisions/' + division.id)">{{::division.name}}</a></li>
+            <li class="active">Regions</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="regionsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+                <th>division</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editRegion(region.id)" ng-repeat="region in ::divisionRegions">
+                <td>{{::region.name}}</td>
+                <td>{{::region.divisionName}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/divisions/TableDivisionsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/divisions/TableDivisionsController.js b/traffic_portal/app/src/common/modules/table/divisions/TableDivisionsController.js
new file mode 100644
index 0000000..b4e5831
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/divisions/TableDivisionsController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableDivisionsController = function(divisions, $scope, $state, locationUtils) {
+
+    $scope.divisions = divisions;
+
+    $scope.editDivision = function(id) {
+        locationUtils.navigateToPath('/admin/divisions/' + id);
+    };
+
+    $scope.createDivision = function() {
+        locationUtils.navigateToPath('/admin/divisions/new');
+    };
+
+    $scope.refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+    angular.element(document).ready(function () {
+        $('#divisionsTable').dataTable({
+            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+            "iDisplayLength": 25,
+            "aaSorting": []
+        });
+    });
+
+};
+
+TableDivisionsController.$inject = ['divisions', '$scope', '$state', 'locationUtils'];
+module.exports = TableDivisionsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/divisions/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/divisions/index.js b/traffic_portal/app/src/common/modules/table/divisions/index.js
new file mode 100644
index 0000000..946f6b4
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/divisions/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.divisions', [])
+    .controller('TableDivisionsController', require('./TableDivisionsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/divisions/table.divisions.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/divisions/table.divisions.tpl.html b/traffic_portal/app/src/common/modules/table/divisions/table.divisions.tpl.html
new file mode 100644
index 0000000..47e1e4b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/divisions/table.divisions.tpl.html
@@ -0,0 +1,47 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Divisions</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Create Division" ng-click="createDivision()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="divisionsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editDivision(division.id)" ng-repeat="division in ::divisions">
+                <td>{{::division.name}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/jobs/TableJobsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/jobs/TableJobsController.js b/traffic_portal/app/src/common/modules/table/jobs/TableJobsController.js
new file mode 100644
index 0000000..4b708d4
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/jobs/TableJobsController.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.
+ */
+
+var TableJobsController = function(jobs, $scope, $state, locationUtils) {
+
+	$scope.jobs = jobs;
+
+	$scope.createJob = function() {
+		locationUtils.navigateToPath('/admin/jobs/new');
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	angular.element(document).ready(function () {
+		$('#jobsTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableJobsController.$inject = ['jobs', '$scope', '$state', 'locationUtils'];
+module.exports = TableJobsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/jobs/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/jobs/index.js b/traffic_portal/app/src/common/modules/table/jobs/index.js
new file mode 100644
index 0000000..65cc604
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/jobs/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.jobs', [])
+	.controller('TableJobsController', require('./TableJobsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/jobs/table.jobs.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/jobs/table.jobs.tpl.html b/traffic_portal/app/src/common/modules/table/jobs/table.jobs.tpl.html
new file mode 100644
index 0000000..e7de6fc
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/jobs/table.jobs.tpl.html
@@ -0,0 +1,55 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Invalidate Content Jobs</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-primary" title="Create Invalidate Content Job" ng-click="createJob()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="jobsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>deliveryService</th>
+                <th>assetUrl</th>
+                <th>parameters</th>
+                <th>start</th>
+                <th>createdBy</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="job in ::jobs">
+                <td>{{::job.deliveryService}}</td>
+                <td>{{::job.assetUrl}}</td>
+                <td>{{::job.parameters}}</td>
+                <td>{{::job.startTime}}</td>
+                <td>{{::job.createdBy}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/parameterCacheGroups/TableParameterCacheGroupsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/parameterCacheGroups/TableParameterCacheGroupsController.js b/traffic_portal/app/src/common/modules/table/parameterCacheGroups/TableParameterCacheGroupsController.js
new file mode 100644
index 0000000..fc3dbea
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/parameterCacheGroups/TableParameterCacheGroupsController.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.
+ */
+
+var TableParameterCacheGroupsController = function(parameter, cacheGroups, $scope, $state, locationUtils) {
+
+	$scope.parameter = parameter;
+
+	$scope.cacheGroups = cacheGroups;
+
+	$scope.addCacheGroup = function() {
+		alert('not hooked up yet: add cg to parameter');
+	};
+
+	$scope.removeCacheGroup = function() {
+		alert('not hooked up yet: remove cg from parameter');
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#cacheGroupsTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableParameterCacheGroupsController.$inject = ['parameter', 'cacheGroups', '$scope', '$state', 'locationUtils'];
+module.exports = TableParameterCacheGroupsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/parameterCacheGroups/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/parameterCacheGroups/index.js b/traffic_portal/app/src/common/modules/table/parameterCacheGroups/index.js
new file mode 100644
index 0000000..69f34a9
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/parameterCacheGroups/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.parameterCacheGroups', [])
+	.controller('TableParameterCacheGroupsController', require('./TableParameterCacheGroupsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/parameterCacheGroups/table.parameterCacheGroups.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/parameterCacheGroups/table.parameterCacheGroups.tpl.html b/traffic_portal/app/src/common/modules/table/parameterCacheGroups/table.parameterCacheGroups.tpl.html
new file mode 100644
index 0000000..575b75b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/parameterCacheGroups/table.parameterCacheGroups.tpl.html
@@ -0,0 +1,59 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/parameters')">Parameters</a></li>
+            <li><a ng-click="navigateToPath('/admin/parameters/' + parameter.id)">{{::parameter.name}}</a></li>
+            <li class="active">Cache Groups</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Add Cache Group" ng-click="addCacheGroup()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="cacheGroupsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+                <th>shortName</th>
+                <th>type</th>
+                <th>latitude</th>
+                <th>longitude</th>
+                <th></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="cacheGroup in ::cacheGroups">
+                <td>{{::cacheGroup.name}}</td>
+                <td>{{::cacheGroup.shortName}}</td>
+                <td>{{::cacheGroup.typeName}}</td>
+                <td>{{::cacheGroup.latitude}}</td>
+                <td>{{::cacheGroup.longitude}}</td>
+                <td><button type="button" class="btn btn-link" title="Remove Cache Group" ng-click="removeCacheGroup()"><i class="fa fa-trash-o"></i></button></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/parameterProfiles/TableParamProfilesUnassignedController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/parameterProfiles/TableParamProfilesUnassignedController.js b/traffic_portal/app/src/common/modules/table/parameterProfiles/TableParamProfilesUnassignedController.js
new file mode 100644
index 0000000..2aa585b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/parameterProfiles/TableParamProfilesUnassignedController.js
@@ -0,0 +1,69 @@
+/*
+ * 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 TableParamProfilesUnassignedController = function(parameter, profiles, $scope, $uibModalInstance) {
+
+	var selectedProfiles = [];
+
+	$scope.parameter = parameter;
+
+	$scope.unassignedProfiles = profiles;
+
+	var addProfile = function(profileId) {
+		if (_.indexOf(selectedProfiles, profileId) == -1) {
+			selectedProfiles.push(profileId);
+		}
+	};
+
+	var removeProfile = function(profileId) {
+		selectedProfiles = _.without(selectedProfiles, profileId);
+	};
+
+	$scope.updateProfiles = function($event, profileId) {
+		var checkbox = $event.target;
+		if (checkbox.checked) {
+			addProfile(profileId);
+		} else {
+			removeProfile(profileId);
+		}
+	};
+
+	$scope.submit = function() {
+		$uibModalInstance.close(selectedProfiles);
+	};
+
+	$scope.cancel = function () {
+		$uibModalInstance.dismiss('cancel');
+	};
+
+	angular.element(document).ready(function () {
+		$('#paramProfilesUnassignedTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"order": [[ 1, 'asc' ]],
+			"columnDefs": [
+				{ "width": "5%", "targets": 0 }
+			]
+		});
+	});
+
+};
+
+TableParamProfilesUnassignedController.$inject = ['parameter', 'profiles', '$scope', '$uibModalInstance'];
+module.exports = TableParamProfilesUnassignedController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/parameterProfiles/TableParameterProfilesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/parameterProfiles/TableParameterProfilesController.js b/traffic_portal/app/src/common/modules/table/parameterProfiles/TableParameterProfilesController.js
new file mode 100644
index 0000000..3fb44f6
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/parameterProfiles/TableParameterProfilesController.js
@@ -0,0 +1,87 @@
+/*
+ * 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 TableParameterProfilesController = function(parameter, parameterProfiles, $scope, $state, $uibModal, locationUtils, profileParameterService) {
+
+	$scope.parameter = parameter;
+
+	$scope.parameterProfiles = parameterProfiles;
+
+	$scope.addProfile = function() {
+		alert('not hooked up yet: add profile to parameter');
+	};
+
+	$scope.removeProfile = function(profileId) {
+		profileParameterService.unlinkProfileParameter(profileId, parameter.id)
+			.then(
+				function() {
+					$scope.refresh();
+				}
+			);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.selectProfiles = function() {
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/table/parameterProfiles/table.paramProfilesUnassigned.tpl.html',
+			controller: 'TableParamProfilesUnassignedController',
+			size: 'lg',
+			resolve: {
+				parameter: function() {
+					return parameter;
+				},
+				profiles: function(profileService) {
+					return profileService.getParamUnassignedProfiles(parameter.id);
+				}
+			}
+		});
+		modalInstance.result.then(function(selectedProfiles) {
+			var massagedArray = [];
+			for (i = 0; i < selectedProfiles.length; i++) {
+				massagedArray.push( { parameterId: parameter.id, profileId: selectedProfiles[i] } );
+			}
+			profileParameterService.linkProfileParameters(massagedArray)
+				.then(
+					function() {
+						$scope.refresh();
+					}
+				);
+		}, function () {
+			// do nothing
+		});
+	};
+
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#parameterProfilesTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableParameterProfilesController.$inject = ['parameter', 'parameterProfiles', '$scope', '$state', '$uibModal', 'locationUtils', 'profileParameterService'];
+module.exports = TableParameterProfilesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/parameterProfiles/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/parameterProfiles/index.js b/traffic_portal/app/src/common/modules/table/parameterProfiles/index.js
new file mode 100644
index 0000000..88cf42b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/parameterProfiles/index.js
@@ -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.
+ */
+
+module.exports = angular.module('trafficPortal.table.parameterProfiles', [])
+	.controller('TableParameterProfilesController', require('./TableParameterProfilesController'))
+	.controller('TableParamProfilesUnassignedController', require('./TableParamProfilesUnassignedController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/parameterProfiles/table.paramProfilesUnassigned.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/parameterProfiles/table.paramProfilesUnassigned.tpl.html b/traffic_portal/app/src/common/modules/table/parameterProfiles/table.paramProfilesUnassigned.tpl.html
new file mode 100644
index 0000000..f24e240
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/parameterProfiles/table.paramProfilesUnassigned.tpl.html
@@ -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.
+-->
+
+
+
+<div class="modal-header">
+    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+    <h3 class="modal-title">Link Profiles to {{::parameter.name}}</h3>
+</div>
+<div class="modal-body">
+    <table id="paramProfilesUnassignedTable" class="table responsive-utilities jambo_table" style="table-layout:fixed; width:100%;">
+        <thead>
+        <tr class="headings">
+            <th></th>
+            <th>name</th>
+            <th>description</th>
+            <th>type</th>
+            <th>cdn</th>
+        </tr>
+        </thead>
+        <tbody>
+        <tr ng-repeat="profile in ::unassignedProfiles">
+            <td><input type="checkbox" ng-click="updateProfiles($event, profile.id)"></td>
+            <td>{{::profile.name}}</td>
+            <td>{{::profile.description}}</td>
+            <td>{{::profile.type}}</td>
+            <td>{{::profile.cdnName}}</td>
+        </tr>
+        </tbody>
+    </table>
+</div>
+<div class="modal-footer">
+    <button class="btn btn-link" ng-click="cancel()">cancel</button>
+    <button class="btn btn-primary" ng-click="submit()">Submit</button>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/parameterProfiles/table.parameterProfiles.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/parameterProfiles/table.parameterProfiles.tpl.html b/traffic_portal/app/src/common/modules/table/parameterProfiles/table.parameterProfiles.tpl.html
new file mode 100644
index 0000000..61fd49a
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/parameterProfiles/table.parameterProfiles.tpl.html
@@ -0,0 +1,53 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/parameters')">Parameters</a></li>
+            <li><a ng-click="navigateToPath('/admin/parameters/' + parameter.id)">{{::parameter.name}}</a></li>
+            <li class="active">Profiles</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Link Profiles to Parameter" ng-click="selectProfiles()"><i class="fa fa-link"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="parameterProfilesTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+                <th>description</th>
+                <th></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="parameterProfile in ::parameterProfiles">
+                <td>{{::parameterProfile.name}}</td>
+                <td>{{::parameterProfile.description}}</td>
+                <td><button type="button" class="btn btn-link" title="Unlink Profile from Parameter" ng-click="removeProfile(parameterProfile.id)"><i class="fa fa-chain-broken"></i></button></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/parameters/TableParametersController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/parameters/TableParametersController.js b/traffic_portal/app/src/common/modules/table/parameters/TableParametersController.js
new file mode 100644
index 0000000..4ed957c
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/parameters/TableParametersController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableParametersController = function(parameters, $scope, $state, locationUtils) {
+
+    $scope.parameters = parameters;
+
+    $scope.editParameter = function(id) {
+        locationUtils.navigateToPath('/admin/parameters/' + id);
+    };
+
+    $scope.createParameter = function() {
+        locationUtils.navigateToPath('/admin/parameters/new');
+    };
+
+    $scope.refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+    angular.element(document).ready(function () {
+        $('#parametersTable').dataTable({
+            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+            "iDisplayLength": 25,
+            "aaSorting": []
+        });
+    });
+
+};
+
+TableParametersController.$inject = ['parameters', '$scope', '$state', 'locationUtils'];
+module.exports = TableParametersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/parameters/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/parameters/index.js b/traffic_portal/app/src/common/modules/table/parameters/index.js
new file mode 100644
index 0000000..f9e9fca
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/parameters/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.parameters', [])
+    .controller('TableParametersController', require('./TableParametersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/parameters/table.parameters.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/parameters/table.parameters.tpl.html b/traffic_portal/app/src/common/modules/table/parameters/table.parameters.tpl.html
new file mode 100644
index 0000000..3c61a00
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/parameters/table.parameters.tpl.html
@@ -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.
+-->
+
+<div class="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Parameters</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Create Parameter" ng-click="createParameter()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="parametersTable" class="table responsive-utilities jambo_table" >
+            <thead>
+                <tr class="headings">
+                    <th>name</th>
+                    <th>configFile</th>
+                    <th>value</th>
+                </tr>
+            </thead>
+            <tbody>
+                <tr ng-click="editParameter(parameter.id)" ng-repeat="parameter in ::parameters">
+                    <td>{{::parameter.name}}</td>
+                    <td>{{::parameter.configFile}}</td>
+                    <td>{{::parameter.value}}</td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/physLocationServers/TablePhysLocationServersController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/physLocationServers/TablePhysLocationServersController.js b/traffic_portal/app/src/common/modules/table/physLocationServers/TablePhysLocationServersController.js
new file mode 100644
index 0000000..c7f69fc
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/physLocationServers/TablePhysLocationServersController.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.
+ */
+
+var TablePhysLocationServersController = function(physLocation, servers, $scope, $state, locationUtils, serverUtils) {
+
+	$scope.physLocation = physLocation;
+
+	$scope.servers = servers;
+
+	$scope.editServer = function(id) {
+		locationUtils.navigateToPath('/configure/servers/' + id);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.isOffline = serverUtils.isOffline;
+
+	$scope.offlineReason = serverUtils.offlineReason;
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#serversTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TablePhysLocationServersController.$inject = ['physLocation', 'servers', '$scope', '$state', 'locationUtils', 'serverUtils'];
+module.exports = TablePhysLocationServersController;



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/job/form.job.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/job/form.job.tpl.html b/traffic_portal/app/src/common/modules/form/job/form.job.tpl.html
new file mode 100644
index 0000000..4839aeb
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/job/form.job.tpl.html
@@ -0,0 +1,65 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb">
+            <li><a ng-click="navigateToPath('/admin/jobs')">Invalidate Content Jobs</a></li>
+            <li class="active">{{jobName}}</li>
+        </ol>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="jobForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(jobForm.deliveryservice), 'has-feedback': hasError(jobForm.deliveryservice)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="deliveryservice" name="deliveryservice" class="form-control" ng-model="job.dsId" ng-options="deliveryservice.id as deliveryservice.xmlId for deliveryservice in deliveryservices" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(jobForm.deliveryservice, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(jobForm.regex), 'has-feedback': hasError(jobForm.regex)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Path Regex *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="regex" name="regex" type="text" class="form-control" placeholder="eg. /path/to/content/.*\.jpg" ng-model="job.regex" ng-required="true" ng-maxlength="255" ng-pattern="/^\//" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(jobForm.regex, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(jobForm.regex, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(jobForm.regex, 'pattern')">Must Start with /</small>
+                    <span ng-show="hasError(jobForm.regex)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(jobForm.ttl), 'has-feedback': hasError(jobForm.ttl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">TTL (hours) *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="ttl" name="ttl" type="text" class="form-control" ng-model="job.ttl" ng-required="true" ng-maxlength="1000" ng-pattern="/^\d+$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(jobForm.ttl, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(jobForm.ttl, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(jobForm.ttl, 'pattern')">Number</small>
+                    <span ng-show="hasError(jobForm.ttl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-success" ng-disabled="jobForm.$pristine || jobForm.$invalid" ng-click="save(job)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/job/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/job/index.js b/traffic_portal/app/src/common/modules/form/job/index.js
new file mode 100644
index 0000000..99b48f9
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/job/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.job', [])
+	.controller('FormJobController', require('./FormJobController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/job/new/FormNewJobController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/job/new/FormNewJobController.js b/traffic_portal/app/src/common/modules/form/job/new/FormNewJobController.js
new file mode 100644
index 0000000..4ecde31
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/job/new/FormNewJobController.js
@@ -0,0 +1,48 @@
+/*
+ * 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 FormNewJobController = function(job, $scope, $controller, jobService, messageModel, locationUtils) {
+
+	// extends the FormJobController to inherit common methods
+	angular.extend(this, $controller('FormJobController', { job: job, $scope: $scope }));
+
+	$scope.jobName = 'New';
+
+	$scope.settings = {
+		isNew: true,
+		saveLabel: 'Create'
+	};
+
+	$scope.save = function(job) {
+		jobService.createJob(job)
+			.then(
+				function() {
+					messageModel.setMessages([ { level: 'success', text: 'Invalidate Content Job Created' } ], true);
+					locationUtils.navigateToPath('/admin/jobs');
+				},
+				function(fault) {
+					messageModel.setMessages(fault.data.alerts, false);
+				}
+			);
+	};
+
+};
+
+FormNewJobController.$inject = ['job', '$scope', '$controller', 'jobService', 'messageModel', 'locationUtils'];
+module.exports = FormNewJobController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/job/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/job/new/index.js b/traffic_portal/app/src/common/modules/form/job/new/index.js
new file mode 100644
index 0000000..6c118d9
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/job/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.job.new', [])
+	.controller('FormNewJobController', require('./FormNewJobController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/parameter/FormParameterController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/parameter/FormParameterController.js b/traffic_portal/app/src/common/modules/form/parameter/FormParameterController.js
new file mode 100644
index 0000000..4de9b5a
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/parameter/FormParameterController.js
@@ -0,0 +1,49 @@
+/*
+ * 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 FormParameterController = function(parameter, $scope, $location, formUtils, stringUtils, locationUtils) {
+
+    $scope.parameter = parameter;
+
+    $scope.props = [
+        { name: 'name', type: 'text', required: true, maxLength: 1024 },
+        { name: 'configFile', type: 'text', required: true, maxLength: 45 },
+        { name: 'value', type: 'text', required: true, maxLength: 1024 }
+    ];
+
+    $scope.labelize = stringUtils.labelize;
+
+    $scope.viewProfiles = function() {
+        $location.path($location.path() + '/profiles');
+    };
+
+    $scope.viewCacheGroups = function() {
+        $location.path($location.path() + '/cache-groups');
+    };
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
+    $scope.hasError = formUtils.hasError;
+
+    $scope.hasPropertyError = formUtils.hasPropertyError;
+
+};
+
+FormParameterController.$inject = ['parameter', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils'];
+module.exports = FormParameterController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/parameter/edit/FormEditParameterController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/parameter/edit/FormEditParameterController.js b/traffic_portal/app/src/common/modules/form/parameter/edit/FormEditParameterController.js
new file mode 100644
index 0000000..4074104
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/parameter/edit/FormEditParameterController.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.
+ */
+
+var FormEditParameterController = function(parameter, $scope, $controller, $uibModal, $anchorScroll, locationUtils, parameterService) {
+
+    // extends the FormParameterController to inherit common methods
+    angular.extend(this, $controller('FormParameterController', { parameter: parameter, $scope: $scope }));
+
+    var deleteParameter = function(parameter) {
+        parameterService.deleteParameter(parameter.id)
+            .then(function() {
+                locationUtils.navigateToPath('/admin/parameters');
+            });
+    };
+
+    $scope.parameterName = angular.copy(parameter.name);
+
+    $scope.settings = {
+        isNew: false,
+        saveLabel: 'Update'
+    };
+
+    $scope.save = function(parameter) {
+        parameterService.updateParameter(parameter).
+            then(function() {
+                $scope.parameterName = angular.copy(parameter.name);
+                $anchorScroll(); // scrolls window to top
+            });
+    };
+
+    $scope.confirmDelete = function(parameter) {
+        var params = {
+            title: 'Delete Parameter: ' + parameter.name,
+            key: parameter.name
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+            controller: 'DialogDeleteController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                }
+            }
+        });
+        modalInstance.result.then(function() {
+            deleteParameter(parameter);
+        }, function () {
+            // do nothing
+        });
+    };
+
+};
+
+FormEditParameterController.$inject = ['parameter', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'parameterService'];
+module.exports = FormEditParameterController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/parameter/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/parameter/edit/index.js b/traffic_portal/app/src/common/modules/form/parameter/edit/index.js
new file mode 100644
index 0000000..76da6e4
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/parameter/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.parameter.edit', [])
+    .controller('FormEditParameterController', require('./FormEditParameterController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/parameter/form.parameter.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/parameter/form.parameter.tpl.html b/traffic_portal/app/src/common/modules/form/parameter/form.parameter.tpl.html
new file mode 100644
index 0000000..6f31745
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/parameter/form.parameter.tpl.html
@@ -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.
+-->
+
+<div class="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/parameters')">Parameters</a></li>
+            <li class="active">{{parameterName}}</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-primary" title="View Profiles" ng-click="viewProfiles()">View Profiles</button>
+            <!-- todo: show cachegroups for a parameter -->
+            <!--<button class="btn btn-primary" title="View Cache Groups" ng-click="viewCacheGroups()">View Cache Groups</button>-->
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="parameterForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(parameterForm[prop.name]), 'has-feedback': hasError(parameterForm[prop.name])}" ng-repeat="prop in props">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">{{labelize(prop.name)}} <span ng-show="prop.required">*</span></label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="{{prop.name}}" name="{{prop.name}}" type="{{prop.type}}" class="form-control" ng-model="parameter[prop.name]" ng-readonly="prop.readonly" ng-required="prop.required" ng-maxlength="prop.maxLength" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(parameterForm[prop.name], 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(parameterForm[prop.name], 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(parameterForm[prop.name])" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(parameter)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="parameterForm.$pristine || parameterForm.$invalid" ng-click="save(parameter)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/parameter/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/parameter/index.js b/traffic_portal/app/src/common/modules/form/parameter/index.js
new file mode 100644
index 0000000..04b7fbb
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/parameter/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.parameter', [])
+    .controller('FormParameterController', require('./FormParameterController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/parameter/new/FormNewParameterController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/parameter/new/FormNewParameterController.js b/traffic_portal/app/src/common/modules/form/parameter/new/FormNewParameterController.js
new file mode 100644
index 0000000..56b9202
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/parameter/new/FormNewParameterController.js
@@ -0,0 +1,39 @@
+/*
+ * 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 FormNewParameterController = function(parameter, $scope, $controller, parameterService) {
+
+    // extends the FormParameterController to inherit common methods
+    angular.extend(this, $controller('FormParameterController', { parameter: parameter, $scope: $scope }));
+
+    $scope.parameterName = 'New';
+
+    $scope.settings = {
+        isNew: true,
+        saveLabel: 'Create'
+    };
+
+    $scope.save = function(parameter) {
+        parameterService.createParameter(parameter);
+    };
+
+};
+
+FormNewParameterController.$inject = ['parameter', '$scope', '$controller', 'parameterService'];
+module.exports = FormNewParameterController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/parameter/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/parameter/new/index.js b/traffic_portal/app/src/common/modules/form/parameter/new/index.js
new file mode 100644
index 0000000..56d835d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/parameter/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.parameter.new', [])
+    .controller('FormNewParameterController', require('./FormNewParameterController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/physLocation/FormPhysLocationController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/physLocation/FormPhysLocationController.js b/traffic_portal/app/src/common/modules/form/physLocation/FormPhysLocationController.js
new file mode 100644
index 0000000..d7f78fc
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/physLocation/FormPhysLocationController.js
@@ -0,0 +1,63 @@
+/*
+ * 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 FormPhysLocationController = function(physLocation, $scope, $location, formUtils, stringUtils, locationUtils, regionService) {
+
+    var getRegions = function() {
+        regionService.getRegions()
+            .then(function(result) {
+                $scope.regions = result;
+            });
+    };
+
+    $scope.physLocation = physLocation;
+
+    $scope.props = [
+        { name: 'name', type: 'text', required: true, maxLength: 45 },
+        { name: 'shortName', type: 'text', required: true, maxLength: 12 },
+        { name: 'address', type: 'text', required: true, maxLength: 128 },
+        { name: 'city', type: 'text', required: true, maxLength: 128 },
+        { name: 'state', type: 'text', required: true, maxLength: 2 },
+        { name: 'zip', type: 'text', required: true, maxLength: 5 },
+        { name: 'poc', type: 'text', required: false, maxLength: 128 },
+        { name: 'phone', type: 'text', required: false, maxLength: 45 },
+        { name: 'email', type: 'email', required: false, maxLength: 128 }
+    ];
+
+    $scope.labelize = stringUtils.labelize;
+
+    $scope.viewServers = function() {
+        $location.path($location.path() + '/servers');
+    };
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
+    $scope.hasError = formUtils.hasError;
+
+    $scope.hasPropertyError = formUtils.hasPropertyError;
+
+    var init = function () {
+        getRegions();
+    };
+    init();
+
+};
+
+FormPhysLocationController.$inject = ['physLocation', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils', 'regionService'];
+module.exports = FormPhysLocationController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/physLocation/edit/FormEditPhysLocationController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/physLocation/edit/FormEditPhysLocationController.js b/traffic_portal/app/src/common/modules/form/physLocation/edit/FormEditPhysLocationController.js
new file mode 100644
index 0000000..688829a
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/physLocation/edit/FormEditPhysLocationController.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.
+ */
+
+var FormEditPhysLocationController = function(physLocation, $scope, $controller, $uibModal, $anchorScroll, locationUtils, physLocationService) {
+
+    // extends the FormPhysLocationController to inherit common methods
+    angular.extend(this, $controller('FormPhysLocationController', { physLocation: physLocation, $scope: $scope }));
+
+    var deletePhysLocation = function(physLocation) {
+        physLocationService.deletePhysLocation(physLocation.id)
+            .then(function() {
+                locationUtils.navigateToPath('/admin/phys-locations');
+            });
+    };
+
+    $scope.physLocationName = angular.copy(physLocation.name);
+
+    $scope.settings = {
+        isNew: false,
+        saveLabel: 'Update'
+    };
+
+    $scope.save = function(physLocation) {
+        physLocationService.updatePhysLocation(physLocation).
+            then(function() {
+                $scope.physLocationName = angular.copy(physLocation.name);
+                $anchorScroll(); // scrolls window to top
+            });
+    };
+
+    $scope.confirmDelete = function(physLocation) {
+        var params = {
+            title: 'Delete Physical Location: ' + physLocation.name,
+            key: physLocation.name
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+            controller: 'DialogDeleteController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                }
+            }
+        });
+        modalInstance.result.then(function() {
+            deletePhysLocation(physLocation);
+        }, function () {
+            // do nothing
+        });
+    };
+
+};
+
+FormEditPhysLocationController.$inject = ['physLocation', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'physLocationService'];
+module.exports = FormEditPhysLocationController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/physLocation/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/physLocation/edit/index.js b/traffic_portal/app/src/common/modules/form/physLocation/edit/index.js
new file mode 100644
index 0000000..d042d95
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/physLocation/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.physLocation.edit', [])
+    .controller('FormEditPhysLocationController', require('./FormEditPhysLocationController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/physLocation/form.physLocation.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/physLocation/form.physLocation.tpl.html b/traffic_portal/app/src/common/modules/form/physLocation/form.physLocation.tpl.html
new file mode 100644
index 0000000..c2d66d4
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/physLocation/form.physLocation.tpl.html
@@ -0,0 +1,64 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/phys-locations')">Physical Locations</a></li>
+            <li class="active">{{physLocationName}}</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-primary" title="View Servers" ng-click="viewServers()">View Servers</button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="physLocationForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(physLocationForm[prop.name]), 'has-feedback': hasError(physLocationForm[prop.name])}" ng-repeat="prop in props">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">{{labelize(prop.name)}} <span ng-show="prop.required">*</span></label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="{{prop.name}}" name="{{prop.name}}" type="{{prop.type}}" class="form-control" ng-model="physLocation[prop.name]" ng-readonly="prop.readonly" ng-required="prop.required" ng-maxlength="prop.maxLength" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(physLocationForm[prop.name], 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(physLocationForm[prop.name], 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(physLocationForm[prop.name])" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(physLocationForm.region), 'has-feedback': hasError(physLocationForm.region)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Region *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="region" name="region" class="form-control" ng-model="physLocation.regionId" ng-options="region.id as region.name for region in regions" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(physLocationForm.region, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Comments</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <textarea id="comments" name="comments" rows="5" cols="17" class="form-control" ng-model="physLocation.comments" maxlength="256"></textarea>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(physLocation)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="physLocationForm.$pristine || physLocationForm.$invalid" ng-click="save(physLocation)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/physLocation/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/physLocation/index.js b/traffic_portal/app/src/common/modules/form/physLocation/index.js
new file mode 100644
index 0000000..402f625
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/physLocation/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.physLocation', [])
+    .controller('FormPhysLocationController', require('./FormPhysLocationController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/physLocation/new/FormNewPhysLocationController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/physLocation/new/FormNewPhysLocationController.js b/traffic_portal/app/src/common/modules/form/physLocation/new/FormNewPhysLocationController.js
new file mode 100644
index 0000000..ba4aaa3
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/physLocation/new/FormNewPhysLocationController.js
@@ -0,0 +1,39 @@
+/*
+ * 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 FormNewPhysLocationController = function(physLocation, $scope, $controller, physLocationService) {
+
+    // extends the FormPhysLocationController to inherit common methods
+    angular.extend(this, $controller('FormPhysLocationController', { physLocation: physLocation, $scope: $scope }));
+
+    $scope.physLocationName = 'New';
+
+    $scope.settings = {
+        isNew: true,
+        saveLabel: 'Create'
+    };
+
+    $scope.save = function(physLocation) {
+        physLocationService.createPhysLocation(physLocation);
+    };
+
+};
+
+FormNewPhysLocationController.$inject = ['physLocation', '$scope', '$controller', 'physLocationService'];
+module.exports = FormNewPhysLocationController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/physLocation/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/physLocation/new/index.js b/traffic_portal/app/src/common/modules/form/physLocation/new/index.js
new file mode 100644
index 0000000..5297288
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/physLocation/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.physLocation.new', [])
+    .controller('FormNewPhysLocationController', require('./FormNewPhysLocationController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/profile/FormProfileController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/profile/FormProfileController.js b/traffic_portal/app/src/common/modules/form/profile/FormProfileController.js
new file mode 100644
index 0000000..1523ee0
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/profile/FormProfileController.js
@@ -0,0 +1,82 @@
+/*
+ * 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 FormProfileController = function(profile, $scope, $location, formUtils, locationUtils, cdnService) {
+
+    var getCDNs = function() {
+        cdnService.getCDNs(true)
+            .then(function(result) {
+                $scope.cdns = result;
+            });
+    };
+
+    $scope.profile = profile;
+
+    $scope.types = [
+        { value: 'ATS_PROFILE' },
+        { value: 'TR_PROFILE' },
+        { value: 'TM_PROFILE' },
+        { value: 'TS_PROFILE' },
+        { value: 'TP_PROFILE' },
+        { value: 'INFLUXDB_PROFILE' },
+        { value: 'RIAK_PROFILE' },
+        { value: 'SPLUNK_PROFILE' },
+        { value: 'DS_PROFILE' },
+        { value: 'ORG_PROFILE' },
+        { value: 'KAFKA_PROFILE' },
+        { value: 'LOGSTASH_PROFILE' },
+        { value: 'ES_PROFILE' },
+        { value: 'UNK_PROFILE' }
+    ];
+
+    $scope.viewParams = function() {
+        $location.path($location.path() + '/parameters');
+    };
+
+    $scope.viewServers = function() {
+        $location.path($location.path() + '/servers');
+    };
+
+    $scope.viewDeliveryServices = function() {
+        $location.path($location.path() + '/delivery-services');
+    };
+
+    $scope.cloneProfile = function() {
+        alert('not hooked up yet: cloneProfile');
+    };
+
+    $scope.exportProfile = function() {
+        alert('not hooked up yet: exportProfile');
+    };
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
+    $scope.hasError = formUtils.hasError;
+
+    $scope.hasPropertyError = formUtils.hasPropertyError;
+
+    var init = function () {
+        getCDNs();
+    };
+    init();
+
+};
+
+FormProfileController.$inject = ['profile', '$scope', '$location', 'formUtils', 'locationUtils', 'cdnService'];
+module.exports = FormProfileController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/profile/edit/FormEditProfileController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/profile/edit/FormEditProfileController.js b/traffic_portal/app/src/common/modules/form/profile/edit/FormEditProfileController.js
new file mode 100644
index 0000000..cf80884
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/profile/edit/FormEditProfileController.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.
+ */
+
+var FormEditProfileController = function(profile, $scope, $controller, $uibModal, $anchorScroll, locationUtils, profileService) {
+
+    // extends the FormProfileController to inherit common methods
+    angular.extend(this, $controller('FormProfileController', { profile: profile, $scope: $scope }));
+
+    var deleteProfile = function(profile) {
+        profileService.deleteProfile(profile.id)
+            .then(function() {
+                locationUtils.navigateToPath('/admin/profiles');
+            });
+    };
+
+    $scope.profileName = angular.copy(profile.name);
+
+    $scope.settings = {
+        isNew: false,
+        saveLabel: 'Update'
+    };
+
+    $scope.save = function(profile) {
+        profileService.updateProfile(profile).
+            then(function() {
+                $scope.profileName = angular.copy(profile.name);
+                $anchorScroll(); // scrolls window to top
+            });
+    };
+
+    $scope.confirmDelete = function(profile) {
+        var params = {
+            title: 'Delete Profile: ' + profile.name,
+            key: profile.name
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+            controller: 'DialogDeleteController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                }
+            }
+        });
+        modalInstance.result.then(function() {
+            deleteProfile(profile);
+        }, function () {
+            // do nothing
+        });
+    };
+
+};
+
+FormEditProfileController.$inject = ['profile', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'profileService'];
+module.exports = FormEditProfileController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/profile/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/profile/edit/index.js b/traffic_portal/app/src/common/modules/form/profile/edit/index.js
new file mode 100644
index 0000000..1050ddb
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/profile/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.profile.edit', [])
+    .controller('FormEditProfileController', require('./FormEditProfileController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/profile/form.profile.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/profile/form.profile.tpl.html b/traffic_portal/app/src/common/modules/form/profile/form.profile.tpl.html
new file mode 100644
index 0000000..e88ff0d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/profile/form.profile.tpl.html
@@ -0,0 +1,87 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/profiles')">Profiles</a></li>
+            <li class="active">{{profileName}}</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-primary" title="View Parameters" ng-click="viewParams()">View Parameters</button>
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="viewDeliveryServices()" ng-if="profile.type == 'DS_PROFILE'">View Delivery Services</a></li>
+                    <li role="menuitem"><a ng-click="viewParams()">View Parameters</a></li>
+                    <li role="menuitem"><a ng-click="viewServers()" ng-if="profile.type != 'DS_PROFILE'">View Servers</a></li>
+                    <li class="divider"></li>
+                    <li role="menuitem"><a ng-click="cloneProfile()">Clone Profile</a></li>
+                    <li role="menuitem"><a ng-click="exportProfile()">Export Profile</a></li>
+                </ul>
+            </div>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="profileForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(profileForm.name), 'has-feedback': hasError(profileForm.name)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Name *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="name" name="name" type="text" class="form-control" ng-model="profile.name" ng-required="true" ng-maxlength="45" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(profileForm.name, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(profileForm.name, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(profileForm.name)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(profileForm.cdn), 'has-feedback': hasError(profileForm.cdn)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="cdn" name="cdn" class="form-control" ng-model="profile.cdn" ng-options="cdn.id as cdn.name for cdn in cdns" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(profileForm.cdn, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(profileForm.type), 'has-feedback': hasError(profileForm.type)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Type *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="type" name="type" class="form-control" ng-model="profile.type" ng-options="type.value as type.value for type in types" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(profileForm.cdn, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Description</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <textarea id="description" name="description" rows="3" cols="17" class="form-control" ng-model="profile.description" maxlength="256"></textarea>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(profile)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="profileForm.$pristine || profileForm.$invalid" ng-click="save(profile)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/profile/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/profile/index.js b/traffic_portal/app/src/common/modules/form/profile/index.js
new file mode 100644
index 0000000..293da23
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/profile/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.profile', [])
+    .controller('FormProfileController', require('./FormProfileController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/profile/new/FormNewProfileController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/profile/new/FormNewProfileController.js b/traffic_portal/app/src/common/modules/form/profile/new/FormNewProfileController.js
new file mode 100644
index 0000000..19b42c9
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/profile/new/FormNewProfileController.js
@@ -0,0 +1,39 @@
+/*
+ * 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 FormNewProfileController = function(profile, $scope, $controller, profileService) {
+
+    // extends the FormProfileController to inherit common methods
+    angular.extend(this, $controller('FormProfileController', { profile: profile, $scope: $scope }));
+
+    $scope.profileName = 'New';
+
+    $scope.settings = {
+        isNew: true,
+        saveLabel: 'Create'
+    };
+
+    $scope.save = function(profile) {
+        profileService.createProfile(profile);
+    };
+
+};
+
+FormNewProfileController.$inject = ['profile', '$scope', '$controller', 'profileService'];
+module.exports = FormNewProfileController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/profile/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/profile/new/index.js b/traffic_portal/app/src/common/modules/form/profile/new/index.js
new file mode 100644
index 0000000..d36a4c3
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/profile/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.profile.new', [])
+    .controller('FormNewProfileController', require('./FormNewProfileController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/region/FormRegionController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/region/FormRegionController.js b/traffic_portal/app/src/common/modules/form/region/FormRegionController.js
new file mode 100644
index 0000000..83c0bef
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/region/FormRegionController.js
@@ -0,0 +1,55 @@
+/*
+ * 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 FormRegionController = function(region, $scope, $location, formUtils, stringUtils, locationUtils, divisionService) {
+
+    var getDivisions = function() {
+        divisionService.getDivisions()
+            .then(function(result) {
+                $scope.divisions = result;
+            });
+    };
+
+    $scope.region = region;
+
+    $scope.props = [
+        { name: 'name', type: 'text', required: true, maxLength: 45 }
+    ];
+
+    $scope.labelize = stringUtils.labelize;
+
+    $scope.viewPhysLocations = function() {
+        $location.path($location.path() + '/phys-locations');
+    };
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
+    $scope.hasError = formUtils.hasError;
+
+    $scope.hasPropertyError = formUtils.hasPropertyError;
+
+    var init = function () {
+        getDivisions();
+    };
+    init();
+
+};
+
+FormRegionController.$inject = ['region', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils', 'divisionService'];
+module.exports = FormRegionController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/region/edit/FormEditRegionController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/region/edit/FormEditRegionController.js b/traffic_portal/app/src/common/modules/form/region/edit/FormEditRegionController.js
new file mode 100644
index 0000000..0e11293
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/region/edit/FormEditRegionController.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.
+ */
+
+var FormEditRegionController = function(region, $scope, $controller, $uibModal, $anchorScroll, locationUtils, regionService) {
+
+    // extends the FormRegionController to inherit common methods
+    angular.extend(this, $controller('FormRegionController', { region: region, $scope: $scope }));
+
+    var deleteRegion = function(region) {
+        regionService.deleteRegion(region.id)
+            .then(function() {
+                locationUtils.navigateToPath('/admin/regions');
+            });
+    };
+
+    $scope.regionName = angular.copy(region.name);
+
+    $scope.settings = {
+        isNew: false,
+        saveLabel: 'Update'
+    };
+
+    $scope.save = function(region) {
+        regionService.updateRegion(region).
+            then(function() {
+                $scope.regionName = angular.copy(region.name);
+                $anchorScroll(); // scrolls window to top
+            });
+    };
+
+    $scope.confirmDelete = function(region) {
+        var params = {
+            title: 'Delete Region: ' + region.name,
+            key: region.name
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+            controller: 'DialogDeleteController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                }
+            }
+        });
+        modalInstance.result.then(function() {
+            deleteRegion(region);
+        }, function () {
+            // do nothing
+        });
+    };
+
+};
+
+FormEditRegionController.$inject = ['region', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'regionService'];
+module.exports = FormEditRegionController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/region/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/region/edit/index.js b/traffic_portal/app/src/common/modules/form/region/edit/index.js
new file mode 100644
index 0000000..bda4bea
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/region/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.region.edit', [])
+    .controller('FormEditRegionController', require('./FormEditRegionController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/region/form.region.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/region/form.region.tpl.html b/traffic_portal/app/src/common/modules/form/region/form.region.tpl.html
new file mode 100644
index 0000000..a37325e
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/region/form.region.tpl.html
@@ -0,0 +1,58 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/regions')">Regions</a></li>
+            <li class="active">{{regionName}}</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-primary" title="View Phys Locations" ng-click="viewPhysLocations()">View Phys Locations</button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="regionForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(regionForm[prop.name]), 'has-feedback': hasError(regionForm[prop.name])}" ng-repeat="prop in props">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">{{labelize(prop.name)}} <span ng-show="prop.required">*</span></label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="{{prop.name}}" name="{{prop.name}}" type="{{prop.type}}" class="form-control" ng-model="region[prop.name]" ng-readonly="prop.readonly" ng-required="prop.required" ng-maxlength="prop.maxLength" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(regionForm[prop.name], 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(regionForm[prop.name], 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(regionForm[prop.name])" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(regionForm.division), 'has-feedback': hasError(regionForm.division)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Division *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="division" name="division" class="form-control" ng-model="region.division" ng-options="division.id as division.name for division in divisions" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(regionForm.division, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(region)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="regionForm.$pristine || regionForm.$invalid" ng-click="save(region)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/region/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/region/index.js b/traffic_portal/app/src/common/modules/form/region/index.js
new file mode 100644
index 0000000..0032290
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/region/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.region', [])
+    .controller('FormRegionController', require('./FormRegionController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/region/new/FormNewRegionController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/region/new/FormNewRegionController.js b/traffic_portal/app/src/common/modules/form/region/new/FormNewRegionController.js
new file mode 100644
index 0000000..8aa7b36
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/region/new/FormNewRegionController.js
@@ -0,0 +1,42 @@
+/*
+ * 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 FormNewRegionController = function(region, $scope, $controller, locationUtils, regionService) {
+
+    // extends the FormRegionController to inherit common methods
+    angular.extend(this, $controller('FormRegionController', { region: region, $scope: $scope }));
+
+    $scope.regionName = 'New';
+
+    $scope.settings = {
+        isNew: true,
+        saveLabel: 'Create'
+    };
+
+    $scope.save = function(region) {
+        regionService.createRegion(region).
+            then(function() {
+                locationUtils.navigateToPath('/admin/regions');
+            });
+    };
+
+};
+
+FormNewRegionController.$inject = ['region', '$scope', '$controller', 'locationUtils', 'regionService'];
+module.exports = FormNewRegionController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/region/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/region/new/index.js b/traffic_portal/app/src/common/modules/form/region/new/index.js
new file mode 100644
index 0000000..4155ac7
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/region/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.region.new', [])
+    .controller('FormNewRegionController', require('./FormNewRegionController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/server/FormServerController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/server/FormServerController.js b/traffic_portal/app/src/common/modules/form/server/FormServerController.js
new file mode 100644
index 0000000..c23b03d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/server/FormServerController.js
@@ -0,0 +1,164 @@
+/*
+ * 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 FormServerController = function(server, $scope, $location, $state, $uibModal, formUtils, locationUtils, serverService, cacheGroupService, cdnService, physLocationService, profileService, statusService, typeService, messageModel) {
+
+    var getPhysLocations = function() {
+        physLocationService.getPhysLocations()
+            .then(function(result) {
+                $scope.physLocations = result;
+            });
+    };
+
+    var getCacheGroups = function() {
+        cacheGroupService.getCacheGroups()
+            .then(function(result) {
+                $scope.cacheGroups = result;
+            });
+    };
+
+    var getTypes = function() {
+        typeService.getTypes({ useInTable: 'server' })
+            .then(function(result) {
+                $scope.types = result;
+            });
+    };
+
+    var getCDNs = function() {
+        cdnService.getCDNs(true)
+            .then(function(result) {
+                $scope.cdns = result;
+            });
+    };
+
+    var getStatuses = function() {
+        statusService.getStatuses()
+            .then(function(result) {
+                $scope.statuses = result;
+            });
+    };
+
+    var getProfiles = function() {
+        profileService.getProfiles({ orderby: 'name' })
+            .then(function(result) {
+                $scope.profiles = _.filter(result, function(profile) {
+                    return profile.type != 'DS_PROFILE';
+                });
+            });
+    };
+
+    var updateStatus = function(status) {
+        serverService.updateStatus(server.id, { status: status.id, offlineReason: status.offlineReason })
+            .then(
+                function(result) {
+                    messageModel.setMessages(result.data.alerts, false);
+                    refresh();
+                },
+	            function(fault) {
+		            messageModel.setMessages(fault.data.alerts, false);
+	            }
+            );
+    };
+    
+    var refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+
+    // supposedly matches IPv4 and IPv6 formats. but actually need one that matches each. todo.
+    $scope.validations = {
+        ipRegex: new RegExp(/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$|^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3
 }))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/)
+    };
+
+
+    $scope.server = server;
+
+    $scope.falseTrue = [
+        { value: false, label: 'false' },
+        { value: true, label: 'true' }
+    ];
+
+    $scope.queueServerUpdates = function(server) {
+        serverService.queueServerUpdates(server.id)
+            .then(
+                function() {
+                    refresh();
+                }
+            );
+    };
+
+    $scope.clearServerUpdates = function(server) {
+        serverService.clearServerUpdates(server.id)
+            .then(
+                function() {
+                    refresh();
+                }
+            );
+    };
+
+    $scope.confirmStatusUpdate = function() {
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/select/status/dialog.select.status.tpl.html',
+            controller: 'DialogSelectStatusController',
+            size: 'md',
+            resolve: {
+                server: function() {
+                    return server;
+                },
+                statuses: function() {
+                    return $scope.statuses;
+                }
+            }
+        });
+        modalInstance.result.then(function(status) {
+            updateStatus(status);
+        }, function () {
+            // do nothing
+        });
+    };
+
+
+    $scope.viewConfig = function() {
+        alert('not hooked up yet: view config files for server');
+    };
+
+    $scope.viewDeliveryServices = function() {
+        $location.path($location.path() + '/delivery-services');
+    };
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
+    $scope.hasError = formUtils.hasError;
+
+    $scope.hasPropertyError = formUtils.hasPropertyError;
+
+    var init = function () {
+        getPhysLocations();
+        getCacheGroups();
+        getTypes();
+        getCDNs();
+        getStatuses();
+        getProfiles();
+    };
+    init();
+
+};
+
+FormServerController.$inject = ['server', '$scope', '$location', '$state', '$uibModal', 'formUtils', 'locationUtils', 'serverService', 'cacheGroupService', 'cdnService', 'physLocationService', 'profileService', 'statusService', 'typeService', 'messageModel'];
+module.exports = FormServerController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/server/edit/FormEditServerController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/server/edit/FormEditServerController.js b/traffic_portal/app/src/common/modules/form/server/edit/FormEditServerController.js
new file mode 100644
index 0000000..a7fbc08
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/server/edit/FormEditServerController.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.
+ */
+
+var FormEditServerController = function(server, $scope, $controller, $uibModal, $anchorScroll, locationUtils, serverService) {
+
+    // extends the FormServerController to inherit common methods
+    angular.extend(this, $controller('FormServerController', { server: server, $scope: $scope }));
+
+    var deleteServer = function(server) {
+        serverService.deleteServer(server.id)
+            .then(function() {
+                locationUtils.navigateToPath('/configure/servers');
+            });
+    };
+
+    $scope.serverName = angular.copy(server.hostName);
+
+    $scope.settings = {
+        isNew: false,
+        saveLabel: 'Update'
+    };
+
+    $scope.save = function(server) {
+        serverService.updateServer(server).
+            then(function() {
+                $scope.serverName = angular.copy(server.hostName);
+                $anchorScroll(); // scrolls window to top
+            });
+    };
+
+    $scope.confirmDelete = function(server) {
+        var params = {
+            title: 'Delete Server: ' + server.hostName,
+            key: server.hostName
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+            controller: 'DialogDeleteController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                }
+            }
+        });
+        modalInstance.result.then(function() {
+            deleteServer(server);
+        }, function () {
+            // do nothing
+        });
+    };
+
+};
+
+FormEditServerController.$inject = ['server', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'serverService'];
+module.exports = FormEditServerController;



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/statuses/TableStatusesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/statuses/TableStatusesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/statuses/TableStatusesController.js
deleted file mode 100644
index 51c31cf..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/statuses/TableStatusesController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableStatusesController = function(statuses, $scope, $state, locationUtils) {
-
-    $scope.statuses = statuses;
-
-    $scope.editStatus = function(id) {
-        locationUtils.navigateToPath('/admin/statuses/' + id);
-    };
-
-    $scope.createStatus = function() {
-        locationUtils.navigateToPath('/admin/statuses/new');
-    };
-
-    $scope.refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-    angular.element(document).ready(function () {
-        $('#statusesTable').dataTable({
-            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-            "iDisplayLength": 25,
-            "aaSorting": []
-        });
-    });
-
-};
-
-TableStatusesController.$inject = ['statuses', '$scope', '$state', 'locationUtils'];
-module.exports = TableStatusesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/statuses/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/statuses/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/statuses/index.js
deleted file mode 100644
index 9c39c7c..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/statuses/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.statuses', [])
-    .controller('TableStatusesController', require('./TableStatusesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/statuses/table.statuses.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/statuses/table.statuses.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/statuses/table.statuses.tpl.html
deleted file mode 100644
index 1b35d5a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/statuses/table.statuses.tpl.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">Statuses</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Create Status" ng-click="createStatus()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="statusesTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>name</th>
-                <th>description</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editStatus(status.id)" ng-repeat="status in ::statuses">
-                <td>{{::status.name}}</td>
-                <td>{{::status.description}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/tenants/TableTenantsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/tenants/TableTenantsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/tenants/TableTenantsController.js
deleted file mode 100644
index 0e1a214..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/tenants/TableTenantsController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableTenantsController = function(tenants, $scope, $state, locationUtils) {
-
-    $scope.tenants = tenants;
-
-    $scope.editTenant = function(id) {
-        locationUtils.navigateToPath('/admin/tenants/' + id);
-    };
-
-    $scope.createTenant = function() {
-        locationUtils.navigateToPath('/admin/tenants/new');
-    };
-
-    $scope.refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-    angular.element(document).ready(function () {
-        $('#tenantsTable').dataTable({
-            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-            "iDisplayLength": 25,
-            "aaSorting": []
-        });
-    });
-
-};
-
-TableTenantsController.$inject = ['tenants', '$scope', '$state', 'locationUtils'];
-module.exports = TableTenantsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/tenants/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/tenants/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/tenants/index.js
deleted file mode 100644
index 033e997..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/tenants/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.tenants', [])
-    .controller('TableTenantsController', require('./TableTenantsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/tenants/table.tenants.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/tenants/table.tenants.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/tenants/table.tenants.tpl.html
deleted file mode 100644
index c3db617..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/tenants/table.tenants.tpl.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">Tenants</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" ng-click="createTenant()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="tenantsTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>name</th>
-                <th>active</th>
-                <th>parent</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editTenant(tenant.id)" ng-repeat="tenant in ::tenants">
-                <td>{{::tenant.name}}</td>
-                <td>{{::tenant.active}}</td>
-                <td>{{::tenant.parentName}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-
-
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/typeCacheGroups/TableTypeCacheGroupsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/typeCacheGroups/TableTypeCacheGroupsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/typeCacheGroups/TableTypeCacheGroupsController.js
deleted file mode 100644
index e05b5bc..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/typeCacheGroups/TableTypeCacheGroupsController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableTypeCacheGroupsController = function(type, cacheGroups, $scope, $state, locationUtils) {
-
-	$scope.type = type;
-
-	$scope.cacheGroups = cacheGroups;
-
-	$scope.editCacheGroup = function(id) {
-		locationUtils.navigateToPath('/configure/cache-groups/' + id);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#cacheGroupsTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableTypeCacheGroupsController.$inject = ['type', 'cacheGroups', '$scope', '$state', 'locationUtils'];
-module.exports = TableTypeCacheGroupsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/typeCacheGroups/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/typeCacheGroups/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/typeCacheGroups/index.js
deleted file mode 100644
index c1d3a62..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/typeCacheGroups/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.typeCacheGroups', [])
-	.controller('TableTypeCacheGroupsController', require('./TableTypeCacheGroupsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/typeCacheGroups/table.typeCacheGroups.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/typeCacheGroups/table.typeCacheGroups.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/typeCacheGroups/table.typeCacheGroups.tpl.html
deleted file mode 100644
index 54a2663..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/typeCacheGroups/table.typeCacheGroups.tpl.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/types')">Types</a></li>
-            <li><a ng-click="navigateToPath('/admin/types/' + type.id)">{{::type.name}}</a></li>
-            <li class="active">Cache Groups</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="cacheGroupsTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>name</th>
-                <th>shortName</th>
-                <th>type</th>
-                <th>latitude</th>
-                <th>longitude</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editCacheGroup(cacheGroup.id)" ng-repeat="cacheGroup in ::cacheGroups">
-                <td>{{::cacheGroup.name}}</td>
-                <td>{{::cacheGroup.shortName}}</td>
-                <td>{{::cacheGroup.typeName}}</td>
-                <td>{{::cacheGroup.latitude}}</td>
-                <td>{{::cacheGroup.longitude}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/typeDeliveryServices/TableTypeDeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/typeDeliveryServices/TableTypeDeliveryServicesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/typeDeliveryServices/TableTypeDeliveryServicesController.js
deleted file mode 100644
index e41053c..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/typeDeliveryServices/TableTypeDeliveryServicesController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableTypeDeliveryServicesController = function(type, deliveryServices, $scope, $state, locationUtils) {
-
-	$scope.type = type;
-
-	$scope.deliveryServices = deliveryServices;
-
-	$scope.editDeliveryServices = function(ds) {
-		locationUtils.navigateToPath('/configure/delivery-services/' + ds.id + '?type=' + ds.type);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#deliveryServicesTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableTypeDeliveryServicesController.$inject = ['type', 'deliveryServices', '$scope', '$state', 'locationUtils'];
-module.exports = TableTypeDeliveryServicesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/typeDeliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/typeDeliveryServices/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/typeDeliveryServices/index.js
deleted file mode 100644
index 3b6514e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/typeDeliveryServices/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.typeDeliveryServices', [])
-	.controller('TableTypeDeliveryServicesController', require('./TableTypeDeliveryServicesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/typeDeliveryServices/table.typeDeliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/typeDeliveryServices/table.typeDeliveryServices.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/typeDeliveryServices/table.typeDeliveryServices.tpl.html
deleted file mode 100644
index 7473c3b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/typeDeliveryServices/table.typeDeliveryServices.tpl.html
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/types')">Types</a></li>
-            <li><a ng-click="navigateToPath('/admin/types/' + type.id)">{{::type.name}}</a></li>
-            <li class="active">Delivery Services</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="deliveryServicesTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>xmlId</th>
-                <th>orgServerFqdn</th>
-                <th>active</th>
-                <th>type</th>
-                <th>protocol</th>
-                <th>cdn</th>
-                <th>ipv6RoutingEnabled</th>
-                <th>dscp</th>
-                <th>signed</th>
-                <th>qstringIgnore</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editDeliveryService(deliveryService)" ng-repeat="deliveryService in ::deliveryServices">
-                <td>{{::deliveryService.xmlId}}</td>
-                <td>{{::deliveryService.orgServerFqdn}}</td>
-                <td>{{::deliveryService.active}}</td>
-                <td>{{::deliveryService.type}}</td>
-                <td>{{::deliveryService.protocol}}</td>
-                <td>{{::deliveryService.cdnName}}</td>
-                <td>{{::deliveryService.ipv6RoutingEnabled}}</td>
-                <td>{{::deliveryService.dscp}}</td>
-                <td>{{::deliveryService.signed}}</td>
-                <td>{{::deliveryService.qstringIgnore}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/typeServers/TableTypeServersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/typeServers/TableTypeServersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/typeServers/TableTypeServersController.js
deleted file mode 100644
index f0e30d4..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/typeServers/TableTypeServersController.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableTypeServersController = function(type, servers, $scope, $state, locationUtils, serverUtils) {
-
-	$scope.type = type;
-
-	$scope.servers = servers;
-
-	$scope.editServer = function(id) {
-		locationUtils.navigateToPath('/configure/servers/' + id);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.isOffline = serverUtils.isOffline;
-
-	$scope.offlineReason = serverUtils.offlineReason;
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#serversTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableTypeServersController.$inject = ['type', 'servers', '$scope', '$state', 'locationUtils', 'serverUtils'];
-module.exports = TableTypeServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/typeServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/typeServers/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/typeServers/index.js
deleted file mode 100644
index b282b7e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/typeServers/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.typeServers', [])
-	.controller('TableTypeServersController', require('./TableTypeServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/typeServers/table.typeServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/typeServers/table.typeServers.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/typeServers/table.typeServers.tpl.html
deleted file mode 100644
index e311c42..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/typeServers/table.typeServers.tpl.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/types')">Types</a></li>
-            <li><a ng-click="navigateToPath('/admin/types/' + type.id)">{{::type.name}}</a></li>
-            <li class="active">Servers</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="serversTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>Update?</th>
-                <th>hostName</th>
-                <th>domainName</th>
-                <th>ipAddress</th>
-                <th>ip6Address</th>
-                <th>status</th>
-                <th>type</th>
-                <th>profile</th>
-                <th>cdn</th>
-                <th>cachegroup</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editServer(server.id)" ng-repeat="server in ::servers" ng-class="::{'active': server.updPending}">
-                <td class="update-column">
-                    <i class="fa fa-flag" ng-if="server.updPending"></i>
-                    <i class="fa fa-ban" ng-if="!server.updPending"></i>
-                </td>
-                <td>{{::server.hostName}}</td>
-                <td>{{::server.domainName}}</td>
-                <td>{{::server.ipAddress}}</td>
-                <td>{{::server.ip6Address}}</td>
-                <td>
-                    <span ng-if="!isOffline(server.status)">{{::server.status}}</span>
-                    <span ng-if="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
-                </td>
-                <td>{{::server.type}}</td>
-                <td>{{::server.profile}}</td>
-                <td>{{::server.cdnName}}</td>
-                <td>{{::server.cachegroup}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/typeStaticDnsEntries/TableTypeStaticDnsEntriesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/typeStaticDnsEntries/TableTypeStaticDnsEntriesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/typeStaticDnsEntries/TableTypeStaticDnsEntriesController.js
deleted file mode 100644
index add4ae5..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/typeStaticDnsEntries/TableTypeStaticDnsEntriesController.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableTypeStaticDnsEntriesController = function(type, staticDnsEntries, $scope, $state, locationUtils) {
-
-	$scope.type = type;
-
-	$scope.staticDnsEntries = staticDnsEntries;
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#staticDnsEntriesTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableTypeStaticDnsEntriesController.$inject = ['type', 'staticDnsEntries', '$scope', '$state', 'locationUtils'];
-module.exports = TableTypeStaticDnsEntriesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/typeStaticDnsEntries/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/typeStaticDnsEntries/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/typeStaticDnsEntries/index.js
deleted file mode 100644
index f1a366b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/typeStaticDnsEntries/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.typeStaticDnsEntries', [])
-	.controller('TableTypeStaticDnsEntriesController', require('./TableTypeStaticDnsEntriesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/typeStaticDnsEntries/table.typeStaticDnsEntries.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/typeStaticDnsEntries/table.typeStaticDnsEntries.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/typeStaticDnsEntries/table.typeStaticDnsEntries.tpl.html
deleted file mode 100644
index 38c322a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/typeStaticDnsEntries/table.typeStaticDnsEntries.tpl.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/types')">Types</a></li>
-            <li><a ng-click="navigateToPath('/admin/types/' + type.id)">{{::type.name}}</a></li>
-            <li class="active">Static DNS Entries</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="staticDnsEntriesTable" class="table responsive-utilities jambo_table">
-            <thead>
-                <tr class="headings">
-                    <th>host</th>
-                    <th>address</th>
-                    <th>type</th>
-                    <th>ttl</th>
-                    <th>deliveryservice</th>
-                    <th>cachegroup</th>
-                </tr>
-            </thead>
-            <tbody>
-                <tr ng-repeat="staticDnsEntry in ::staticDnsEntries">
-                    <td>{{::staticDnsEntry.host}}</td>
-                    <td>{{::staticDnsEntry.address}}</td>
-                    <td>{{::staticDnsEntry.type}}</td>
-                    <td>{{::staticDnsEntry.ttl}}</td>
-                    <td>{{::staticDnsEntry.deliveryservice}}</td>
-                    <td>{{::staticDnsEntry.cachegroup}}</td>
-                </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/types/TableTypesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/types/TableTypesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/types/TableTypesController.js
deleted file mode 100644
index d6f73b9..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/types/TableTypesController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableTypesController = function(types, $scope, $state, locationUtils) {
-
-    $scope.types = types;
-
-    $scope.editType = function(id) {
-        locationUtils.navigateToPath('/admin/types/' + id);
-    };
-
-    $scope.createType = function() {
-        locationUtils.navigateToPath('/admin/types/new');
-    };
-
-    $scope.refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-    angular.element(document).ready(function () {
-        $('#typesTable').dataTable({
-            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-            "iDisplayLength": 25,
-            "aaSorting": []
-        });
-    });
-
-};
-
-TableTypesController.$inject = ['types', '$scope', '$state', 'locationUtils'];
-module.exports = TableTypesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/types/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/types/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/types/index.js
deleted file mode 100644
index 6e69735..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/types/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.types', [])
-    .controller('TableTypesController', require('./TableTypesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/types/table.types.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/types/table.types.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/types/table.types.tpl.html
deleted file mode 100644
index 63bc37b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/types/table.types.tpl.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">Types</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Create Type" ng-click="createType()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="typesTable" class="table responsive-utilities jambo_table">
-            <thead>
-                <tr class="headings">
-                    <th>name</th>
-                    <th>useInTable</th>
-                    <th>description</th>
-                </tr>
-            </thead>
-            <tbody>
-                <tr ng-click="editType(type.id)" ng-repeat="type in ::types">
-                    <td>{{::type.name}}</td>
-                    <td>{{::type.useInTable}}</td>
-                    <td>{{::type.description}}</td>
-                </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/TableUserDSUnassignedController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/TableUserDSUnassignedController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/TableUserDSUnassignedController.js
deleted file mode 100644
index 5e430f0..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/TableUserDSUnassignedController.js
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableUserDSUnassignedController = function(user, deliveryServices, userDeliveryServices, $scope, $uibModalInstance) {
-
-	var selectedDeliveryServiceIds = [];
-
-	var addDS = function(dsId) {
-		if (_.indexOf(selectedDeliveryServiceIds, dsId) == -1) {
-			selectedDeliveryServiceIds.push(dsId);
-		}
-	};
-
-	var removeDS = function(dsId) {
-		selectedDeliveryServiceIds = _.without(selectedDeliveryServiceIds, dsId);
-	};
-
-	var addAll = function() {
-		markDSs(true);
-		selectedDeliveryServiceIds = _.pluck(deliveryServices, 'id');
-	};
-
-	var removeAll = function() {
-		markDSs(false);
-		selectedDeliveryServiceIds = [];
-	};
-
-	var markDSs = function(selected) {
-		$scope.selectedDSs = _.map(deliveryServices, function(ds) {
-			ds['selected'] = selected;
-			return ds;
-		});
-	};
-
-	$scope.user = user;
-
-	$scope.selectedDSs = _.map(deliveryServices, function(ds) {
-		var isAssigned = _.find(userDeliveryServices, function(userDS) { return userDS.id == ds.id });
-		if (isAssigned) {
-			ds['selected'] = true; // so the checkbox will be checked
-			selectedDeliveryServiceIds.push(ds.id); // so the ds is added to selected delivery services
-		}
-		return ds;
-	});
-
-	$scope.allSelected = function() {
-		return deliveryServices.length == selectedDeliveryServiceIds.length;
-	};
-
-	$scope.selectAll = function($event) {
-		var checkbox = $event.target;
-		if (checkbox.checked) {
-			addAll();
-		} else {
-			removeAll();
-		}
-	};
-
-	$scope.updateDeliveryServices = function($event, dsId) {
-		var checkbox = $event.target;
-		if (checkbox.checked) {
-			addDS(dsId);
-		} else {
-			removeDS(dsId);
-		}
-	};
-
-	$scope.submit = function() {
-		$uibModalInstance.close(selectedDeliveryServiceIds);
-	};
-
-	$scope.cancel = function () {
-		$uibModalInstance.dismiss('cancel');
-	};
-
-	angular.element(document).ready(function () {
-		$('#userDSUnassignedTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"order": [[ 1, 'asc' ]],
-			"columnDefs": [
-				{ 'orderable': false, 'targets': 0 },
-				{ "width": "5%", "targets": 0 }
-			]
-		});
-	});
-
-};
-
-TableUserDSUnassignedController.$inject = ['user', 'deliveryServices', 'userDeliveryServices', '$scope', '$uibModalInstance'];
-module.exports = TableUserDSUnassignedController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/TableUserDeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/TableUserDeliveryServicesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/TableUserDeliveryServicesController.js
deleted file mode 100644
index 69ab8bf..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/TableUserDeliveryServicesController.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableUserDeliveryServicesController = function(user, userDeliveryServices, $scope, $state, $uibModal, locationUtils, userService) {
-
-	$scope.user = user;
-
-	$scope.userDeliveryServices = userDeliveryServices;
-
-	$scope.removeDS = function(dsId) {
-		userService.deleteUserDeliveryService(user.id, dsId)
-			.then(
-				function() {
-					$scope.refresh();
-				}
-			);
-	};
-
-	$scope.selectDSs = function() {
-		var modalInstance = $uibModal.open({
-			templateUrl: 'common/modules/table/userDeliveryServices/table.userDSUnassigned.tpl.html',
-			controller: 'TableUserDSUnassignedController',
-			size: 'lg',
-			resolve: {
-				user: function() {
-					return user;
-				},
-				deliveryServices: function(deliveryServiceService) {
-					return deliveryServiceService.getDeliveryServices();
-				},
-				userDeliveryServices: function() {
-					return userDeliveryServices;
-				}
-			}
-		});
-		modalInstance.result.then(function(selectedDSIds) {
-			console.log(selectedDSIds);
-			userService.assignUserDeliveryServices(user.id, selectedDSIds)
-				.then(
-					function() {
-						$scope.refresh();
-					}
-				);
-		}, function () {
-			// do nothing
-		});
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#deliveryServicesTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableUserDeliveryServicesController.$inject = ['user', 'userDeliveryServices', '$scope', '$state', '$uibModal', 'locationUtils', 'userService'];
-module.exports = TableUserDeliveryServicesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/index.js
deleted file mode 100644
index 4bcbe1e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.userDeliveryServices', [])
-	.controller('TableUserDeliveryServicesController', require('./TableUserDeliveryServicesController'))
-	.controller('TableUserDSUnassignedController', require('./TableUserDSUnassignedController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/table.userDSUnassigned.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/table.userDSUnassigned.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/table.userDSUnassigned.tpl.html
deleted file mode 100644
index 58d9621..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/table.userDSUnassigned.tpl.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-
-
-<div class="modal-header">
-    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-    <h3 class="modal-title">Assign Delivery Services to {{::user.username}}</h3>
-</div>
-<div class="modal-body">
-    <table id="userDSUnassignedTable" class="table responsive-utilities jambo_table" style="table-layout:fixed; width:100%;">
-        <thead>
-        <tr class="headings">
-            <th style="padding-left: 10px;"><input type="checkbox" ng-click="selectAll($event)" ng-checked="allSelected()"></th>
-            <th>xmlId</th>
-            <th>displayName</th>
-        </tr>
-        </thead>
-        <tbody>
-        <tr ng-repeat="ds in ::selectedDSs">
-            <td><input type="checkbox" ng-click="updateDeliveryServices($event, ds.id)" ng-checked="ds.selected"></td>
-            <td>{{::ds.xmlId}}</td>
-            <td>{{::ds.displayName}}</td>
-        </tr>
-        </tbody>
-    </table>
-</div>
-<div class="modal-footer">
-    <button class="btn btn-link" ng-click="cancel()">cancel</button>
-    <button class="btn btn-primary" ng-click="submit()">Submit</button>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/table.userDeliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/table.userDeliveryServices.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/table.userDeliveryServices.tpl.html
deleted file mode 100644
index c0122cb..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/userDeliveryServices/table.userDeliveryServices.tpl.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/users')">Users</a></li>
-            <li><a ng-click="navigateToPath('/admin/users/' + user.id)">{{::user.username}}</a></li>
-            <li class="active">Delivery Services</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Link Delivery Services to User" ng-click="selectDSs()"><i class="fa fa-link"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="deliveryServicesTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>xmlId</th>
-                <th>orgServerFqdn</th>
-                <th>cdn</th>
-                <th></th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-repeat="deliveryService in ::userDeliveryServices">
-                <td>{{::deliveryService.xmlId}}</td>
-                <td>{{::deliveryService.orgServerFqdn}}</td>
-                <td>{{::deliveryService.cdnName}}</td>
-                <td><button type="button" class="btn btn-link" title="Unlink Delivery Service from User" ng-click="removeDS(deliveryService.id)"><i class="fa fa-chain-broken"></i></button></td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/users/TableUsersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/users/TableUsersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/users/TableUsersController.js
deleted file mode 100644
index 867bddf..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/users/TableUsersController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableUsersController = function(users, $scope, $state, locationUtils) {
-
-    $scope.users = users;
-
-    $scope.editUser = function(id) {
-        locationUtils.navigateToPath('/admin/users/' + id);
-    };
-
-    $scope.createUser = function() {
-        locationUtils.navigateToPath('/admin/users/new');
-    };
-
-    $scope.refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-    angular.element(document).ready(function () {
-        $('#usersTable').dataTable({
-            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-            "iDisplayLength": 25,
-            "aaSorting": []
-        });
-    });
-
-};
-
-TableUsersController.$inject = ['users', '$scope', '$state', 'locationUtils'];
-module.exports = TableUsersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/users/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/users/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/users/index.js
deleted file mode 100644
index ee8604d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/users/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.users', [])
-    .controller('TableUsersController', require('./TableUsersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/users/table.users.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/users/table.users.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/users/table.users.tpl.html
deleted file mode 100644
index 928b4aa..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/users/table.users.tpl.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">Users</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Create User" ng-click="createUser()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="usersTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>Full Name</th>
-                <th>Username</th>
-                <th>Email</th>
-                <th>Role</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editUser(user.id)" ng-repeat="user in ::users">
-                <td>{{::user.fullName}}</td>
-                <td>{{::user.username}}</td>
-                <td>{{::user.email}}</td>
-                <td>{{::user.rolename}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-
-
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/WidgetCacheGroupsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/WidgetCacheGroupsController.js b/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/WidgetCacheGroupsController.js
deleted file mode 100644
index 43cda07..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/WidgetCacheGroupsController.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var WidgetCacheGroupsController = function(cacheGroupHealth, $scope, locationUtils) {
-
-	// pagination
-	$scope.currentCacheGroupsPage = 1;
-	$scope.cacheGroupsPerPage = 10;
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	$scope.onlinePercent = function(location) {
-		return (location.online / (location.online + location.offline)) * 100;
-	};
-
-	var init = function() {
-		if (cacheGroupHealth) {
-			// only set this if it's passed in
-			$scope.cacheGroupHealth = cacheGroupHealth;
-		}
-	};
-	init();
-
-};
-
-WidgetCacheGroupsController.$inject = ['cacheGroupHealth', '$scope', 'locationUtils'];
-module.exports = WidgetCacheGroupsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/_widget.cacheGroups.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/_widget.cacheGroups.scss b/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/_widget.cacheGroups.scss
deleted file mode 100644
index 99435c4..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/_widget.cacheGroups.scss
+++ /dev/null
@@ -1,62 +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.
-
-*/
-
-#cache-groups-outer-container {
-
-  #cacheGroupsContainer {
-    max-height: 452px;
-    margin-bottom: 0;
-
-    .list-group-item {
-      background-color: transparent;
-    }
-
-    .cache-group-health {
-      height: 45px;
-
-      .cache-groups-table {
-        margin-top: -10px;
-        border-style: none;
-
-        td {
-          border-top: none !important;
-          padding: 12px 8px !important;
-        }
-
-      }
-
-    }
-
-  }
-
-  .cache-groups-pagination {
-    margin: 0 0 10px 0;
-    float: left;
-  }
-
-  .cache-group-search-form {
-    float: right;
-    width: 250px;
-    margin-bottom: 10px;
-  }
-
-}
-
-#cacheGroupsLoadingContainer {
-  height: 555px;
-  background-color: transparent;
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/index.js b/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/index.js
deleted file mode 100644
index 3da2fce..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.widget.cacheGroups', [])
-	.controller('WidgetCacheGroupsController', require('./WidgetCacheGroupsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/widget.cacheGroups.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/widget.cacheGroups.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/widget.cacheGroups.tpl.html
deleted file mode 100644
index 38fa790..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/cacheGroups/widget.cacheGroups.tpl.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_title">
-    <h2>Cache Groups <small>{{cacheGroupHealth.totalOnline/(cacheGroupHealth.totalOnline + cacheGroupHealth.totalOffline) | percentFilter}} online</small></h2>
-    <ul class="nav navbar-right panel_toolbox">
-        <li><a class="collapse-link" ng-click="navigateToPath('/monitor/map')"><i class="fa fa-map-marker"></i></a></li>
-        <li><a class="collapse-link"><i class="fa fa-chevron-up"></i></a></li>
-        <li><a class="close-link"><i class="fa fa-close"></i></a></li>
-    </ul>
-    <div class="clearfix"></div>
-</div>
-<div class="x_content">
-    <div id="cache-groups-outer-container">
-        <div id="cacheGroupsContainer">
-            <div class="alert alert-info" ng-show="(cacheGroupHealth.cachegroups | filter:search:strict).length == 0">
-                No matching cache groups
-            </div>
-            <div class="list-group">
-                <a class="cache-group-health list-group-item" ng-repeat="cg in cacheGroupHealth.cachegroups | orderBy:[onlinePercent, 'name'] | filter:search:strict | offsetFilter:(currentCacheGroupsPage-1)*cacheGroupsPerPage | limitTo:cacheGroupsPerPage">
-                    <div class="row">
-                        <table class="cache-groups-table table">
-                            <tbody>
-                            <tr>
-                                <td class="col-lg-4 col-md-4 col-sm-4">{{cg.name}}</td>
-                                <td class="col-lg-4 col-md-4 col-sm-4">{{cg.online/(cg.online + cg.offline) | percentFilter}} Online [ {{cg.online}} Online | {{cg.offline}} Offline ]</td>
-                                <td class="col-lg-4 col-md-4 col-sm-4">
-                                    <div class="progress">
-                                        <div class="progress-bar bg-green" role="progressbar" ng-style="{'width': onlinePercent(cg) + '%'}">
-                                            <span class="sr-only">{{cg.online}} Servers Online | {{cg.offline}} Servers Offline</span>
-                                        </div>
-                                    </div>
-                                </td>
-                            </tr>
-                            </tbody>
-                        </table>
-                    </div>
-                </a>
-            </div>
-        </div>
-        <div>
-            <div ng-show="(cacheGroupHealth.cachegroups | filter:search:strict).length > 0">
-                <uib-pagination class="cache-groups-pagination pagination-md" boundary-links="true" max-size="2" total-items="(cacheGroupHealth.cachegroups | filter:search:strict).length" items-per-page="cacheGroupsPerPage" ng-model="currentCacheGroupsPage" previous-text="&lsaquo;" next-text="&rsaquo;" first-text="&laquo;" last-text="&raquo;"></uib-pagination>
-            </div>
-            <div class="input-group cache-group-search-form">
-                <input type="text" class="filter-input form-control" placeholder="Filter cache groups..." ng-model="search.name">
-                <span class="filter-input-group-btn input-group-btn">
-                    <button class="btn btn-default" type="button"><i class="fa fa-search"></i></button>
-                </span>
-            </div>
-        </div>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/WidgetCapacityController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/WidgetCapacityController.js b/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/WidgetCapacityController.js
deleted file mode 100644
index e7c57cb..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/WidgetCapacityController.js
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var WidgetCapacityController = function($scope, cdnService) {
-
-	var getCapacity = function() {
-		cdnService.getCapacity()
-			.then(function(response) {
-				$scope.availablePercent = response.availablePercent;
-				$scope.utilizedPercent = response.utilizedPercent;
-				$scope.maintenancePercent = response.maintenancePercent;
-				$scope.unavailablePercent = response.unavailablePercent;
-
-				var data = [];
-
-				data.push({
-					label: "Available",
-					color: '#1ABB9C',
-					data: $scope.availablePercent
-				});
-				data.push({
-					label: "Utilized",
-					color: '#3498DB',
-					data: $scope.utilizedPercent
-				});
-				data.push({
-					label: "Maintenance",
-					color: '#73879C',
-					data: $scope.maintenancePercent
-				});
-				data.push({
-					label: "Down",
-					color: '#E74C3C',
-					data: $scope.unavailablePercent
-				});
-
-				buildGraph(data);
-			});
-
-	};
-
-	var buildGraph = function(graphData) {
-
-		var options = {
-			series: {
-				pie: {
-					show: true,
-					innerRadius: 0.5,
-					radius: 1,
-					label: {
-						show: false
-					}
-				}
-			},
-			grid: {
-				hoverable: true
-			},
-			tooltip: true,
-			tooltipOpts: {
-				cssClass: "capacityChartTooltip",
-				content: "%s: %p.2%",
-				defaultTheme: false
-			},
-			legend: {
-				show: false
-			}
-		};
-
-		$.plot($("#capacityChart"), graphData, options);
-	};
-
-	$scope.availablePercent = 0;
-	$scope.utilizedPercent = 0;
-	$scope.maintenancePercent = 0;
-	$scope.unavailablePercent = 0;
-
-	var init = function() {
-		getCapacity();
-	};
-	init();
-
-};
-
-WidgetCapacityController.$inject = ['$scope', 'cdnService'];
-module.exports = WidgetCapacityController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/_widget.capacity.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/_widget.capacity.scss b/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/_widget.capacity.scss
deleted file mode 100644
index a275546..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/_widget.capacity.scss
+++ /dev/null
@@ -1,31 +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.
-
-*/
-
-#capacityChart {
-  left: 0px;
-  top: 0px;
-  width: 200px;
-  height: 200px;
-}
-.capacityChartTooltip {
-  padding: 3px 5px;
-  background-color: #000;
-  z-index: 100;
-  color: #fff;
-  opacity: .80;
-  filter: alpha(opacity=85);
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/index.js b/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/index.js
deleted file mode 100644
index 9533f6b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.widget.capacity', [])
-	.controller('WidgetCapacityController', require('./WidgetCapacityController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/widget.capacity.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/widget.capacity.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/widget.capacity.tpl.html
deleted file mode 100644
index 8dd89e2..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/widget/capacity/widget.capacity.tpl.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_title">
-    <h2>Overall Capacity</h2>
-    <ul class="nav navbar-right panel_toolbox">
-        <li><a class="collapse-link"><i class="fa fa-chevron-up"></i></a></li>
-        <li><a class="close-link"><i class="fa fa-close"></i></a></li>
-    </ul>
-    <div class="clearfix"></div>
-</div>
-<div class="x_content">
-    <table class="" style="width:100%">
-        <tr>
-            <td>
-                <div id="capacityChart"></div>
-            </td>
-            <td>
-                <table class="tile_info">
-                    <tr>
-                        <td>
-                            <p><i class="fa fa-square green"></i>Available</p>
-                        </td>
-                        <td>{{availablePercent | number:2}}%</td>
-                    </tr>
-                    <tr>
-                        <td>
-                            <p><i class="fa fa-square blue"></i>Utilized</p>
-                        </td>
-                        <td>{{utilizedPercent | number:2}}%</td>
-                    </tr>
-                    <tr>
-                        <td>
-                            <p><i class="fa fa-square gray"></i>Maintenance</p>
-                        </td>
-                        <td>{{maintenancePercent | number:2}}%</td>
-                    </tr>
-                    <tr>
-                        <td>
-                            <p><i class="fa fa-square red"></i>Down</p>
-                        </td>
-                        <td>{{unavailablePercent | number:2}}%</td>
-                    </tr>
-                </table>
-            </td>
-        </tr>
-    </table>
-</div>



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/job/form.job.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/job/form.job.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/job/form.job.tpl.html
deleted file mode 100644
index 4839aeb..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/job/form.job.tpl.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb">
-            <li><a ng-click="navigateToPath('/admin/jobs')">Invalidate Content Jobs</a></li>
-            <li class="active">{{jobName}}</li>
-        </ol>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="jobForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(jobForm.deliveryservice), 'has-feedback': hasError(jobForm.deliveryservice)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Delivery Service *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="deliveryservice" name="deliveryservice" class="form-control" ng-model="job.dsId" ng-options="deliveryservice.id as deliveryservice.xmlId for deliveryservice in deliveryservices" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(jobForm.deliveryservice, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(jobForm.regex), 'has-feedback': hasError(jobForm.regex)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Path Regex *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="regex" name="regex" type="text" class="form-control" placeholder="eg. /path/to/content/.*\.jpg" ng-model="job.regex" ng-required="true" ng-maxlength="255" ng-pattern="/^\//" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(jobForm.regex, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(jobForm.regex, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(jobForm.regex, 'pattern')">Must Start with /</small>
-                    <span ng-show="hasError(jobForm.regex)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(jobForm.ttl), 'has-feedback': hasError(jobForm.ttl)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">TTL (hours) *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="ttl" name="ttl" type="text" class="form-control" ng-model="job.ttl" ng-required="true" ng-maxlength="1000" ng-pattern="/^\d+$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(jobForm.ttl, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(jobForm.ttl, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(jobForm.ttl, 'pattern')">Number</small>
-                    <span ng-show="hasError(jobForm.ttl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-success" ng-disabled="jobForm.$pristine || jobForm.$invalid" ng-click="save(job)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/job/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/job/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/job/index.js
deleted file mode 100644
index 99b48f9..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/job/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.job', [])
-	.controller('FormJobController', require('./FormJobController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/FormNewJobController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/FormNewJobController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/FormNewJobController.js
deleted file mode 100644
index 4ecde31..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/FormNewJobController.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewJobController = function(job, $scope, $controller, jobService, messageModel, locationUtils) {
-
-	// extends the FormJobController to inherit common methods
-	angular.extend(this, $controller('FormJobController', { job: job, $scope: $scope }));
-
-	$scope.jobName = 'New';
-
-	$scope.settings = {
-		isNew: true,
-		saveLabel: 'Create'
-	};
-
-	$scope.save = function(job) {
-		jobService.createJob(job)
-			.then(
-				function() {
-					messageModel.setMessages([ { level: 'success', text: 'Invalidate Content Job Created' } ], true);
-					locationUtils.navigateToPath('/admin/jobs');
-				},
-				function(fault) {
-					messageModel.setMessages(fault.data.alerts, false);
-				}
-			);
-	};
-
-};
-
-FormNewJobController.$inject = ['job', '$scope', '$controller', 'jobService', 'messageModel', 'locationUtils'];
-module.exports = FormNewJobController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/index.js
deleted file mode 100644
index 6c118d9..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/job/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.job.new', [])
-	.controller('FormNewJobController', require('./FormNewJobController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/FormParameterController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/FormParameterController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/FormParameterController.js
deleted file mode 100644
index 4de9b5a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/FormParameterController.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormParameterController = function(parameter, $scope, $location, formUtils, stringUtils, locationUtils) {
-
-    $scope.parameter = parameter;
-
-    $scope.props = [
-        { name: 'name', type: 'text', required: true, maxLength: 1024 },
-        { name: 'configFile', type: 'text', required: true, maxLength: 45 },
-        { name: 'value', type: 'text', required: true, maxLength: 1024 }
-    ];
-
-    $scope.labelize = stringUtils.labelize;
-
-    $scope.viewProfiles = function() {
-        $location.path($location.path() + '/profiles');
-    };
-
-    $scope.viewCacheGroups = function() {
-        $location.path($location.path() + '/cache-groups');
-    };
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-};
-
-FormParameterController.$inject = ['parameter', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils'];
-module.exports = FormParameterController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/edit/FormEditParameterController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/edit/FormEditParameterController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/edit/FormEditParameterController.js
deleted file mode 100644
index 4074104..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/edit/FormEditParameterController.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditParameterController = function(parameter, $scope, $controller, $uibModal, $anchorScroll, locationUtils, parameterService) {
-
-    // extends the FormParameterController to inherit common methods
-    angular.extend(this, $controller('FormParameterController', { parameter: parameter, $scope: $scope }));
-
-    var deleteParameter = function(parameter) {
-        parameterService.deleteParameter(parameter.id)
-            .then(function() {
-                locationUtils.navigateToPath('/admin/parameters');
-            });
-    };
-
-    $scope.parameterName = angular.copy(parameter.name);
-
-    $scope.settings = {
-        isNew: false,
-        saveLabel: 'Update'
-    };
-
-    $scope.save = function(parameter) {
-        parameterService.updateParameter(parameter).
-            then(function() {
-                $scope.parameterName = angular.copy(parameter.name);
-                $anchorScroll(); // scrolls window to top
-            });
-    };
-
-    $scope.confirmDelete = function(parameter) {
-        var params = {
-            title: 'Delete Parameter: ' + parameter.name,
-            key: parameter.name
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-            controller: 'DialogDeleteController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                }
-            }
-        });
-        modalInstance.result.then(function() {
-            deleteParameter(parameter);
-        }, function () {
-            // do nothing
-        });
-    };
-
-};
-
-FormEditParameterController.$inject = ['parameter', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'parameterService'];
-module.exports = FormEditParameterController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/edit/index.js
deleted file mode 100644
index 76da6e4..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.parameter.edit', [])
-    .controller('FormEditParameterController', require('./FormEditParameterController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/form.parameter.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/form.parameter.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/form.parameter.tpl.html
deleted file mode 100644
index 6f31745..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/form.parameter.tpl.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/parameters')">Parameters</a></li>
-            <li class="active">{{parameterName}}</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <button class="btn btn-primary" title="View Profiles" ng-click="viewProfiles()">View Profiles</button>
-            <!-- todo: show cachegroups for a parameter -->
-            <!--<button class="btn btn-primary" title="View Cache Groups" ng-click="viewCacheGroups()">View Cache Groups</button>-->
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="parameterForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(parameterForm[prop.name]), 'has-feedback': hasError(parameterForm[prop.name])}" ng-repeat="prop in props">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">{{labelize(prop.name)}} <span ng-show="prop.required">*</span></label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="{{prop.name}}" name="{{prop.name}}" type="{{prop.type}}" class="form-control" ng-model="parameter[prop.name]" ng-readonly="prop.readonly" ng-required="prop.required" ng-maxlength="prop.maxLength" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(parameterForm[prop.name], 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(parameterForm[prop.name], 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(parameterForm[prop.name])" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(parameter)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="parameterForm.$pristine || parameterForm.$invalid" ng-click="save(parameter)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/index.js
deleted file mode 100644
index 04b7fbb..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.parameter', [])
-    .controller('FormParameterController', require('./FormParameterController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/new/FormNewParameterController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/new/FormNewParameterController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/new/FormNewParameterController.js
deleted file mode 100644
index 56b9202..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/new/FormNewParameterController.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewParameterController = function(parameter, $scope, $controller, parameterService) {
-
-    // extends the FormParameterController to inherit common methods
-    angular.extend(this, $controller('FormParameterController', { parameter: parameter, $scope: $scope }));
-
-    $scope.parameterName = 'New';
-
-    $scope.settings = {
-        isNew: true,
-        saveLabel: 'Create'
-    };
-
-    $scope.save = function(parameter) {
-        parameterService.createParameter(parameter);
-    };
-
-};
-
-FormNewParameterController.$inject = ['parameter', '$scope', '$controller', 'parameterService'];
-module.exports = FormNewParameterController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/new/index.js
deleted file mode 100644
index 56d835d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/parameter/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.parameter.new', [])
-    .controller('FormNewParameterController', require('./FormNewParameterController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/FormPhysLocationController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/FormPhysLocationController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/FormPhysLocationController.js
deleted file mode 100644
index d7f78fc..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/FormPhysLocationController.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormPhysLocationController = function(physLocation, $scope, $location, formUtils, stringUtils, locationUtils, regionService) {
-
-    var getRegions = function() {
-        regionService.getRegions()
-            .then(function(result) {
-                $scope.regions = result;
-            });
-    };
-
-    $scope.physLocation = physLocation;
-
-    $scope.props = [
-        { name: 'name', type: 'text', required: true, maxLength: 45 },
-        { name: 'shortName', type: 'text', required: true, maxLength: 12 },
-        { name: 'address', type: 'text', required: true, maxLength: 128 },
-        { name: 'city', type: 'text', required: true, maxLength: 128 },
-        { name: 'state', type: 'text', required: true, maxLength: 2 },
-        { name: 'zip', type: 'text', required: true, maxLength: 5 },
-        { name: 'poc', type: 'text', required: false, maxLength: 128 },
-        { name: 'phone', type: 'text', required: false, maxLength: 45 },
-        { name: 'email', type: 'email', required: false, maxLength: 128 }
-    ];
-
-    $scope.labelize = stringUtils.labelize;
-
-    $scope.viewServers = function() {
-        $location.path($location.path() + '/servers');
-    };
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-    var init = function () {
-        getRegions();
-    };
-    init();
-
-};
-
-FormPhysLocationController.$inject = ['physLocation', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils', 'regionService'];
-module.exports = FormPhysLocationController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/edit/FormEditPhysLocationController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/edit/FormEditPhysLocationController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/edit/FormEditPhysLocationController.js
deleted file mode 100644
index 688829a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/edit/FormEditPhysLocationController.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditPhysLocationController = function(physLocation, $scope, $controller, $uibModal, $anchorScroll, locationUtils, physLocationService) {
-
-    // extends the FormPhysLocationController to inherit common methods
-    angular.extend(this, $controller('FormPhysLocationController', { physLocation: physLocation, $scope: $scope }));
-
-    var deletePhysLocation = function(physLocation) {
-        physLocationService.deletePhysLocation(physLocation.id)
-            .then(function() {
-                locationUtils.navigateToPath('/admin/phys-locations');
-            });
-    };
-
-    $scope.physLocationName = angular.copy(physLocation.name);
-
-    $scope.settings = {
-        isNew: false,
-        saveLabel: 'Update'
-    };
-
-    $scope.save = function(physLocation) {
-        physLocationService.updatePhysLocation(physLocation).
-            then(function() {
-                $scope.physLocationName = angular.copy(physLocation.name);
-                $anchorScroll(); // scrolls window to top
-            });
-    };
-
-    $scope.confirmDelete = function(physLocation) {
-        var params = {
-            title: 'Delete Physical Location: ' + physLocation.name,
-            key: physLocation.name
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-            controller: 'DialogDeleteController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                }
-            }
-        });
-        modalInstance.result.then(function() {
-            deletePhysLocation(physLocation);
-        }, function () {
-            // do nothing
-        });
-    };
-
-};
-
-FormEditPhysLocationController.$inject = ['physLocation', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'physLocationService'];
-module.exports = FormEditPhysLocationController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/edit/index.js
deleted file mode 100644
index d042d95..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.physLocation.edit', [])
-    .controller('FormEditPhysLocationController', require('./FormEditPhysLocationController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/form.physLocation.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/form.physLocation.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/form.physLocation.tpl.html
deleted file mode 100644
index c2d66d4..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/form.physLocation.tpl.html
+++ /dev/null
@@ -1,64 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/phys-locations')">Physical Locations</a></li>
-            <li class="active">{{physLocationName}}</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <button class="btn btn-primary" title="View Servers" ng-click="viewServers()">View Servers</button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="physLocationForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(physLocationForm[prop.name]), 'has-feedback': hasError(physLocationForm[prop.name])}" ng-repeat="prop in props">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">{{labelize(prop.name)}} <span ng-show="prop.required">*</span></label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="{{prop.name}}" name="{{prop.name}}" type="{{prop.type}}" class="form-control" ng-model="physLocation[prop.name]" ng-readonly="prop.readonly" ng-required="prop.required" ng-maxlength="prop.maxLength" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(physLocationForm[prop.name], 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(physLocationForm[prop.name], 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(physLocationForm[prop.name])" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(physLocationForm.region), 'has-feedback': hasError(physLocationForm.region)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Region *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="region" name="region" class="form-control" ng-model="physLocation.regionId" ng-options="region.id as region.name for region in regions" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(physLocationForm.region, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="form-group">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Comments</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <textarea id="comments" name="comments" rows="5" cols="17" class="form-control" ng-model="physLocation.comments" maxlength="256"></textarea>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(physLocation)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="physLocationForm.$pristine || physLocationForm.$invalid" ng-click="save(physLocation)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/index.js
deleted file mode 100644
index 402f625..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.physLocation', [])
-    .controller('FormPhysLocationController', require('./FormPhysLocationController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/new/FormNewPhysLocationController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/new/FormNewPhysLocationController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/new/FormNewPhysLocationController.js
deleted file mode 100644
index ba4aaa3..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/new/FormNewPhysLocationController.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewPhysLocationController = function(physLocation, $scope, $controller, physLocationService) {
-
-    // extends the FormPhysLocationController to inherit common methods
-    angular.extend(this, $controller('FormPhysLocationController', { physLocation: physLocation, $scope: $scope }));
-
-    $scope.physLocationName = 'New';
-
-    $scope.settings = {
-        isNew: true,
-        saveLabel: 'Create'
-    };
-
-    $scope.save = function(physLocation) {
-        physLocationService.createPhysLocation(physLocation);
-    };
-
-};
-
-FormNewPhysLocationController.$inject = ['physLocation', '$scope', '$controller', 'physLocationService'];
-module.exports = FormNewPhysLocationController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/new/index.js
deleted file mode 100644
index 5297288..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/physLocation/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.physLocation.new', [])
-    .controller('FormNewPhysLocationController', require('./FormNewPhysLocationController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/profile/FormProfileController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/FormProfileController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/profile/FormProfileController.js
deleted file mode 100644
index 1523ee0..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/FormProfileController.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormProfileController = function(profile, $scope, $location, formUtils, locationUtils, cdnService) {
-
-    var getCDNs = function() {
-        cdnService.getCDNs(true)
-            .then(function(result) {
-                $scope.cdns = result;
-            });
-    };
-
-    $scope.profile = profile;
-
-    $scope.types = [
-        { value: 'ATS_PROFILE' },
-        { value: 'TR_PROFILE' },
-        { value: 'TM_PROFILE' },
-        { value: 'TS_PROFILE' },
-        { value: 'TP_PROFILE' },
-        { value: 'INFLUXDB_PROFILE' },
-        { value: 'RIAK_PROFILE' },
-        { value: 'SPLUNK_PROFILE' },
-        { value: 'DS_PROFILE' },
-        { value: 'ORG_PROFILE' },
-        { value: 'KAFKA_PROFILE' },
-        { value: 'LOGSTASH_PROFILE' },
-        { value: 'ES_PROFILE' },
-        { value: 'UNK_PROFILE' }
-    ];
-
-    $scope.viewParams = function() {
-        $location.path($location.path() + '/parameters');
-    };
-
-    $scope.viewServers = function() {
-        $location.path($location.path() + '/servers');
-    };
-
-    $scope.viewDeliveryServices = function() {
-        $location.path($location.path() + '/delivery-services');
-    };
-
-    $scope.cloneProfile = function() {
-        alert('not hooked up yet: cloneProfile');
-    };
-
-    $scope.exportProfile = function() {
-        alert('not hooked up yet: exportProfile');
-    };
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-    var init = function () {
-        getCDNs();
-    };
-    init();
-
-};
-
-FormProfileController.$inject = ['profile', '$scope', '$location', 'formUtils', 'locationUtils', 'cdnService'];
-module.exports = FormProfileController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/profile/edit/FormEditProfileController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/edit/FormEditProfileController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/profile/edit/FormEditProfileController.js
deleted file mode 100644
index cf80884..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/edit/FormEditProfileController.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditProfileController = function(profile, $scope, $controller, $uibModal, $anchorScroll, locationUtils, profileService) {
-
-    // extends the FormProfileController to inherit common methods
-    angular.extend(this, $controller('FormProfileController', { profile: profile, $scope: $scope }));
-
-    var deleteProfile = function(profile) {
-        profileService.deleteProfile(profile.id)
-            .then(function() {
-                locationUtils.navigateToPath('/admin/profiles');
-            });
-    };
-
-    $scope.profileName = angular.copy(profile.name);
-
-    $scope.settings = {
-        isNew: false,
-        saveLabel: 'Update'
-    };
-
-    $scope.save = function(profile) {
-        profileService.updateProfile(profile).
-            then(function() {
-                $scope.profileName = angular.copy(profile.name);
-                $anchorScroll(); // scrolls window to top
-            });
-    };
-
-    $scope.confirmDelete = function(profile) {
-        var params = {
-            title: 'Delete Profile: ' + profile.name,
-            key: profile.name
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-            controller: 'DialogDeleteController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                }
-            }
-        });
-        modalInstance.result.then(function() {
-            deleteProfile(profile);
-        }, function () {
-            // do nothing
-        });
-    };
-
-};
-
-FormEditProfileController.$inject = ['profile', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'profileService'];
-module.exports = FormEditProfileController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/profile/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/profile/edit/index.js
deleted file mode 100644
index 1050ddb..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.profile.edit', [])
-    .controller('FormEditProfileController', require('./FormEditProfileController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/profile/form.profile.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/form.profile.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/profile/form.profile.tpl.html
deleted file mode 100644
index e88ff0d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/form.profile.tpl.html
+++ /dev/null
@@ -1,87 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/profiles')">Profiles</a></li>
-            <li class="active">{{profileName}}</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <button class="btn btn-primary" title="View Parameters" ng-click="viewParams()">View Parameters</button>
-            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
-                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    More&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="viewDeliveryServices()" ng-if="profile.type == 'DS_PROFILE'">View Delivery Services</a></li>
-                    <li role="menuitem"><a ng-click="viewParams()">View Parameters</a></li>
-                    <li role="menuitem"><a ng-click="viewServers()" ng-if="profile.type != 'DS_PROFILE'">View Servers</a></li>
-                    <li class="divider"></li>
-                    <li role="menuitem"><a ng-click="cloneProfile()">Clone Profile</a></li>
-                    <li role="menuitem"><a ng-click="exportProfile()">Export Profile</a></li>
-                </ul>
-            </div>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="profileForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(profileForm.name), 'has-feedback': hasError(profileForm.name)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Name *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="name" name="name" type="text" class="form-control" ng-model="profile.name" ng-required="true" ng-maxlength="45" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(profileForm.name, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(profileForm.name, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(profileForm.name)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(profileForm.cdn), 'has-feedback': hasError(profileForm.cdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="cdn" name="cdn" class="form-control" ng-model="profile.cdn" ng-options="cdn.id as cdn.name for cdn in cdns" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(profileForm.cdn, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(profileForm.type), 'has-feedback': hasError(profileForm.type)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Type *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="type" name="type" class="form-control" ng-model="profile.type" ng-options="type.value as type.value for type in types" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(profileForm.cdn, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="form-group">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Description</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <textarea id="description" name="description" rows="3" cols="17" class="form-control" ng-model="profile.description" maxlength="256"></textarea>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(profile)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="profileForm.$pristine || profileForm.$invalid" ng-click="save(profile)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/profile/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/profile/index.js
deleted file mode 100644
index 293da23..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.profile', [])
-    .controller('FormProfileController', require('./FormProfileController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/profile/new/FormNewProfileController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/new/FormNewProfileController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/profile/new/FormNewProfileController.js
deleted file mode 100644
index 19b42c9..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/new/FormNewProfileController.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewProfileController = function(profile, $scope, $controller, profileService) {
-
-    // extends the FormProfileController to inherit common methods
-    angular.extend(this, $controller('FormProfileController', { profile: profile, $scope: $scope }));
-
-    $scope.profileName = 'New';
-
-    $scope.settings = {
-        isNew: true,
-        saveLabel: 'Create'
-    };
-
-    $scope.save = function(profile) {
-        profileService.createProfile(profile);
-    };
-
-};
-
-FormNewProfileController.$inject = ['profile', '$scope', '$controller', 'profileService'];
-module.exports = FormNewProfileController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/profile/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/profile/new/index.js
deleted file mode 100644
index d36a4c3..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/profile/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.profile.new', [])
-    .controller('FormNewProfileController', require('./FormNewProfileController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/region/FormRegionController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/region/FormRegionController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/region/FormRegionController.js
deleted file mode 100644
index 83c0bef..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/region/FormRegionController.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormRegionController = function(region, $scope, $location, formUtils, stringUtils, locationUtils, divisionService) {
-
-    var getDivisions = function() {
-        divisionService.getDivisions()
-            .then(function(result) {
-                $scope.divisions = result;
-            });
-    };
-
-    $scope.region = region;
-
-    $scope.props = [
-        { name: 'name', type: 'text', required: true, maxLength: 45 }
-    ];
-
-    $scope.labelize = stringUtils.labelize;
-
-    $scope.viewPhysLocations = function() {
-        $location.path($location.path() + '/phys-locations');
-    };
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-    var init = function () {
-        getDivisions();
-    };
-    init();
-
-};
-
-FormRegionController.$inject = ['region', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils', 'divisionService'];
-module.exports = FormRegionController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/region/edit/FormEditRegionController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/region/edit/FormEditRegionController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/region/edit/FormEditRegionController.js
deleted file mode 100644
index 0e11293..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/region/edit/FormEditRegionController.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditRegionController = function(region, $scope, $controller, $uibModal, $anchorScroll, locationUtils, regionService) {
-
-    // extends the FormRegionController to inherit common methods
-    angular.extend(this, $controller('FormRegionController', { region: region, $scope: $scope }));
-
-    var deleteRegion = function(region) {
-        regionService.deleteRegion(region.id)
-            .then(function() {
-                locationUtils.navigateToPath('/admin/regions');
-            });
-    };
-
-    $scope.regionName = angular.copy(region.name);
-
-    $scope.settings = {
-        isNew: false,
-        saveLabel: 'Update'
-    };
-
-    $scope.save = function(region) {
-        regionService.updateRegion(region).
-            then(function() {
-                $scope.regionName = angular.copy(region.name);
-                $anchorScroll(); // scrolls window to top
-            });
-    };
-
-    $scope.confirmDelete = function(region) {
-        var params = {
-            title: 'Delete Region: ' + region.name,
-            key: region.name
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-            controller: 'DialogDeleteController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                }
-            }
-        });
-        modalInstance.result.then(function() {
-            deleteRegion(region);
-        }, function () {
-            // do nothing
-        });
-    };
-
-};
-
-FormEditRegionController.$inject = ['region', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'regionService'];
-module.exports = FormEditRegionController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/region/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/region/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/region/edit/index.js
deleted file mode 100644
index bda4bea..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/region/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.region.edit', [])
-    .controller('FormEditRegionController', require('./FormEditRegionController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/region/form.region.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/region/form.region.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/region/form.region.tpl.html
deleted file mode 100644
index a37325e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/region/form.region.tpl.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/regions')">Regions</a></li>
-            <li class="active">{{regionName}}</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <button class="btn btn-primary" title="View Phys Locations" ng-click="viewPhysLocations()">View Phys Locations</button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="regionForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(regionForm[prop.name]), 'has-feedback': hasError(regionForm[prop.name])}" ng-repeat="prop in props">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">{{labelize(prop.name)}} <span ng-show="prop.required">*</span></label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="{{prop.name}}" name="{{prop.name}}" type="{{prop.type}}" class="form-control" ng-model="region[prop.name]" ng-readonly="prop.readonly" ng-required="prop.required" ng-maxlength="prop.maxLength" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(regionForm[prop.name], 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(regionForm[prop.name], 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(regionForm[prop.name])" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(regionForm.division), 'has-feedback': hasError(regionForm.division)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Division *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="division" name="division" class="form-control" ng-model="region.division" ng-options="division.id as division.name for division in divisions" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(regionForm.division, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(region)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="regionForm.$pristine || regionForm.$invalid" ng-click="save(region)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/region/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/region/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/region/index.js
deleted file mode 100644
index 0032290..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/region/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.region', [])
-    .controller('FormRegionController', require('./FormRegionController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/region/new/FormNewRegionController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/region/new/FormNewRegionController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/region/new/FormNewRegionController.js
deleted file mode 100644
index 8aa7b36..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/region/new/FormNewRegionController.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewRegionController = function(region, $scope, $controller, locationUtils, regionService) {
-
-    // extends the FormRegionController to inherit common methods
-    angular.extend(this, $controller('FormRegionController', { region: region, $scope: $scope }));
-
-    $scope.regionName = 'New';
-
-    $scope.settings = {
-        isNew: true,
-        saveLabel: 'Create'
-    };
-
-    $scope.save = function(region) {
-        regionService.createRegion(region).
-            then(function() {
-                locationUtils.navigateToPath('/admin/regions');
-            });
-    };
-
-};
-
-FormNewRegionController.$inject = ['region', '$scope', '$controller', 'locationUtils', 'regionService'];
-module.exports = FormNewRegionController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/region/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/region/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/region/new/index.js
deleted file mode 100644
index 4155ac7..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/region/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.region.new', [])
-    .controller('FormNewRegionController', require('./FormNewRegionController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/server/FormServerController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/server/FormServerController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/server/FormServerController.js
deleted file mode 100644
index c23b03d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/server/FormServerController.js
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormServerController = function(server, $scope, $location, $state, $uibModal, formUtils, locationUtils, serverService, cacheGroupService, cdnService, physLocationService, profileService, statusService, typeService, messageModel) {
-
-    var getPhysLocations = function() {
-        physLocationService.getPhysLocations()
-            .then(function(result) {
-                $scope.physLocations = result;
-            });
-    };
-
-    var getCacheGroups = function() {
-        cacheGroupService.getCacheGroups()
-            .then(function(result) {
-                $scope.cacheGroups = result;
-            });
-    };
-
-    var getTypes = function() {
-        typeService.getTypes({ useInTable: 'server' })
-            .then(function(result) {
-                $scope.types = result;
-            });
-    };
-
-    var getCDNs = function() {
-        cdnService.getCDNs(true)
-            .then(function(result) {
-                $scope.cdns = result;
-            });
-    };
-
-    var getStatuses = function() {
-        statusService.getStatuses()
-            .then(function(result) {
-                $scope.statuses = result;
-            });
-    };
-
-    var getProfiles = function() {
-        profileService.getProfiles({ orderby: 'name' })
-            .then(function(result) {
-                $scope.profiles = _.filter(result, function(profile) {
-                    return profile.type != 'DS_PROFILE';
-                });
-            });
-    };
-
-    var updateStatus = function(status) {
-        serverService.updateStatus(server.id, { status: status.id, offlineReason: status.offlineReason })
-            .then(
-                function(result) {
-                    messageModel.setMessages(result.data.alerts, false);
-                    refresh();
-                },
-	            function(fault) {
-		            messageModel.setMessages(fault.data.alerts, false);
-	            }
-            );
-    };
-    
-    var refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-
-    // supposedly matches IPv4 and IPv6 formats. but actually need one that matches each. todo.
-    $scope.validations = {
-        ipRegex: new RegExp(/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$|^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3
 }))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/)
-    };
-
-
-    $scope.server = server;
-
-    $scope.falseTrue = [
-        { value: false, label: 'false' },
-        { value: true, label: 'true' }
-    ];
-
-    $scope.queueServerUpdates = function(server) {
-        serverService.queueServerUpdates(server.id)
-            .then(
-                function() {
-                    refresh();
-                }
-            );
-    };
-
-    $scope.clearServerUpdates = function(server) {
-        serverService.clearServerUpdates(server.id)
-            .then(
-                function() {
-                    refresh();
-                }
-            );
-    };
-
-    $scope.confirmStatusUpdate = function() {
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/select/status/dialog.select.status.tpl.html',
-            controller: 'DialogSelectStatusController',
-            size: 'md',
-            resolve: {
-                server: function() {
-                    return server;
-                },
-                statuses: function() {
-                    return $scope.statuses;
-                }
-            }
-        });
-        modalInstance.result.then(function(status) {
-            updateStatus(status);
-        }, function () {
-            // do nothing
-        });
-    };
-
-
-    $scope.viewConfig = function() {
-        alert('not hooked up yet: view config files for server');
-    };
-
-    $scope.viewDeliveryServices = function() {
-        $location.path($location.path() + '/delivery-services');
-    };
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-    var init = function () {
-        getPhysLocations();
-        getCacheGroups();
-        getTypes();
-        getCDNs();
-        getStatuses();
-        getProfiles();
-    };
-    init();
-
-};
-
-FormServerController.$inject = ['server', '$scope', '$location', '$state', '$uibModal', 'formUtils', 'locationUtils', 'serverService', 'cacheGroupService', 'cdnService', 'physLocationService', 'profileService', 'statusService', 'typeService', 'messageModel'];
-module.exports = FormServerController;


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

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

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

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

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/changeLogs/ChangeLogsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/changeLogs/ChangeLogsController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/changeLogs/ChangeLogsController.js
deleted file mode 100644
index b390590..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/changeLogs/ChangeLogsController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ChangeLogsController = function() {
-};
-
-ChangeLogsController.$inject = [];
-module.exports = ChangeLogsController;

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/divisions/DivisionsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/divisions/DivisionsController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/divisions/DivisionsController.js
deleted file mode 100644
index 21b0bea..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/divisions/DivisionsController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var DivisionsController = function() {
-};
-
-DivisionsController.$inject = [];
-module.exports = DivisionsController;

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

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

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/JobsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/JobsController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/JobsController.js
deleted file mode 100644
index 5a08d47..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/jobs/JobsController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var JobsController = function() {
-};
-
-JobsController.$inject = [];
-module.exports = JobsController;

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/parameters/ParametersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/parameters/ParametersController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/parameters/ParametersController.js
deleted file mode 100644
index 746c81c..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/parameters/ParametersController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ParametersController = function() {
-};
-
-ParametersController.$inject = [];
-module.exports = ParametersController;

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

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

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/physLocations/PhysLocationsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/physLocations/PhysLocationsController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/physLocations/PhysLocationsController.js
deleted file mode 100644
index 4879cab..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/physLocations/PhysLocationsController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var PhysLocationsController = function() {
-};
-
-PhysLocationsController.$inject = [];
-module.exports = PhysLocationsController;

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

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/admin/profiles/ProfilesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/admin/profiles/ProfilesController.js b/traffic_ops/experimental/ui/app/src/modules/private/admin/profiles/ProfilesController.js
deleted file mode 100644
index f7e3264..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/admin/profiles/ProfilesController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ProfilesController = function() {
-};
-
-ProfilesController.$inject = [];
-module.exports = ProfilesController;

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

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

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



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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/custom/CustomController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/custom/CustomController.js b/traffic_ops/experimental/ui/app/src/modules/private/custom/CustomController.js
deleted file mode 100644
index 66f0321..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/custom/CustomController.js
+++ /dev/null
@@ -1,42 +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 CustomController = function($scope, $sce, $timeout, $location) {
-
-	var pinIframe = function() {
-		var headerHeight = $('#header').css("height");
-		$('#customFrameWrapper').css("top", headerHeight);
-		$('#customFrameWrapper').css("bottom", 0);
-	};
-
-	$scope.url = decodeURIComponent($location.search().url);
-
-	$scope.trustSrc = function(src) {
-		return $sce.trustAsResourceUrl(src);
-	};
-
-	var init = function () {
-		$timeout(function () {
-			pinIframe();
-		}, 200);
-	};
-	init();
-
-};
-
-CustomController.$inject = ['$scope', '$sce', '$timeout', '$location'];
-module.exports = CustomController;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/custom/_custom.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/custom/_custom.scss b/traffic_ops/experimental/ui/app/src/modules/private/custom/_custom.scss
deleted file mode 100644
index 184957b..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/custom/_custom.scss
+++ /dev/null
@@ -1,36 +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.
-
-*/
-
-#customFrameWrapper {
-  position:absolute;
-  right:0;
-}
-
-body.nav-sm .container.body #customFrameWrapper {
-  left: 70px;
-}
-
-@media(min-width:992px) {
-  body.nav-md .container.body #customFrameWrapper {
-    left: 230px;
-  }
-}
-
-#customFrame {
-  height:100%;
-  width:100%;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/custom/custom.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/custom/custom.tpl.html b/traffic_ops/experimental/ui/app/src/modules/private/custom/custom.tpl.html
deleted file mode 100644
index 85d3bfe..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/custom/custom.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="customFrameWrapper">
-    <iframe id="customFrame" ng-src="{{trustSrc(url)}}" frameborder="0"/>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/custom/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/custom/index.js b/traffic_ops/experimental/ui/app/src/modules/private/custom/index.js
deleted file mode 100644
index a46fbe6..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/custom/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.private.custom', [])
-	.controller('CustomController', require('./CustomController'))
-	.config(function($stateProvider, $urlRouterProvider) {
-		$stateProvider
-			.state('trafficPortal.private.custom', {
-				url: 'custom',
-				views: {
-					privateContent: {
-						templateUrl: 'modules/private/custom/custom.tpl.html',
-						controller: 'CustomController'
-					}
-				}
-			})
-		;
-		$urlRouterProvider.otherwise('/');
-	});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/index.js b/traffic_ops/experimental/ui/app/src/modules/private/index.js
deleted file mode 100644
index 7ba33c3..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/index.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.private', [])
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('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'
-                    },
-                    message: {
-                        templateUrl: 'common/modules/message/message.tpl.html',
-                        controller: 'MessageController'
-                    },
-                    content: {
-                        templateUrl: 'modules/private/private.tpl.html'
-                    }
-                },
-                resolve: {
-                    currentUser: function($state, userService, userModel) {
-                        if (userModel.loaded) {
-                            return userModel.user;
-                        } else {
-                            return userService.getCurrentUser();
-                        }
-                    }
-                }
-            });
-        $urlRouterProvider.otherwise('/');
-    });

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/monitor/_monitor.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/monitor/_monitor.scss b/traffic_ops/experimental/ui/app/src/modules/private/monitor/_monitor.scss
deleted file mode 100644
index d57b9c6..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/monitor/_monitor.scss
+++ /dev/null
@@ -1,16 +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_ops/experimental/ui/app/src/modules/private/monitor/dashboard/DashboardController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/DashboardController.js b/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/DashboardController.js
deleted file mode 100644
index c08a4e6..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/DashboardController.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-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_ops/experimental/ui/app/src/modules/private/monitor/dashboard/_dashboard.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/_dashboard.scss b/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/_dashboard.scss
deleted file mode 100644
index d57b9c6..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/_dashboard.scss
+++ /dev/null
@@ -1,16 +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_ops/experimental/ui/app/src/modules/private/monitor/dashboard/dashboard.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/dashboard.tpl.html b/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/dashboard.tpl.html
deleted file mode 100644
index 3b09283..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/dashboard.tpl.html
+++ /dev/null
@@ -1,85 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div 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_ops/experimental/ui/app/src/modules/private/monitor/dashboard/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/index.js b/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/index.js
deleted file mode 100644
index 6848d17..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/index.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.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_ops/experimental/ui/app/src/modules/private/monitor/dashboard/view/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/view/index.js b/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/view/index.js
deleted file mode 100644
index 52479aa..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/monitor/dashboard/view/index.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.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_ops/experimental/ui/app/src/modules/private/monitor/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/monitor/index.js b/traffic_ops/experimental/ui/app/src/modules/private/monitor/index.js
deleted file mode 100644
index c76b0a4..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/monitor/index.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-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_ops/experimental/ui/app/src/modules/private/monitor/map/MapController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/monitor/map/MapController.js b/traffic_ops/experimental/ui/app/src/modules/private/monitor/map/MapController.js
deleted file mode 100644
index 8258d83..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/monitor/map/MapController.js
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-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_ops/experimental/ui/app/src/modules/private/monitor/map/_map.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/monitor/map/_map.scss b/traffic_ops/experimental/ui/app/src/modules/private/monitor/map/_map.scss
deleted file mode 100644
index 72d3f1b..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/monitor/map/_map.scss
+++ /dev/null
@@ -1,21 +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.
-
-*/
-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_ops/experimental/ui/app/src/modules/private/monitor/map/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/monitor/map/index.js b/traffic_ops/experimental/ui/app/src/modules/private/monitor/map/index.js
deleted file mode 100644
index c4c736d..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/monitor/map/index.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.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_ops/experimental/ui/app/src/modules/private/monitor/map/map.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/monitor/map/map.tpl.html b/traffic_ops/experimental/ui/app/src/modules/private/monitor/map/map.tpl.html
deleted file mode 100644
index 6d16c9c..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/monitor/map/map.tpl.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="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_ops/experimental/ui/app/src/modules/private/monitor/monitor.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/monitor/monitor.tpl.html b/traffic_ops/experimental/ui/app/src/modules/private/monitor/monitor.tpl.html
deleted file mode 100644
index 6b509ab..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/monitor/monitor.tpl.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div id="monitorContainer">
-    <div ui-view="monitorContent"></div>
-</div>

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/user/UserController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/user/UserController.js b/traffic_ops/experimental/ui/app/src/modules/private/user/UserController.js
deleted file mode 100644
index 01439f9..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/user/UserController.js
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var UserController = function($scope, $state, $location, $uibModal, formUtils, locationUtils, userService, authService, roleService, tenantService, userModel) {
-
-    var updateUser = function(user, options) {
-        userService.updateUser(user)
-            .then(function() {
-                if (options.signout) {
-                    authService.logout();
-                }
-            });
-    };
-
-    var getRoles = function() {
-        roleService.getRoles()
-            .then(function(result) {
-                $scope.roles = result;
-            });
-    };
-
-    var getTenants = function() {
-        tenantService.getTenants()
-            .then(function(result) {
-                $scope.tenants = result;
-            });
-    };
-
-    $scope.userName = angular.copy(userModel.user.username);
-
-    $scope.user = userModel.user;
-
-    $scope.confirmSave = function(user, usernameField) {
-        if (usernameField.$dirty) {
-            var params = {
-                title: 'Reauthentication Required',
-                message: 'Changing your username to ' + user.username + ' will require you to reauthenticate. Is that OK?'
-            };
-            var modalInstance = $uibModal.open({
-                templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html',
-                controller: 'DialogConfirmController',
-                size: 'sm',
-                resolve: {
-                    params: function () {
-                        return params;
-                    }
-                }
-            });
-            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;
-
-    var init = function () {
-        getRoles();
-        getTenants();
-    };
-    init();
-
-};
-
-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_ops/experimental/ui/app/src/modules/private/user/_user.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/user/_user.scss b/traffic_ops/experimental/ui/app/src/modules/private/user/_user.scss
deleted file mode 100644
index 279883d..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/user/_user.scss
+++ /dev/null
@@ -1,32 +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.
-
-*/
-/*
-
-
- 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_ops/experimental/ui/app/src/modules/private/user/edit/UserEditController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/user/edit/UserEditController.js b/traffic_ops/experimental/ui/app/src/modules/private/user/edit/UserEditController.js
deleted file mode 100644
index b52613e..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/user/edit/UserEditController.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var UserEditController = function($scope) {
-
-    $scope.settings = {
-        isNew: false,
-        saveLabel: 'Update'
-    };
-
-};
-
-UserEditController.$inject = ['$scope'];
-module.exports = UserEditController;

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/public/login/LoginController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/public/login/LoginController.js b/traffic_ops/experimental/ui/app/src/modules/public/login/LoginController.js
deleted file mode 100644
index f8e1282..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/public/login/LoginController.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var LoginController = function($scope, $log, $uibModal, authService) {
-
-    $scope.credentials = {
-        username: '',
-        password: ''
-    };
-
-    $scope.login = function(credentials) {
-        authService.login(credentials.username, credentials.password);
-    };
-
-    $scope.resetPassword = function() {
-
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/reset/dialog.reset.tpl.html',
-            controller: 'DialogResetController'
-        });
-
-        modalInstance.result.then(function(email) {
-            authService.resetPassword(email);
-        }, function () {
-        });
-    };
-
-    var init = function() {};
-    init();
-};
-
-LoginController.$inject = ['$scope', '$log', '$uibModal', 'authService'];
-module.exports = LoginController;

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/public/login/login.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/public/login/login.tpl.html b/traffic_ops/experimental/ui/app/src/modules/public/login/login.tpl.html
deleted file mode 100644
index a2a1c0f..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/public/login/login.tpl.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<section id="loginContainer">
-    <div class="col-md-12 col-sm-12 col-xs-12">
-        <div class="x_panel">
-            <div class="x_title">
-                <h2>Login</h2>
-                <div class="clearfix"></div>
-            </div>
-            <div class="x_content">
-                <br>
-                <form name="loginForm" role="form" ng-submit="login(credentials)" class="form-horizontal form-label-left" novalidate>
-                    <div class="form-group">
-                        <label class="control-label col-md-3 col-sm-3 col-xs-12" for="username">Username <span class="required">*</span></label>
-                        <div class="col-md-6 col-sm-6 col-xs-12">
-                            <input id="username" name="username" type="text" class="form-control" autocomplete="off" ng-model="credentials.username" autofocus required>
-                        </div>
-                    </div>
-                    <div class="form-group">
-                        <label class="control-label col-md-3 col-sm-3 col-xs-12" for="password">Password <span class="required">*</span></label>
-                        <div class="col-md-6 col-sm-6 col-xs-12">
-                            <input id="password" name="password" type="password" class="form-control" autocomplete="off" ng-model="credentials.password" required>
-                        </div>
-                    </div>
-                    <div class="ln_solid"></div>
-                    <div class="form-group">
-                        <div class="col-md-6 col-sm-6 col-xs-12 col-md-offset-3">
-                            <button type="submit" class="btn btn-primary" ng-disabled="loginForm.$invalid">Log in &nbsp;&nbsp;<i class="fa fa-chevron-circle-right"></i></button>
-                            <button type="button" class="btn btn-link" ng-click="resetPassword()">Reset Password</button>
-                        </div>
-                    </div>
-                </form>
-            </div>
-        </div>
-    </div>
-</section>

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/package.json
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/package.json b/traffic_ops/experimental/ui/app/src/package.json
deleted file mode 100644
index e9a6575..0000000
--- a/traffic_ops/experimental/ui/app/src/package.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
-    "name": "trafficPortal",
-    "version": "2.x",
-    "description": "Traffic Portal",
-    "repository": {
-        "type": "git",
-        "url": "git@github.com:Comcast/traffic_control.git"
-    },
-    "dependencies": {
-        "forever": "0.15.1",
-        "morgan": "1.7.0",
-        "errorhandler": "1.4.3",
-        "connect-modrewrite": "0.8.5",
-        "connect-timeout": "1.7.0",
-        "ssl-root-cas": "1.1.10",
-        "express": "4.13.4",
-        "requirejs": "2.1.22"
-    },
-    "engines": {
-        "node": "0.11.14"
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/robots.txt
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/robots.txt b/traffic_ops/experimental/ui/app/src/robots.txt
deleted file mode 100755
index 1f3cd1a..0000000
--- a/traffic_ops/experimental/ui/app/src/robots.txt
+++ /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.
-#
-# robotstxt.org
-
-User-agent: *

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/scripts/config.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/scripts/config.js b/traffic_ops/experimental/ui/app/src/scripts/config.js
deleted file mode 100644
index 6abbc71..0000000
--- a/traffic_ops/experimental/ui/app/src/scripts/config.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// this is the config the TO UI uses
-
-"use strict";
-
-angular.module('config', [])
-
-.constant('ENV', { api: { root:'/api/1.2/' } })
-
-;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/scripts/shared-libs.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/scripts/shared-libs.js b/traffic_ops/experimental/ui/app/src/scripts/shared-libs.js
deleted file mode 100644
index 06c68f2..0000000
--- a/traffic_ops/experimental/ui/app/src/scripts/shared-libs.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/**
- * Define the required js libraries needed for this application. The compiler will merge them all into a single download. Order is important!
- */
-
-// angular and angular helpers
-require('angular');
-require('angular-animate');
-require('angular-resource');
-require('angular-route');
-require('angular-sanitize');
-require('angular-ui-router');
-
-// angular jwt
-require('angular-jwt');
-
-// angular loading bar
-require('loading-bar');
-
-// angular bootstrap
-require('ui-bootstrap');
-require('ui-bootstrap-tpls');
-
-// restangular
-require('restangular');
-
-// jquery
-require('jquery');
-
-// flot charts
-require('jquery-flot');
-require('jquery-flot-pie');
-require('jquery-flot-stack');
-require('jquery-flot-time');
-require('jquery-flot-tooltip');
-require('jquery-flot-axislabels');
-
-// misc
-require('es5-shim');
-require('json3');

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/styles/loading.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/styles/loading.scss b/traffic_ops/experimental/ui/app/src/styles/loading.scss
deleted file mode 100644
index eef92fe..0000000
--- a/traffic_ops/experimental/ui/app/src/styles/loading.scss
+++ /dev/null
@@ -1,110 +0,0 @@
-/*!
- * angular-loading-bar v0.4.2
- * https://chieffancypants.github.io/angular-loading-bar
- * Copyright (c) 2014 Wes Cruver
- * License: MIT
- */
-
-/* Make clicks pass-through */
-#loading-bar,
-#loading-bar-spinner {
-  pointer-events: none;
-  -webkit-pointer-events: none;
-  -webkit-transition: 350ms linear all;
-  -moz-transition: 350ms linear all;
-  -o-transition: 350ms linear all;
-  transition: 350ms linear all;
-}
-
-#loading-bar.ng-enter,
-#loading-bar.ng-leave.ng-leave-active,
-#loading-bar-spinner.ng-enter,
-#loading-bar-spinner.ng-leave.ng-leave-active {
-  opacity: 0;
-}
-
-#loading-bar.ng-enter.ng-enter-active,
-#loading-bar.ng-leave,
-#loading-bar-spinner.ng-enter.ng-enter-active,
-#loading-bar-spinner.ng-leave {
-  opacity: 1;
-}
-
-#loading-bar .bar {
-  -webkit-transition: width 350ms;
-  -moz-transition: width 350ms;
-  -o-transition: width 350ms;
-  transition: width 350ms;
-
-  background: #29d;
-  position: fixed;
-  z-index: 2000;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 2px;
-  border-bottom-right-radius: 1px;
-  border-top-right-radius: 1px;
-}
-
-/* Fancy blur effect */
-#loading-bar .peg {
-  position: absolute;
-  width: 70px;
-  right: 0;
-  top: 0;
-  height: 2px;
-  opacity: .45;
-  -moz-box-shadow: #29d 1px 0 6px 1px;
-  -ms-box-shadow: #29d 1px 0 6px 1px;
-  -webkit-box-shadow: #29d 1px 0 6px 1px;
-  box-shadow: #29d 1px 0 6px 1px;
-  -moz-border-radius: 100%;
-  -webkit-border-radius: 100%;
-  border-radius: 100%;
-}
-
-#loading-bar-spinner {
-  display: none;
-  position: fixed;
-  z-index: 2000;
-  top: 10px;
-  left: 10px;
-}
-
-#loading-bar-spinner .spinner-icon {
-  width: 14px;
-  height: 14px;
-
-  border:  solid 2px transparent;
-  border-top-color:  #29d;
-  border-left-color: #29d;
-  border-radius: 10px;
-
-  -webkit-animation: loading-bar-spinner 400ms linear infinite;
-  -moz-animation:    loading-bar-spinner 400ms linear infinite;
-  -ms-animation:     loading-bar-spinner 400ms linear infinite;
-  -o-animation:      loading-bar-spinner 400ms linear infinite;
-  animation:         loading-bar-spinner 400ms linear infinite;
-}
-
-@-webkit-keyframes loading-bar-spinner {
-  0%   { -webkit-transform: rotate(0deg);   transform: rotate(0deg); }
-  100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); }
-}
-@-moz-keyframes loading-bar-spinner {
-  0%   { -moz-transform: rotate(0deg);   transform: rotate(0deg); }
-  100% { -moz-transform: rotate(360deg); transform: rotate(360deg); }
-}
-@-o-keyframes loading-bar-spinner {
-  0%   { -o-transform: rotate(0deg);   transform: rotate(0deg); }
-  100% { -o-transform: rotate(360deg); transform: rotate(360deg); }
-}
-@-ms-keyframes loading-bar-spinner {
-  0%   { -ms-transform: rotate(0deg);   transform: rotate(0deg); }
-  100% { -ms-transform: rotate(360deg); transform: rotate(360deg); }
-}
-@keyframes loading-bar-spinner {
-  0%   { transform: rotate(0deg);   transform: rotate(0deg); }
-  100% { transform: rotate(360deg); transform: rotate(360deg); }
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/styles/main.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/styles/main.scss b/traffic_ops/experimental/ui/app/src/styles/main.scss
deleted file mode 100755
index 752f7bd..0000000
--- a/traffic_ops/experimental/ui/app/src/styles/main.scss
+++ /dev/null
@@ -1,154 +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.
-
-*/
-@charset "utf-8";
-
-$fa-font-path: "../assets/fonts";
-
-@import url(//fonts.googleapis.com/css?family=Lato:300,400,700,900,400italic);
-
-@import "variables";
-@import "bootstrap-sass-official/assets/stylesheets/bootstrap";
-@import "font-awesome/scss/font-awesome";
-
-// common
-@import "../common/modules/dialog/confirm/dialog.confirm";
-@import "../common/modules/dialog/reset/dialog.reset";
-@import "../common/modules/form/user/form.user";
-@import "../common/modules/header/header";
-@import "../common/modules/message/message";
-@import "../common/modules/navigation/navigation";
-@import "../common/modules/table/table";
-@import "../common/modules/release/release";
-@import "../common/modules/widget/capacity/widget.capacity";
-@import "../common/modules/widget/cacheGroups/widget.cacheGroups";
-@import "../common/modules/widget/cdnChart/widget.cdnChart";
-@import "../common/modules/widget/routing/widget.routing";
-
-// public
-@import "../modules/public/login/login";
-
-// private
-
-// user
-@import "../modules/private/user/user";
-
-// admin
-@import "../modules/private/admin/admin";
-@import "../modules/private/admin/cdns/config/config";
-@import "../modules/private/admin/regions/regions";
-@import "../modules/private/admin/tenants/tenants";
-@import "../modules/private/admin/users/users";
-
-// configure
-@import "../modules/private/configure/configure";
-@import "../modules/private/configure/cacheGroups/cacheGroups";
-@import "../modules/private/configure/deliveryServices/deliveryServices";
-@import "../modules/private/configure/servers/servers";
-
-// custom
-@import "../modules/private/custom/custom";
-
-// monitor
-@import "../modules/private/monitor/monitor";
-
-// dashboard
-@import "../modules/private/monitor/dashboard/dashboard";
-
-// map
-@import "../modules/private/monitor/map/map";
-
-[ng-click] {
-  cursor: pointer;
-}
-
-html {
-  position: relative;
-  min-height: 100%;
-}
-
-body {
-  color: #73879C;
-  background: #F7F7F7;
-  font-family: 'Lato', sans-serif;
-  font-size: 13px;
-}
-
-body .container.body .main-content {
-  background: #F7F7F7;
-}
-
-body.nav-md .container.body .main-content {
-  padding: 10px 20px 0;
-}
-
-body.nav-sm .container.body .main-content {
-  padding: 10px 20px;
-  margin-left: 70px;
-  z-index: 2;
-}
-
-.container {
-  width: 100%;
-  padding: 0
-}
-
-.column-title {
-  a {
-    color: white;
-  }
-}
-
-.dropdown-menu-right {
-  left: auto !important; // Reset the default from `.dropdown-menu`
-  right: 0 !important;
-}
-
-.input-error {
-  color: #a94442;
-  font-weight: bold;
-}
-
-.x_title {
-  border-bottom: 2px solid #E6E9ED;
-  padding: 1px 5px 6px;
-  margin-bottom: 10px;
-
-  .breadcrumb {
-    padding: 8px 15px 4px 0;
-    margin-bottom: 0;
-    list-style: none;
-    background-color: white;
-    border-radius: 0;
-    font-size: 24px;
-  }
-
-  button {
-    margin: 8px 6px 4px 0;
-  }
-
-  .btn-group {
-    margin-top: -4px;
-  }
-
-}
-
-@media(min-width:992px) {
-  body.nav-md .container.body .main-content {
-    margin-left: 230px;
-  }
-}
-


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/css/jquery.dataTables.min.css
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/css/jquery.dataTables.min.css b/traffic_portal/app/src/assets/css/jquery.dataTables.min.css
new file mode 100644
index 0000000..4f10100
--- /dev/null
+++ b/traffic_portal/app/src/assets/css/jquery.dataTables.min.css
@@ -0,0 +1 @@
+table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc{cursor:pointer;*cursor:hand}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.data
 Table thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:white}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #dddddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #dddddd;border-right:1px solid #dddddd}table.dataTable.cell-border tbod
 y tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #dddddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#abb9d3}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:whitesmoke}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#a9b7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#f9f9f9}table.dataTable.order-column tbody
  tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad4}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b3cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sort
 ing_2{background-color:#a7b5ce}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b6d0}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#f9f9f9}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fbfbfb}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fdfdfd}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad4}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#adbbd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.e
 ven.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ebebeb}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#eeeeee}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a1aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a2afc8}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a4b2cb}table.dataTable.no-footer{border-bottom:1px solid #111111}table.dataTable.nowr
 ap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,
 table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tb
 ody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,
 .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111111;background-c
 olor:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wra
 pper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,2
 55,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .
 dataTables_scrollBody{border-bottom:1px solid #111111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/fonts/FontAwesome.otf
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/fonts/FontAwesome.otf b/traffic_portal/app/src/assets/fonts/FontAwesome.otf
new file mode 100644
index 0000000..3ed7f8b
Binary files /dev/null and b/traffic_portal/app/src/assets/fonts/FontAwesome.otf differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/fonts/fontawesome-webfont.eot
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/fonts/fontawesome-webfont.eot b/traffic_portal/app/src/assets/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..9b6afae
Binary files /dev/null and b/traffic_portal/app/src/assets/fonts/fontawesome-webfont.eot differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/fonts/fontawesome-webfont.ttf
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/fonts/fontawesome-webfont.ttf b/traffic_portal/app/src/assets/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..26dea79
Binary files /dev/null and b/traffic_portal/app/src/assets/fonts/fontawesome-webfont.ttf differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/fonts/fontawesome-webfont.woff
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/fonts/fontawesome-webfont.woff b/traffic_portal/app/src/assets/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..dc35ce3
Binary files /dev/null and b/traffic_portal/app/src/assets/fonts/fontawesome-webfont.woff differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/fonts/fontawesome-webfont.woff2
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/fonts/fontawesome-webfont.woff2 b/traffic_portal/app/src/assets/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000..500e517
Binary files /dev/null and b/traffic_portal/app/src/assets/fonts/fontawesome-webfont.woff2 differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/images/favicon.png
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/images/favicon.png b/traffic_portal/app/src/assets/images/favicon.png
old mode 100755
new mode 100644
index da095e9..83df44e
Binary files a/traffic_portal/app/src/assets/images/favicon.png and b/traffic_portal/app/src/assets/images/favicon.png differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/images/sort_asc.png
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/images/sort_asc.png b/traffic_portal/app/src/assets/images/sort_asc.png
new file mode 100644
index 0000000..e1ba61a
Binary files /dev/null and b/traffic_portal/app/src/assets/images/sort_asc.png differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/images/sort_asc_disabled.png
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/images/sort_asc_disabled.png b/traffic_portal/app/src/assets/images/sort_asc_disabled.png
new file mode 100644
index 0000000..fb11dfe
Binary files /dev/null and b/traffic_portal/app/src/assets/images/sort_asc_disabled.png differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/images/sort_both.png
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/images/sort_both.png b/traffic_portal/app/src/assets/images/sort_both.png
new file mode 100644
index 0000000..af5bc7c
Binary files /dev/null and b/traffic_portal/app/src/assets/images/sort_both.png differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/images/sort_desc.png
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/images/sort_desc.png b/traffic_portal/app/src/assets/images/sort_desc.png
new file mode 100644
index 0000000..0e156de
Binary files /dev/null and b/traffic_portal/app/src/assets/images/sort_desc.png differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/images/sort_desc_disabled.png
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/images/sort_desc_disabled.png b/traffic_portal/app/src/assets/images/sort_desc_disabled.png
new file mode 100644
index 0000000..c9fdd8a
Binary files /dev/null and b/traffic_portal/app/src/assets/images/sort_desc_disabled.png differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/js/.keep
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/js/.keep b/traffic_portal/app/src/assets/js/.keep
deleted file mode 100644
index e69de29..0000000


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/js/dataTables.tableTools.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/js/dataTables.tableTools.js b/traffic_portal/app/src/assets/js/dataTables.tableTools.js
new file mode 100755
index 0000000..f5c361d
--- /dev/null
+++ b/traffic_portal/app/src/assets/js/dataTables.tableTools.js
@@ -0,0 +1,3084 @@
+/*! TableTools 2.2.1
+ * 2009-2014 SpryMedia Ltd - datatables.net/license
+ *
+ * ZeroClipboard 1.0.4
+ * Author: Joseph Huckaby - MIT licensed
+ */
+
+/**
+ * @summary     TableTools
+ * @description Tools and buttons for DataTables
+ * @version     2.2.1
+ * @file        dataTables.tableTools.js
+ * @author      SpryMedia Ltd (www.sprymedia.co.uk)
+ * @contact     www.sprymedia.co.uk/contact
+ * @copyright   Copyright 2009-2014 SpryMedia Ltd.
+ *
+ * This source file is free software, available under the following license:
+ *   MIT license - http://datatables.net/license/mit
+ *
+ * This source file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
+ *
+ * For details please refer to: http://www.datatables.net
+ */
+
+
+/* Global scope for TableTools for backwards compatibility.
+ * Will be removed in 2.3
+ */
+var TableTools;
+
+(function(window, document, undefined) {
+
+
+var factory = function( $, DataTable ) {
+"use strict";
+
+
+//include ZeroClipboard.js
+/* ZeroClipboard 1.0.4
+ * Author: Joseph Huckaby
+ */
+
+var ZeroClipboard_TableTools = {
+
+	version: "1.0.4-TableTools2",
+	clients: {}, // registered upload clients on page, indexed by id
+	moviePath: '', // URL to movie
+	nextId: 1, // ID of next movie
+
+	$: function(thingy) {
+		// simple DOM lookup utility function
+		if (typeof(thingy) == 'string') {
+			thingy = document.getElementById(thingy);
+		}
+		if (!thingy.addClass) {
+			// extend element with a few useful methods
+			thingy.hide = function() { this.style.display = 'none'; };
+			thingy.show = function() { this.style.display = ''; };
+			thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
+			thingy.removeClass = function(name) {
+				this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, '');
+			};
+			thingy.hasClass = function(name) {
+				return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
+			};
+		}
+		return thingy;
+	},
+
+	setMoviePath: function(path) {
+		// set path to ZeroClipboard.swf
+		this.moviePath = path;
+	},
+
+	dispatch: function(id, eventName, args) {
+		// receive event from flash movie, send to client
+		var client = this.clients[id];
+		if (client) {
+			client.receiveEvent(eventName, args);
+		}
+	},
+
+	register: function(id, client) {
+		// register new client to receive events
+		this.clients[id] = client;
+	},
+
+	getDOMObjectPosition: function(obj) {
+		// get absolute coordinates for dom element
+		var info = {
+			left: 0,
+			top: 0,
+			width: obj.width ? obj.width : obj.offsetWidth,
+			height: obj.height ? obj.height : obj.offsetHeight
+		};
+
+		if ( obj.style.width !== "" ) {
+			info.width = obj.style.width.replace("px","");
+		}
+
+		if ( obj.style.height !== "" ) {
+			info.height = obj.style.height.replace("px","");
+		}
+
+		while (obj) {
+			info.left += obj.offsetLeft;
+			info.top += obj.offsetTop;
+			obj = obj.offsetParent;
+		}
+
+		return info;
+	},
+
+	Client: function(elem) {
+		// constructor for new simple upload client
+		this.handlers = {};
+
+		// unique ID
+		this.id = ZeroClipboard_TableTools.nextId++;
+		this.movieId = 'ZeroClipboard_TableToolsMovie_' + this.id;
+
+		// register client with singleton to receive flash events
+		ZeroClipboard_TableTools.register(this.id, this);
+
+		// create movie
+		if (elem) {
+			this.glue(elem);
+		}
+	}
+};
+
+ZeroClipboard_TableTools.Client.prototype = {
+
+	id: 0, // unique ID for us
+	ready: false, // whether movie is ready to receive events or not
+	movie: null, // reference to movie object
+	clipText: '', // text to copy to clipboard
+	fileName: '', // default file save name
+	action: 'copy', // action to perform
+	handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor
+	cssEffects: true, // enable CSS mouse effects on dom container
+	handlers: null, // user event handlers
+	sized: false,
+
+	glue: function(elem, title) {
+		// glue to DOM element
+		// elem can be ID or actual DOM element object
+		this.domElement = ZeroClipboard_TableTools.$(elem);
+
+		// float just above object, or zIndex 99 if dom element isn't set
+		var zIndex = 99;
+		if (this.domElement.style.zIndex) {
+			zIndex = parseInt(this.domElement.style.zIndex, 10) + 1;
+		}
+
+		// find X/Y position of domElement
+		var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
+
+		// create floating DIV above element
+		this.div = document.createElement('div');
+		var style = this.div.style;
+		style.position = 'absolute';
+		style.left = '0px';
+		style.top = '0px';
+		style.width = (box.width) + 'px';
+		style.height = box.height + 'px';
+		style.zIndex = zIndex;
+
+		if ( typeof title != "undefined" && title !== "" ) {
+			this.div.title = title;
+		}
+		if ( box.width !== 0 && box.height !== 0 ) {
+			this.sized = true;
+		}
+
+		// style.backgroundColor = '#f00'; // debug
+		if ( this.domElement ) {
+			this.domElement.appendChild(this.div);
+			this.div.innerHTML = this.getHTML( box.width, box.height ).replace(/&/g, '&amp;');
+		}
+	},
+
+	positionElement: function() {
+		var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
+		var style = this.div.style;
+
+		style.position = 'absolute';
+		//style.left = (this.domElement.offsetLeft)+'px';
+		//style.top = this.domElement.offsetTop+'px';
+		style.width = box.width + 'px';
+		style.height = box.height + 'px';
+
+		if ( box.width !== 0 && box.height !== 0 ) {
+			this.sized = true;
+		} else {
+			return;
+		}
+
+		var flash = this.div.childNodes[0];
+		flash.width = box.width;
+		flash.height = box.height;
+	},
+
+	getHTML: function(width, height) {
+		// return HTML for movie
+		var html = '';
+		var flashvars = 'id=' + this.id +
+			'&width=' + width +
+			'&height=' + height;
+
+		if (navigator.userAgent.match(/MSIE/)) {
+			// IE gets an OBJECT tag
+			var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
+			html += '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard_TableTools.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>';
+		}
+		else {
+			// all other browsers get an EMBED tag
+			html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard_TableTools.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />';
+		}
+		return html;
+	},
+
+	hide: function() {
+		// temporarily hide floater offscreen
+		if (this.div) {
+			this.div.style.left = '-2000px';
+		}
+	},
+
+	show: function() {
+		// show ourselves after a call to hide()
+		this.reposition();
+	},
+
+	destroy: function() {
+		// destroy control and floater
+		if (this.domElement && this.div) {
+			this.hide();
+			this.div.innerHTML = '';
+
+			var body = document.getElementsByTagName('body')[0];
+			try { body.removeChild( this.div ); } catch(e) {}
+
+			this.domElement = null;
+			this.div = null;
+		}
+	},
+
+	reposition: function(elem) {
+		// reposition our floating div, optionally to new container
+		// warning: container CANNOT change size, only position
+		if (elem) {
+			this.domElement = ZeroClipboard_TableTools.$(elem);
+			if (!this.domElement) {
+				this.hide();
+			}
+		}
+
+		if (this.domElement && this.div) {
+			var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
+			var style = this.div.style;
+			style.left = '' + box.left + 'px';
+			style.top = '' + box.top + 'px';
+		}
+	},
+
+	clearText: function() {
+		// clear the text to be copy / saved
+		this.clipText = '';
+		if (this.ready) {
+			this.movie.clearText();
+		}
+	},
+
+	appendText: function(newText) {
+		// append text to that which is to be copied / saved
+		this.clipText += newText;
+		if (this.ready) { this.movie.appendText(newText) ;}
+	},
+
+	setText: function(newText) {
+		// set text to be copied to be copied / saved
+		this.clipText = newText;
+		if (this.ready) { this.movie.setText(newText) ;}
+	},
+
+	setCharSet: function(charSet) {
+		// set the character set (UTF16LE or UTF8)
+		this.charSet = charSet;
+		if (this.ready) { this.movie.setCharSet(charSet) ;}
+	},
+
+	setBomInc: function(bomInc) {
+		// set if the BOM should be included or not
+		this.incBom = bomInc;
+		if (this.ready) { this.movie.setBomInc(bomInc) ;}
+	},
+
+	setFileName: function(newText) {
+		// set the file name
+		this.fileName = newText;
+		if (this.ready) {
+			this.movie.setFileName(newText);
+		}
+	},
+
+	setAction: function(newText) {
+		// set action (save or copy)
+		this.action = newText;
+		if (this.ready) {
+			this.movie.setAction(newText);
+		}
+	},
+
+	addEventListener: function(eventName, func) {
+		// add user event listener for event
+		// event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
+		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
+		if (!this.handlers[eventName]) {
+			this.handlers[eventName] = [];
+		}
+		this.handlers[eventName].push(func);
+	},
+
+	setHandCursor: function(enabled) {
+		// enable hand cursor (true), or default arrow cursor (false)
+		this.handCursorEnabled = enabled;
+		if (this.ready) {
+			this.movie.setHandCursor(enabled);
+		}
+	},
+
+	setCSSEffects: function(enabled) {
+		// enable or disable CSS effects on DOM container
+		this.cssEffects = !!enabled;
+	},
+
+	receiveEvent: function(eventName, args) {
+		var self;
+
+		// receive event from flash
+		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
+
+		// special behavior for certain events
+		switch (eventName) {
+			case 'load':
+				// movie claims it is ready, but in IE this isn't always the case...
+				// bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
+				this.movie = document.getElementById(this.movieId);
+				if (!this.movie) {
+					self = this;
+					setTimeout( function() { self.receiveEvent('load', null); }, 1 );
+					return;
+				}
+
+				// firefox on pc needs a "kick" in order to set these in certain cases
+				if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
+					self = this;
+					setTimeout( function() { self.receiveEvent('load', null); }, 100 );
+					this.ready = true;
+					return;
+				}
+
+				this.ready = true;
+				this.movie.clearText();
+				this.movie.appendText( this.clipText );
+				this.movie.setFileName( this.fileName );
+				this.movie.setAction( this.action );
+				this.movie.setCharSet( this.charSet );
+				this.movie.setBomInc( this.incBom );
+				this.movie.setHandCursor( this.handCursorEnabled );
+				break;
+
+			case 'mouseover':
+				if (this.domElement && this.cssEffects) {
+					//this.domElement.addClass('hover');
+					if (this.recoverActive) {
+						this.domElement.addClass('active');
+					}
+				}
+				break;
+
+			case 'mouseout':
+				if (this.domElement && this.cssEffects) {
+					this.recoverActive = false;
+					if (this.domElement.hasClass('active')) {
+						this.domElement.removeClass('active');
+						this.recoverActive = true;
+					}
+					//this.domElement.removeClass('hover');
+				}
+				break;
+
+			case 'mousedown':
+				if (this.domElement && this.cssEffects) {
+					this.domElement.addClass('active');
+				}
+				break;
+
+			case 'mouseup':
+				if (this.domElement && this.cssEffects) {
+					this.domElement.removeClass('active');
+					this.recoverActive = false;
+				}
+				break;
+		} // switch eventName
+
+		if (this.handlers[eventName]) {
+			for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
+				var func = this.handlers[eventName][idx];
+
+				if (typeof(func) == 'function') {
+					// actual function reference
+					func(this, args);
+				}
+				else if ((typeof(func) == 'object') && (func.length == 2)) {
+					// PHP style object + method, i.e. [myObject, 'myMethod']
+					func[0][ func[1] ](this, args);
+				}
+				else if (typeof(func) == 'string') {
+					// name of function
+					window[func](this, args);
+				}
+			} // foreach event handler defined
+		} // user defined handler for event
+	}
+
+};
+
+// For the Flash binding to work, ZeroClipboard_TableTools must be on the global
+// object list
+window.ZeroClipboard_TableTools = ZeroClipboard_TableTools;
+//include TableTools.js
+/* TableTools
+ * 2009-2014 SpryMedia Ltd - datatables.net/license
+ */
+
+/*globals TableTools,ZeroClipboard_TableTools*/
+
+
+(function($, window, document) {
+
+/** 
+ * TableTools provides flexible buttons and other tools for a DataTables enhanced table
+ * @class TableTools
+ * @constructor
+ * @param {Object} oDT DataTables instance. When using DataTables 1.10 this can
+ *   also be a jQuery collection, jQuery selector, table node, DataTables API
+ *   instance or DataTables settings object.
+ * @param {Object} oOpts TableTools options
+ * @param {String} oOpts.sSwfPath ZeroClipboard SWF path
+ * @param {String} oOpts.sRowSelect Row selection options - 'none', 'single', 'multi' or 'os'
+ * @param {Function} oOpts.fnPreRowSelect Callback function just prior to row selection
+ * @param {Function} oOpts.fnRowSelected Callback function just after row selection
+ * @param {Function} oOpts.fnRowDeselected Callback function when row is deselected
+ * @param {Array} oOpts.aButtons List of buttons to be used
+ */
+TableTools = function( oDT, oOpts )
+{
+	/* Santiy check that we are a new instance */
+	if ( ! this instanceof TableTools )
+	{
+		alert( "Warning: TableTools must be initialised with the keyword 'new'" );
+	}
+
+	// In 1.10 we can use the API to get the settings object from a number of
+	// sources
+	var dtSettings = $.fn.dataTable.Api ?
+		new $.fn.dataTable.Api( oDT ).settings()[0] :
+		oDT.fnSettings();
+
+
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Public class variables
+	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+	/**
+	 * @namespace Settings object which contains customisable information for TableTools instance
+	 */
+	this.s = {
+		/**
+		 * Store 'this' so the instance can be retrieved from the settings object
+		 * @property that
+		 * @type	 object
+		 * @default  this
+		 */
+		"that": this,
+
+		/** 
+		 * DataTables settings objects
+		 * @property dt
+		 * @type	 object
+		 * @default  <i>From the oDT init option</i>
+		 */
+		"dt": dtSettings,
+
+		/**
+		 * @namespace Print specific information
+		 */
+		"print": {
+			/** 
+			 * DataTables draw 'start' point before the printing display was shown
+			 *  @property saveStart
+			 *  @type	 int
+			 *  @default  -1
+			 */
+			"saveStart": -1,
+
+			/** 
+			 * DataTables draw 'length' point before the printing display was shown
+			 *  @property saveLength
+			 *  @type	 int
+			 *  @default  -1
+			 */
+			"saveLength": -1,
+
+			/** 
+			 * Page scrolling point before the printing display was shown so it can be restored
+			 *  @property saveScroll
+			 *  @type	 int
+			 *  @default  -1
+			 */
+			"saveScroll": -1,
+
+			/** 
+			 * Wrapped function to end the print display (to maintain scope)
+			 *  @property funcEnd
+			 *  @type	 Function
+			 *  @default  function () {}
+			 */
+			"funcEnd": function () {}
+		},
+
+		/**
+		 * A unique ID is assigned to each button in each instance
+		 * @property buttonCounter
+		 *  @type	 int
+		 * @default  0
+		 */
+		"buttonCounter": 0,
+
+		/**
+		 * @namespace Select rows specific information
+		 */
+		"select": {
+			/**
+			 * Select type - can be 'none', 'single' or 'multi'
+			 * @property type
+			 *  @type	 string
+			 * @default  ""
+			 */
+			"type": "",
+
+			/**
+			 * Array of nodes which are currently selected
+			 *  @property selected
+			 *  @type	 array
+			 *  @default  []
+			 */
+			"selected": [],
+
+			/**
+			 * Function to run before the selection can take place. Will cancel the select if the
+			 * function returns false
+			 *  @property preRowSelect
+			 *  @type	 Function
+			 *  @default  null
+			 */
+			"preRowSelect": null,
+
+			/**
+			 * Function to run when a row is selected
+			 *  @property postSelected
+			 *  @type	 Function
+			 *  @default  null
+			 */
+			"postSelected": null,
+
+			/**
+			 * Function to run when a row is deselected
+			 *  @property postDeselected
+			 *  @type	 Function
+			 *  @default  null
+			 */
+			"postDeselected": null,
+
+			/**
+			 * Indicate if all rows are selected (needed for server-side processing)
+			 *  @property all
+			 *  @type	 boolean
+			 *  @default  false
+			 */
+			"all": false,
+
+			/**
+			 * Class name to add to selected TR nodes
+			 *  @property selectedClass
+			 *  @type	 String
+			 *  @default  ""
+			 */
+			"selectedClass": ""
+		},
+
+		/**
+		 * Store of the user input customisation object
+		 *  @property custom
+		 *  @type	 object
+		 *  @default  {}
+		 */
+		"custom": {},
+
+		/**
+		 * SWF movie path
+		 *  @property swfPath
+		 *  @type	 string
+		 *  @default  ""
+		 */
+		"swfPath": "",
+
+		/**
+		 * Default button set
+		 *  @property buttonSet
+		 *  @type	 array
+		 *  @default  []
+		 */
+		"buttonSet": [],
+
+		/**
+		 * When there is more than one TableTools instance for a DataTable, there must be a 
+		 * master which controls events (row selection etc)
+		 *  @property master
+		 *  @type	 boolean
+		 *  @default  false
+		 */
+		"master": false,
+
+		/**
+		 * Tag names that are used for creating collections and buttons
+		 *  @namesapce
+		 */
+		"tags": {}
+	};
+
+
+	/**
+	 * @namespace Common and useful DOM elements for the class instance
+	 */
+	this.dom = {
+		/**
+		 * DIV element that is create and all TableTools buttons (and their children) put into
+		 *  @property container
+		 *  @type	 node
+		 *  @default  null
+		 */
+		"container": null,
+
+		/**
+		 * The table node to which TableTools will be applied
+		 *  @property table
+		 *  @type	 node
+		 *  @default  null
+		 */
+		"table": null,
+
+		/**
+		 * @namespace Nodes used for the print display
+		 */
+		"print": {
+			/**
+			 * Nodes which have been removed from the display by setting them to display none
+			 *  @property hidden
+			 *  @type	 array
+			 *  @default  []
+			 */
+			"hidden": [],
+
+			/**
+			 * The information display saying telling the user about the print display
+			 *  @property message
+			 *  @type	 node
+			 *  @default  null
+			 */
+			"message": null
+	  },
+
+		/**
+		 * @namespace Nodes used for a collection display. This contains the currently used collection
+		 */
+		"collection": {
+			/**
+			 * The div wrapper containing the buttons in the collection (i.e. the menu)
+			 *  @property collection
+			 *  @type	 node
+			 *  @default  null
+			 */
+			"collection": null,
+
+			/**
+			 * Background display to provide focus and capture events
+			 *  @property background
+			 *  @type	 node
+			 *  @default  null
+			 */
+			"background": null
+		}
+	};
+
+	/**
+	 * @namespace Name space for the classes that this TableTools instance will use
+	 * @extends TableTools.classes
+	 */
+	this.classes = $.extend( true, {}, TableTools.classes );
+	if ( this.s.dt.bJUI )
+	{
+		$.extend( true, this.classes, TableTools.classes_themeroller );
+	}
+
+
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Public class methods
+	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+	/**
+	 * Retreieve the settings object from an instance
+	 *  @method fnSettings
+	 *  @returns {object} TableTools settings object
+	 */
+	this.fnSettings = function () {
+		return this.s;
+	};
+
+
+	/* Constructor logic */
+	if ( typeof oOpts == 'undefined' )
+	{
+		oOpts = {};
+	}
+
+	this._fnConstruct( oOpts );
+
+	return this;
+};
+
+
+
+TableTools.prototype = {
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Public methods
+	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+	/**
+	 * Retreieve the settings object from an instance
+	 *  @returns {array} List of TR nodes which are currently selected
+	 *  @param {boolean} [filtered=false] Get only selected rows which are  
+	 *    available given the filtering applied to the table. By default
+	 *    this is false -  i.e. all rows, regardless of filtering are 
+	      selected.
+	 */
+	"fnGetSelected": function ( filtered )
+	{
+		var
+			out = [],
+			data = this.s.dt.aoData,
+			displayed = this.s.dt.aiDisplay,
+			i, iLen;
+
+		if ( filtered )
+		{
+			// Only consider filtered rows
+			for ( i=0, iLen=displayed.length ; i<iLen ; i++ )
+			{
+				if ( data[ displayed[i] ]._DTTT_selected )
+				{
+					out.push( data[ displayed[i] ].nTr );
+				}
+			}
+		}
+		else
+		{
+			// Use all rows
+			for ( i=0, iLen=data.length ; i<iLen ; i++ )
+			{
+				if ( data[i]._DTTT_selected )
+				{
+					out.push( data[i].nTr );
+				}
+			}
+		}
+
+		return out;
+	},
+
+
+	/**
+	 * Get the data source objects/arrays from DataTables for the selected rows (same as
+	 * fnGetSelected followed by fnGetData on each row from the table)
+	 *  @returns {array} Data from the TR nodes which are currently selected
+	 */
+	"fnGetSelectedData": function ()
+	{
+		var out = [];
+		var data=this.s.dt.aoData;
+		var i, iLen;
+
+		for ( i=0, iLen=data.length ; i<iLen ; i++ )
+		{
+			if ( data[i]._DTTT_selected )
+			{
+				out.push( this.s.dt.oInstance.fnGetData(i) );
+			}
+		}
+
+		return out;
+	},
+
+
+	/**
+	 * Check to see if a current row is selected or not
+	 *  @param {Node} n TR node to check if it is currently selected or not
+	 *  @returns {Boolean} true if select, false otherwise
+	 */
+	"fnIsSelected": function ( n )
+	{
+		var pos = this.s.dt.oInstance.fnGetPosition( n );
+		return (this.s.dt.aoData[pos]._DTTT_selected===true) ? true : false;
+	},
+
+
+	/**
+	 * Select all rows in the table
+	 *  @param {boolean} [filtered=false] Select only rows which are available 
+	 *    given the filtering applied to the table. By default this is false - 
+	 *    i.e. all rows, regardless of filtering are selected.
+	 */
+	"fnSelectAll": function ( filtered )
+	{
+		var s = this._fnGetMasterSettings();
+
+		this._fnRowSelect( (filtered === true) ?
+			s.dt.aiDisplay :
+			s.dt.aoData
+		);
+	},
+
+
+	/**
+	 * Deselect all rows in the table
+	 *  @param {boolean} [filtered=false] Deselect only rows which are available 
+	 *    given the filtering applied to the table. By default this is false - 
+	 *    i.e. all rows, regardless of filtering are deselected.
+	 */
+	"fnSelectNone": function ( filtered )
+	{
+		var s = this._fnGetMasterSettings();
+
+		this._fnRowDeselect( this.fnGetSelected(filtered) );
+	},
+
+
+	/**
+	 * Select row(s)
+	 *  @param {node|object|array} n The row(s) to select. Can be a single DOM
+	 *    TR node, an array of TR nodes or a jQuery object.
+	 */
+	"fnSelect": function ( n )
+	{
+		if ( this.s.select.type == "single" )
+		{
+			this.fnSelectNone();
+			this._fnRowSelect( n );
+		}
+		else
+		{
+			this._fnRowSelect( n );
+		}
+	},
+
+
+	/**
+	 * Deselect row(s)
+	 *  @param {node|object|array} n The row(s) to deselect. Can be a single DOM
+	 *    TR node, an array of TR nodes or a jQuery object.
+	 */
+	"fnDeselect": function ( n )
+	{
+		this._fnRowDeselect( n );
+	},
+
+
+	/**
+	 * Get the title of the document - useful for file names. The title is retrieved from either
+	 * the configuration object's 'title' parameter, or the HTML document title
+	 *  @param   {Object} oConfig Button configuration object
+	 *  @returns {String} Button title
+	 */
+	"fnGetTitle": function( oConfig )
+	{
+		var sTitle = "";
+		if ( typeof oConfig.sTitle != 'undefined' && oConfig.sTitle !== "" ) {
+			sTitle = oConfig.sTitle;
+		} else {
+			var anTitle = document.getElementsByTagName('title');
+			if ( anTitle.length > 0 )
+			{
+				sTitle = anTitle[0].innerHTML;
+			}
+		}
+
+		/* Strip characters which the OS will object to - checking for UTF8 support in the scripting
+		 * engine
+		 */
+		if ( "\u00A1".toString().length < 4 ) {
+			return sTitle.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g, "");
+		} else {
+			return sTitle.replace(/[^a-zA-Z0-9_\.,\-_ !\(\)]/g, "");
+		}
+	},
+
+
+	/**
+	 * Calculate a unity array with the column width by proportion for a set of columns to be
+	 * included for a button. This is particularly useful for PDF creation, where we can use the
+	 * column widths calculated by the browser to size the columns in the PDF.
+	 *  @param   {Object} oConfig Button configuration object
+	 *  @returns {Array} Unity array of column ratios
+	 */
+	"fnCalcColRatios": function ( oConfig )
+	{
+		var
+			aoCols = this.s.dt.aoColumns,
+			aColumnsInc = this._fnColumnTargets( oConfig.mColumns ),
+			aColWidths = [],
+			iWidth = 0, iTotal = 0, i, iLen;
+
+		for ( i=0, iLen=aColumnsInc.length ; i<iLen ; i++ )
+		{
+			if ( aColumnsInc[i] )
+			{
+				iWidth = aoCols[i].nTh.offsetWidth;
+				iTotal += iWidth;
+				aColWidths.push( iWidth );
+			}
+		}
+
+		for ( i=0, iLen=aColWidths.length ; i<iLen ; i++ )
+		{
+			aColWidths[i] = aColWidths[i] / iTotal;
+		}
+
+		return aColWidths.join('\t');
+	},
+
+
+	/**
+	 * Get the information contained in a table as a string
+	 *  @param   {Object} oConfig Button configuration object
+	 *  @returns {String} Table data as a string
+	 */
+	"fnGetTableData": function ( oConfig )
+	{
+		/* In future this could be used to get data from a plain HTML source as well as DataTables */
+		if ( this.s.dt )
+		{
+			return this._fnGetDataTablesData( oConfig );
+		}
+	},
+
+
+	/**
+	 * Pass text to a flash button instance, which will be used on the button's click handler
+	 *  @param   {Object} clip Flash button object
+	 *  @param   {String} text Text to set
+	 */
+	"fnSetText": function ( clip, text )
+	{
+		this._fnFlashSetText( clip, text );
+	},
+
+
+	/**
+	 * Resize the flash elements of the buttons attached to this TableTools instance - this is
+	 * useful for when initialising TableTools when it is hidden (display:none) since sizes can't
+	 * be calculated at that time.
+	 */
+	"fnResizeButtons": function ()
+	{
+		for ( var cli in ZeroClipboard_TableTools.clients )
+		{
+			if ( cli )
+			{
+				var client = ZeroClipboard_TableTools.clients[cli];
+				if ( typeof client.domElement != 'undefined' &&
+					 client.domElement.parentNode )
+				{
+					client.positionElement();
+				}
+			}
+		}
+	},
+
+
+	/**
+	 * Check to see if any of the ZeroClipboard client's attached need to be resized
+	 */
+	"fnResizeRequired": function ()
+	{
+		for ( var cli in ZeroClipboard_TableTools.clients )
+		{
+			if ( cli )
+			{
+				var client = ZeroClipboard_TableTools.clients[cli];
+				if ( typeof client.domElement != 'undefined' &&
+					 client.domElement.parentNode == this.dom.container &&
+					 client.sized === false )
+				{
+					return true;
+				}
+			}
+		}
+		return false;
+	},
+
+
+	/**
+	 * Programmatically enable or disable the print view
+	 *  @param {boolean} [bView=true] Show the print view if true or not given. If false, then
+	 *    terminate the print view and return to normal.
+	 *  @param {object} [oConfig={}] Configuration for the print view
+	 *  @param {boolean} [oConfig.bShowAll=false] Show all rows in the table if true
+	 *  @param {string} [oConfig.sInfo] Information message, displayed as an overlay to the
+	 *    user to let them know what the print view is.
+	 *  @param {string} [oConfig.sMessage] HTML string to show at the top of the document - will
+	 *    be included in the printed document.
+	 */
+	"fnPrint": function ( bView, oConfig )
+	{
+		if ( oConfig === undefined )
+		{
+			oConfig = {};
+		}
+
+		if ( bView === undefined || bView )
+		{
+			this._fnPrintStart( oConfig );
+		}
+		else
+		{
+			this._fnPrintEnd();
+		}
+	},
+
+
+	/**
+	 * Show a message to the end user which is nicely styled
+	 *  @param {string} message The HTML string to show to the user
+	 *  @param {int} time The duration the message is to be shown on screen for (mS)
+	 */
+	"fnInfo": function ( message, time ) {
+		var info = $('<div/>')
+			.addClass( this.classes.print.info )
+			.html( message )
+			.appendTo( 'body' );
+
+		setTimeout( function() {
+			info.fadeOut( "normal", function() {
+				info.remove();
+			} );
+		}, time );
+	},
+
+
+
+	/**
+	 * Get the container element of the instance for attaching to the DOM
+	 *   @returns {node} DOM node
+	 */
+	"fnContainer": function () {
+		return this.dom.container;
+	},
+
+
+
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Private methods (they are of course public in JS, but recommended as private)
+	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+	/**
+	 * Constructor logic
+	 *  @method  _fnConstruct
+	 *  @param   {Object} oOpts Same as TableTools constructor
+	 *  @returns void
+	 *  @private 
+	 */
+	"_fnConstruct": function ( oOpts )
+	{
+		var that = this;
+
+		this._fnCustomiseSettings( oOpts );
+
+		/* Container element */
+		this.dom.container = document.createElement( this.s.tags.container );
+		this.dom.container.className = this.classes.container;
+
+		/* Row selection config */
+		if ( this.s.select.type != 'none' )
+		{
+			this._fnRowSelectConfig();
+		}
+
+		/* Buttons */
+		this._fnButtonDefinations( this.s.buttonSet, this.dom.container );
+
+		/* Destructor */
+		this.s.dt.aoDestroyCallback.push( {
+			"sName": "TableTools",
+			"fn": function () {
+				$(that.s.dt.nTBody).off( 'click.DTTT_Select', 'tr' );
+				$(that.dom.container).empty();
+
+				// Remove the instance
+				var idx = $.inArray( that, TableTools._aInstances );
+				if ( idx !== -1 ) {
+					TableTools._aInstances.splice( idx, 1 );
+				}
+			}
+		} );
+	},
+
+
+	/**
+	 * Take the user defined settings and the default settings and combine them.
+	 *  @method  _fnCustomiseSettings
+	 *  @param   {Object} oOpts Same as TableTools constructor
+	 *  @returns void
+	 *  @private 
+	 */
+	"_fnCustomiseSettings": function ( oOpts )
+	{
+		/* Is this the master control instance or not? */
+		if ( typeof this.s.dt._TableToolsInit == 'undefined' )
+		{
+			this.s.master = true;
+			this.s.dt._TableToolsInit = true;
+		}
+
+		/* We can use the table node from comparisons to group controls */
+		this.dom.table = this.s.dt.nTable;
+
+		/* Clone the defaults and then the user options */
+		this.s.custom = $.extend( {}, TableTools.DEFAULTS, oOpts );
+
+		/* Flash file location */
+		this.s.swfPath = this.s.custom.sSwfPath;
+		if ( typeof ZeroClipboard_TableTools != 'undefined' )
+		{
+			ZeroClipboard_TableTools.moviePath = this.s.swfPath;
+		}
+
+		/* Table row selecting */
+		this.s.select.type = this.s.custom.sRowSelect;
+		this.s.select.preRowSelect = this.s.custom.fnPreRowSelect;
+		this.s.select.postSelected = this.s.custom.fnRowSelected;
+		this.s.select.postDeselected = this.s.custom.fnRowDeselected;
+
+		// Backwards compatibility - allow the user to specify a custom class in the initialiser
+		if ( this.s.custom.sSelectedClass )
+		{
+			this.classes.select.row = this.s.custom.sSelectedClass;
+		}
+
+		this.s.tags = this.s.custom.oTags;
+
+		/* Button set */
+		this.s.buttonSet = this.s.custom.aButtons;
+	},
+
+
+	/**
+	 * Take the user input arrays and expand them to be fully defined, and then add them to a given
+	 * DOM element
+	 *  @method  _fnButtonDefinations
+	 *  @param {array} buttonSet Set of user defined buttons
+	 *  @param {node} wrapper Node to add the created buttons to
+	 *  @returns void
+	 *  @private 
+	 */
+	"_fnButtonDefinations": function ( buttonSet, wrapper )
+	{
+		var buttonDef;
+
+		for ( var i=0, iLen=buttonSet.length ; i<iLen ; i++ )
+		{
+			if ( typeof buttonSet[i] == "string" )
+			{
+				if ( typeof TableTools.BUTTONS[ buttonSet[i] ] == 'undefined' )
+				{
+					alert( "TableTools: Warning - unknown button type: "+buttonSet[i] );
+					continue;
+				}
+				buttonDef = $.extend( {}, TableTools.BUTTONS[ buttonSet[i] ], true );
+			}
+			else
+			{
+				if ( typeof TableTools.BUTTONS[ buttonSet[i].sExtends ] == 'undefined' )
+				{
+					alert( "TableTools: Warning - unknown button type: "+buttonSet[i].sExtends );
+					continue;
+				}
+				var o = $.extend( {}, TableTools.BUTTONS[ buttonSet[i].sExtends ], true );
+				buttonDef = $.extend( o, buttonSet[i], true );
+			}
+
+			wrapper.appendChild( this._fnCreateButton(
+				buttonDef,
+				$(wrapper).hasClass(this.classes.collection.container)
+			) );
+		}
+	},
+
+
+	/**
+	 * Create and configure a TableTools button
+	 *  @method  _fnCreateButton
+	 *  @param   {Object} oConfig Button configuration object
+	 *  @returns {Node} Button element
+	 *  @private 
+	 */
+	"_fnCreateButton": function ( oConfig, bCollectionButton )
+	{
+	  var nButton = this._fnButtonBase( oConfig, bCollectionButton );
+
+		if ( oConfig.sAction.match(/flash/) )
+		{
+			this._fnFlashConfig( nButton, oConfig );
+		}
+		else if ( oConfig.sAction == "text" )
+		{
+			this._fnTextConfig( nButton, oConfig );
+		}
+		else if ( oConfig.sAction == "div" )
+		{
+			this._fnTextConfig( nButton, oConfig );
+		}
+		else if ( oConfig.sAction == "collection" )
+		{
+			this._fnTextConfig( nButton, oConfig );
+			this._fnCollectionConfig( nButton, oConfig );
+		}
+
+		return nButton;
+	},
+
+
+	/**
+	 * Create the DOM needed for the button and apply some base properties. All buttons start here
+	 *  @method  _fnButtonBase
+	 *  @param   {o} oConfig Button configuration object
+	 *  @returns {Node} DIV element for the button
+	 *  @private
+	 */
+	"_fnButtonBase": function ( o, bCollectionButton )
+	{
+		var sTag, sLiner, sClass;
+
+		if ( bCollectionButton )
+		{
+			sTag = o.sTag && o.sTag !== "default" ? o.sTag : this.s.tags.collection.button;
+			sLiner = o.sLinerTag && o.sLinerTag !== "default" ? o.sLiner : this.s.tags.collection.liner;
+			sClass = this.classes.collection.buttons.normal;
+		}
+		else
+		{
+			sTag = o.sTag && o.sTag !== "default" ? o.sTag : this.s.tags.button;
+			sLiner = o.sLinerTag && o.sLinerTag !== "default" ? o.sLiner : this.s.tags.liner;
+			sClass = this.classes.buttons.normal;
+		}
+
+		var
+		  nButton = document.createElement( sTag ),
+		  nSpan = document.createElement( sLiner ),
+		  masterS = this._fnGetMasterSettings();
+
+		nButton.className = sClass+" "+o.sButtonClass;
+		nButton.setAttribute('id', "ToolTables_"+this.s.dt.sInstance+"_"+masterS.buttonCounter );
+		nButton.appendChild( nSpan );
+		nSpan.innerHTML = o.sButtonText;
+
+		masterS.buttonCounter++;
+
+		return nButton;
+	},
+
+
+	/**
+	 * Get the settings object for the master instance. When more than one TableTools instance is
+	 * assigned to a DataTable, only one of them can be the 'master' (for the select rows). As such,
+	 * we will typically want to interact with that master for global properties.
+	 *  @method  _fnGetMasterSettings
+	 *  @returns {Object} TableTools settings object
+	 *  @private 
+	 */
+	"_fnGetMasterSettings": function ()
+	{
+		if ( this.s.master )
+		{
+			return this.s;
+		}
+		else
+		{
+			/* Look for the master which has the same DT as this one */
+			var instances = TableTools._aInstances;
+			for ( var i=0, iLen=instances.length ; i<iLen ; i++ )
+			{
+				if ( this.dom.table == instances[i].s.dt.nTable )
+				{
+					return instances[i].s;
+				}
+			}
+		}
+	},
+
+
+
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Button collection functions
+	 */
+
+	/**
+	 * Create a collection button, when activated will present a drop down list of other buttons
+	 *  @param   {Node} nButton Button to use for the collection activation
+	 *  @param   {Object} oConfig Button configuration object
+	 *  @returns void
+	 *  @private
+	 */
+	"_fnCollectionConfig": function ( nButton, oConfig )
+	{
+		var nHidden = document.createElement( this.s.tags.collection.container );
+		nHidden.style.display = "none";
+		nHidden.className = this.classes.collection.container;
+		oConfig._collection = nHidden;
+		document.body.appendChild( nHidden );
+
+		this._fnButtonDefinations( oConfig.aButtons, nHidden );
+	},
+
+
+	/**
+	 * Show a button collection
+	 *  @param   {Node} nButton Button to use for the collection
+	 *  @param   {Object} oConfig Button configuration object
+	 *  @returns void
+	 *  @private
+	 */
+	"_fnCollectionShow": function ( nButton, oConfig )
+	{
+		var
+			that = this,
+			oPos = $(nButton).offset(),
+			nHidden = oConfig._collection,
+			iDivX = oPos.left,
+			iDivY = oPos.top + $(nButton).outerHeight(),
+			iWinHeight = $(window).height(), iDocHeight = $(document).height(),
+			iWinWidth = $(window).width(), iDocWidth = $(document).width();
+
+		nHidden.style.position = "absolute";
+		nHidden.style.left = iDivX+"px";
+		nHidden.style.top = iDivY+"px";
+		nHidden.style.display = "block";
+		$(nHidden).css('opacity',0);
+
+		var nBackground = document.createElement('div');
+		nBackground.style.position = "absolute";
+		nBackground.style.left = "0px";
+		nBackground.style.top = "0px";
+		nBackground.style.height = ((iWinHeight>iDocHeight)? iWinHeight : iDocHeight) +"px";
+		nBackground.style.width = ((iWinWidth>iDocWidth)? iWinWidth : iDocWidth) +"px";
+		nBackground.className = this.classes.collection.background;
+		$(nBackground).css('opacity',0);
+
+		document.body.appendChild( nBackground );
+		document.body.appendChild( nHidden );
+
+		/* Visual corrections to try and keep the collection visible */
+		var iDivWidth = $(nHidden).outerWidth();
+		var iDivHeight = $(nHidden).outerHeight();
+
+		if ( iDivX + iDivWidth > iDocWidth )
+		{
+			nHidden.style.left = (iDocWidth-iDivWidth)+"px";
+		}
+
+		if ( iDivY + iDivHeight > iDocHeight )
+		{
+			nHidden.style.top = (iDivY-iDivHeight-$(nButton).outerHeight())+"px";
+		}
+
+		this.dom.collection.collection = nHidden;
+		this.dom.collection.background = nBackground;
+
+		/* This results in a very small delay for the end user but it allows the animation to be
+		 * much smoother. If you don't want the animation, then the setTimeout can be removed
+		 */
+		setTimeout( function () {
+			$(nHidden).animate({"opacity": 1}, 500);
+			$(nBackground).animate({"opacity": 0.25}, 500);
+		}, 10 );
+
+		/* Resize the buttons to the Flash contents fit */
+		this.fnResizeButtons();
+
+		/* Event handler to remove the collection display */
+		$(nBackground).click( function () {
+			that._fnCollectionHide.call( that, null, null );
+		} );
+	},
+
+
+	/**
+	 * Hide a button collection
+	 *  @param   {Node} nButton Button to use for the collection
+	 *  @param   {Object} oConfig Button configuration object
+	 *  @returns void
+	 *  @private
+	 */
+	"_fnCollectionHide": function ( nButton, oConfig )
+	{
+		if ( oConfig !== null && oConfig.sExtends == 'collection' )
+		{
+			return;
+		}
+
+		if ( this.dom.collection.collection !== null )
+		{
+			$(this.dom.collection.collection).animate({"opacity": 0}, 500, function (e) {
+				this.style.display = "none";
+			} );
+
+			$(this.dom.collection.background).animate({"opacity": 0}, 500, function (e) {
+				this.parentNode.removeChild( this );
+			} );
+
+			this.dom.collection.collection = null;
+			this.dom.collection.background = null;
+		}
+	},
+
+
+
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Row selection functions
+	 */
+
+	/**
+	 * Add event handlers to a table to allow for row selection
+	 *  @method  _fnRowSelectConfig
+	 *  @returns void
+	 *  @private 
+	 */
+	"_fnRowSelectConfig": function ()
+	{
+		if ( this.s.master )
+		{
+			var
+				that = this,
+				i, iLen,
+				dt = this.s.dt,
+				aoOpenRows = this.s.dt.aoOpenRows;
+
+			$(dt.nTable).addClass( this.classes.select.table );
+
+			// When using OS style selection, we want to cancel the shift text
+			// selection, but only when the shift key is used (so you can
+			// actually still select text in the table)
+			if ( this.s.select.type === 'os' ) {
+				$(dt.nTBody).on( 'mousedown.DTTT_Select', 'tr', function(e) {
+					if ( e.shiftKey ) {
+
+						$(dt.nTBody)
+							.css( '-moz-user-select', 'none' )
+							.one('selectstart.DTTT_Select', 'tr', function () {
+								return false;
+							} );
+					}
+				} );
+
+				$(dt.nTBody).on( 'mouseup.DTTT_Select', 'tr', function(e) {
+					$(dt.nTBody).css( '-moz-user-select', '' );
+				} );
+			}
+
+			// Row selection
+			$(dt.nTBody).on( 'click.DTTT_Select', this.s.custom.sRowSelector, function(e) {
+				var row = this.nodeName.toLowerCase() === 'tr' ?
+					this :
+					$(this).parents('tr')[0];
+
+				var select = that.s.select;
+				var pos = that.s.dt.oInstance.fnGetPosition( row );
+
+				/* Sub-table must be ignored (odd that the selector won't do this with >) */
+				if ( row.parentNode != dt.nTBody ) {
+					return;
+				}
+
+				/* Check that we are actually working with a DataTables controlled row */
+				if ( dt.oInstance.fnGetData(row) === null ) {
+				    return;
+				}
+
+				// Shift click, ctrl click and simple click handling to make
+				// row selection a lot like a file system in desktop OSs
+				if ( select.type == 'os' ) {
+					if ( e.ctrlKey || e.metaKey ) {
+						// Add or remove from the selection
+						if ( that.fnIsSelected( row ) ) {
+							that._fnRowDeselect( row, e );
+						}
+						else {
+							that._fnRowSelect( row, e );
+						}
+					}
+					else if ( e.shiftKey ) {
+						// Add a range of rows, from the last selected row to
+						// this one
+						var rowIdxs = that.s.dt.aiDisplay.slice(); // visible rows
+						var idx1 = $.inArray( select.lastRow, rowIdxs );
+						var idx2 = $.inArray( pos, rowIdxs );
+
+						if ( that.fnGetSelected().length === 0 || idx1 === -1 ) {
+							// select from top to here - slightly odd, but both
+							// Windows and Mac OS do this
+							rowIdxs.splice( $.inArray( pos, rowIdxs )+1, rowIdxs.length );
+						}
+						else {
+							// reverse so we can shift click 'up' as well as down
+							if ( idx1 > idx2 ) {
+								var tmp = idx2;
+								idx2 = idx1;
+								idx1 = tmp;
+							}
+
+							rowIdxs.splice( idx2+1, rowIdxs.length );
+							rowIdxs.splice( 0, idx1 );
+						}
+
+						if ( ! that.fnIsSelected( row ) ) {
+							// Select range
+							that._fnRowSelect( rowIdxs, e );
+						}
+						else {
+							// Deselect range - need to keep the clicked on row selected
+							rowIdxs.splice( $.inArray( pos, rowIdxs ), 1 );
+							that._fnRowDeselect( rowIdxs, e );
+						}
+					}
+					else {
+						// No cmd or shift click. Deselect current if selected,
+						// or select this row only
+						if ( that.fnIsSelected( row ) && that.fnGetSelected().length === 1 ) {
+							that._fnRowDeselect( row, e );
+						}
+						else {
+							that.fnSelectNone();
+							that._fnRowSelect( row, e );
+						}
+					}
+				}
+				else if ( that.fnIsSelected( row ) ) {
+					that._fnRowDeselect( row, e );
+				}
+				else if ( select.type == "single" ) {
+					that.fnSelectNone();
+					that._fnRowSelect( row, e );
+				}
+				else if ( select.type == "multi" ) {
+					that._fnRowSelect( row, e );
+				}
+
+				select.lastRow = pos;
+			} );//.on('selectstart', function () { return false; } );
+
+			// Bind a listener to the DataTable for when new rows are created.
+			// This allows rows to be visually selected when they should be and
+			// deferred rendering is used.
+			dt.oApi._fnCallbackReg( dt, 'aoRowCreatedCallback', function (tr, data, index) {
+				if ( dt.aoData[index]._DTTT_selected ) {
+					$(tr).addClass( that.classes.select.row );
+				}
+			}, 'TableTools-SelectAll' );
+		}
+	},
+
+	/**
+	 * Select rows
+	 *  @param   {*} src Rows to select - see _fnSelectData for a description of valid inputs
+	 *  @private 
+	 */
+	"_fnRowSelect": function ( src, e )
+	{
+		var
+			that = this,
+			data = this._fnSelectData( src ),
+			firstTr = data.length===0 ? null : data[0].nTr,
+			anSelected = [],
+			i, len;
+
+		// Get all the rows that will be selected
+		for ( i=0, len=data.length ; i<len ; i++ )
+		{
+			if ( data[i].nTr )
+			{
+				anSelected.push( data[i].nTr );
+			}
+		}
+
+		// User defined pre-selection function
+		if ( this.s.select.preRowSelect !== null && !this.s.select.preRowSelect.call(this, e, anSelected, true) )
+		{
+			return;
+		}
+
+		// Mark them as selected
+		for ( i=0, len=data.length ; i<len ; i++ )
+		{
+			data[i]._DTTT_selected = true;
+
+			if ( data[i].nTr )
+			{
+				$(data[i].nTr).addClass( that.classes.select.row );
+			}
+		}
+
+		// Post-selection function
+		if ( this.s.select.postSelected !== null )
+		{
+			this.s.select.postSelected.call( this, anSelected );
+		}
+
+		TableTools._fnEventDispatch( this, 'select', anSelected, true );
+	},
+
+	/**
+	 * Deselect rows
+	 *  @param   {*} src Rows to deselect - see _fnSelectData for a description of valid inputs
+	 *  @private 
+	 */
+	"_fnRowDeselect": function ( src, e )
+	{
+		var
+			that = this,
+			data = this._fnSelectData( src ),
+			firstTr = data.length===0 ? null : data[0].nTr,
+			anDeselectedTrs = [],
+			i, len;
+
+		// Get all the rows that will be deselected
+		for ( i=0, len=data.length ; i<len ; i++ )
+		{
+			if ( data[i].nTr )
+			{
+				anDeselectedTrs.push( data[i].nTr );
+			}
+		}
+
+		// User defined pre-selection function
+		if ( this.s.select.preRowSelect !== null && !this.s.select.preRowSelect.call(this, e, anDeselectedTrs, false) )
+		{
+			return;
+		}
+
+		// Mark them as deselected
+		for ( i=0, len=data.length ; i<len ; i++ )
+		{
+			data[i]._DTTT_selected = false;
+
+			if ( data[i].nTr )
+			{
+				$(data[i].nTr).removeClass( that.classes.select.row );
+			}
+		}
+
+		// Post-deselection function
+		if ( this.s.select.postDeselected !== null )
+		{
+			this.s.select.postDeselected.call( this, anDeselectedTrs );
+		}
+
+		TableTools._fnEventDispatch( this, 'select', anDeselectedTrs, false );
+	},
+
+	/**
+	 * Take a data source for row selection and convert it into aoData points for the DT
+	 *   @param {*} src Can be a single DOM TR node, an array of TR nodes (including a
+	 *     a jQuery object), a single aoData point from DataTables, an array of aoData
+	 *     points or an array of aoData indexes
+	 *   @returns {array} An array of aoData points
+	 */
+	"_fnSelectData": function ( src )
+	{
+		var out = [], pos, i, iLen;
+
+		if ( src.nodeName )
+		{
+			// Single node
+			pos = this.s.dt.oInstance.fnGetPosition( src );
+			out.push( this.s.dt.aoData[pos] );
+		}
+		else if ( typeof src.length !== 'undefined' )
+		{
+			// jQuery object or an array of nodes, or aoData points
+			for ( i=0, iLen=src.length ; i<iLen ; i++ )
+			{
+				if ( src[i].nodeName )
+				{
+					pos = this.s.dt.oInstance.fnGetPosition( src[i] );
+					out.push( this.s.dt.aoData[pos] );
+				}
+				else if ( typeof src[i] === 'number' )
+				{
+					out.push( this.s.dt.aoData[ src[i] ] );
+				}
+				else
+				{
+					out.push( src[i] );
+				}
+			}
+
+			return out;
+		}
+		else
+		{
+			// A single aoData point
+			out.push( src );
+		}
+
+		return out;
+	},
+
+
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Text button functions
+	 */
+
+	/**
+	 * Configure a text based button for interaction events
+	 *  @method  _fnTextConfig
+	 *  @param   {Node} nButton Button element which is being considered
+	 *  @param   {Object} oConfig Button configuration object
+	 *  @returns void
+	 *  @private 
+	 */
+	"_fnTextConfig": function ( nButton, oConfig )
+	{
+		var that = this;
+
+		if ( oConfig.fnInit !== null )
+		{
+			oConfig.fnInit.call( this, nButton, oConfig );
+		}
+
+		if ( oConfig.sToolTip !== "" )
+		{
+			nButton.title = oConfig.sToolTip;
+		}
+
+		$(nButton).hover( function () {
+			if ( oConfig.fnMouseover !== null )
+			{
+				oConfig.fnMouseover.call( this, nButton, oConfig, null );
+			}
+		}, function () {
+			if ( oConfig.fnMouseout !== null )
+			{
+				oConfig.fnMouseout.call( this, nButton, oConfig, null );
+			}
+		} );
+
+		if ( oConfig.fnSelect !== null )
+		{
+			TableTools._fnEventListen( this, 'select', function (n) {
+				oConfig.fnSelect.call( that, nButton, oConfig, n );
+			} );
+		}
+
+		$(nButton).click( function (e) {
+			//e.preventDefault();
+
+			if ( oConfig.fnClick !== null )
+			{
+				oConfig.fnClick.call( that, nButton, oConfig, null, e );
+			}
+
+			/* Provide a complete function to match the behaviour of the flash elements */
+			if ( oConfig.fnComplete !== null )
+			{
+				oConfig.fnComplete.call( that, nButton, oConfig, null, null );
+			}
+
+			that._fnCollectionHide( nButton, oConfig );
+		} );
+	},
+
+
+
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Flash button functions
+	 */
+
+	/**
+	 * Configure a flash based button for interaction events
+	 *  @method  _fnFlashConfig
+	 *  @param   {Node} nButton Button element which is being considered
+	 *  @param   {o} oConfig Button configuration object
+	 *  @returns void
+	 *  @private 
+	 */
+	"_fnFlashConfig": function ( nButton, oConfig )
+	{
+		var that = this;
+		var flash = new ZeroClipboard_TableTools.Client();
+
+		if ( oConfig.fnInit !== null )
+		{
+			oConfig.fnInit.call( this, nButton, oConfig );
+		}
+
+		flash.setHandCursor( true );
+
+		if ( oConfig.sAction == "flash_save" )
+		{
+			flash.setAction( 'save' );
+			flash.setCharSet( (oConfig.sCharSet=="utf16le") ? 'UTF16LE' : 'UTF8' );
+			flash.setBomInc( oConfig.bBomInc );
+			flash.setFileName( oConfig.sFileName.replace('*', this.fnGetTitle(oConfig)) );
+		}
+		else if ( oConfig.sAction == "flash_pdf" )
+		{
+			flash.setAction( 'pdf' );
+			flash.setFileName( oConfig.sFileName.replace('*', this.fnGetTitle(oConfig)) );
+		}
+		else
+		{
+			flash.setAction( 'copy' );
+		}
+
+		flash.addEventListener('mouseOver', function(client) {
+			if ( oConfig.fnMouseover !== null )
+			{
+				oConfig.fnMouseover.call( that, nButton, oConfig, flash );
+			}
+		} );
+
+		flash.addEventListener('mouseOut', function(client) {
+			if ( oConfig.fnMouseout !== null )
+			{
+				oConfig.fnMouseout.call( that, nButton, oConfig, flash );
+			}
+		} );
+
+		flash.addEventListener('mouseDown', function(client) {
+			if ( oConfig.fnClick !== null )
+			{
+				oConfig.fnClick.call( that, nButton, oConfig, flash );
+			}
+		} );
+
+		flash.addEventListener('complete', function (client, text) {
+			if ( oConfig.fnComplete !== null )
+			{
+				oConfig.fnComplete.call( that, nButton, oConfig, flash, text );
+			}
+			that._fnCollectionHide( nButton, oConfig );
+		} );
+
+		this._fnFlashGlue( flash, nButton, oConfig.sToolTip );
+	},
+
+
+	/**
+	 * Wait until the id is in the DOM before we "glue" the swf. Note that this function will call
+	 * itself (using setTimeout) until it completes successfully
+	 *  @method  _fnFlashGlue
+	 *  @param   {Object} clip Zero clipboard object
+	 *  @param   {Node} node node to glue swf to
+	 *  @param   {String} text title of the flash movie
+	 *  @returns void
+	 *  @private 
+	 */
+	"_fnFlashGlue": function ( flash, node, text )
+	{
+		var that = this;
+		var id = node.getAttribute('id');
+
+		if ( document.getElementById(id) )
+		{
+			flash.glue( node, text );
+		}
+		else
+		{
+			setTimeout( function () {
+				that._fnFlashGlue( flash, node, text );
+			}, 100 );
+		}
+	},
+
+
+	/**
+	 * Set the text for the flash clip to deal with
+	 * 
+	 * This function is required for large information sets. There is a limit on the 
+	 * amount of data that can be transferred between Javascript and Flash in a single call, so
+	 * we use this method to build up the text in Flash by sending over chunks. It is estimated
+	 * that the data limit is around 64k, although it is undocumented, and appears to be different
+	 * between different flash versions. We chunk at 8KiB.
+	 *  @method  _fnFlashSetText
+	 *  @param   {Object} clip the ZeroClipboard object
+	 *  @param   {String} sData the data to be set
+	 *  @returns void
+	 *  @private 
+	 */
+	"_fnFlashSetText": function ( clip, sData )
+	{
+		var asData = this._fnChunkData( sData, 8192 );
+
+		clip.clearText();
+		for ( var i=0, iLen=asData.length ; i<iLen ; i++ )
+		{
+			clip.appendText( asData[i] );
+		}
+	},
+
+
+
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Data retrieval functions
+	 */
+
+	/**
+	 * Convert the mixed columns variable into a boolean array the same size as the columns, which
+	 * indicates which columns we want to include
+	 *  @method  _fnColumnTargets
+	 *  @param   {String|Array} mColumns The columns to be included in data retrieval. If a string
+	 *			 then it can take the value of "visible" or "hidden" (to include all visible or
+	 *			 hidden columns respectively). Or an array of column indexes
+	 *  @returns {Array} A boolean array the length of the columns of the table, which each value
+	 *			 indicating if the column is to be included or not
+	 *  @private 
+	 */
+	"_fnColumnTargets": function ( mColumns )
+	{
+		var aColumns = [];
+		var dt = this.s.dt;
+		var i, iLen;
+
+		if ( typeof mColumns == "object" )
+		{
+			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
+			{
+				aColumns.push( false );
+			}
+
+			for ( i=0, iLen=mColumns.length ; i<iLen ; i++ )
+			{
+				aColumns[ mColumns[i] ] = true;
+			}
+		}
+		else if ( mColumns == "visible" )
+		{
+			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
+			{
+				aColumns.push( dt.aoColumns[i].bVisible ? true : false );
+			}
+		}
+		else if ( mColumns == "hidden" )
+		{
+			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
+			{
+				aColumns.push( dt.aoColumns[i].bVisible ? false : true );
+			}
+		}
+		else if ( mColumns == "sortable" )
+		{
+			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
+			{
+				aColumns.push( dt.aoColumns[i].bSortable ? true : false );
+			}
+		}
+		else /* all */
+		{
+			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
+			{
+				aColumns.push( true );
+			}
+		}
+
+		return aColumns;
+	},
+
+
+	/**
+	 * New line character(s) depend on the platforms
+	 *  @method  method
+	 *  @param   {Object} oConfig Button configuration object - only interested in oConfig.sNewLine
+	 *  @returns {String} Newline character
+	 */
+	"_fnNewline": function ( oConfig )
+	{
+		if ( oConfig.sNewLine == "auto" )
+		{
+			return navigator.userAgent.match(/Windows/) ? "\r\n" : "\n";
+		}
+		else
+		{
+			return oConfig.sNewLine;
+		}
+	},
+
+
+	/**
+	 * Get data from DataTables' internals and format it for output
+	 *  @method  _fnGetDataTablesData
+	 *  @param   {Object} oConfig Button configuration object
+	 *  @param   {String} oConfig.sFieldBoundary Field boundary for the data cells in the string
+	 *  @param   {String} oConfig.sFieldSeperator Field separator for the data cells
+	 *  @param   {String} oConfig.sNewline New line options
+	 *  @param   {Mixed} oConfig.mColumns Which columns should be included in the output
+	 *  @param   {Boolean} oConfig.bHeader Include the header
+	 *  @param   {Boolean} oConfig.bFooter Include the footer
+	 *  @param   {Boolean} oConfig.bSelectedOnly Include only the selected rows in the output
+	 *  @returns {String} Concatenated string of data
+	 *  @private 
+	 */
+	"_fnGetDataTablesData": function ( oConfig )
+	{
+		var i, iLen, j, jLen;
+		var aRow, aData=[], sLoopData='', arr;
+		var dt = this.s.dt, tr, child;
+		var regex = new RegExp(oConfig.sFieldBoundary, "g"); /* Do it here for speed */
+		var aColumnsInc = this._fnColumnTargets( oConfig.mColumns );
+		var bSelectedOnly = (typeof oConfig.bSelectedOnly != 'undefined') ? oConfig.bSelectedOnly : false;
+
+		/*
+		 * Header
+		 */
+		if ( oConfig.bHeader )
+		{
+			aRow = [];
+
+			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
+			{
+				if ( aColumnsInc[i] )
+				{
+					sLoopData = dt.aoColumns[i].sTitle.replace(/\n/g," ").replace( /<.*?>/g, "" ).replace(/^\s+|\s+$/g,"");
+					sLoopData = this._fnHtmlDecode( sLoopData );
+
+					aRow.push( this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) );
+				}
+			}
+
+			aData.push( aRow.join(oConfig.sFieldSeperator) );
+		}
+
+		/*
+		 * Body
+		 */
+		var aSelected = this.fnGetSelected();
+		bSelectedOnly = this.s.select.type !== "none" && bSelectedOnly && aSelected.length !== 0;
+
+		var aDataIndex = dt.oInstance
+			.$('tr', oConfig.oSelectorOpts)
+			.map( function (id, row) {
+				// If "selected only", then ensure that the row is in the selected list
+				return bSelectedOnly && $.inArray( row, aSelected ) === -1 ?
+					null :
+					dt.oInstance.fnGetPosition( row );
+			} )
+			.get();
+
+		for ( j=0, jLen=aDataIndex.length ; j<jLen ; j++ )
+		{
+			tr = dt.aoData[ aDataIndex[j] ].nTr;
+			aRow = [];
+
+			/* Columns */
+			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
+			{
+				if ( aColumnsInc[i] )
+				{
+					/* Convert to strings (with small optimisation) */
+					var mTypeData = dt.oApi._fnGetCellData( dt, aDataIndex[j], i, 'display' );
+					if ( oConfig.fnCellRender )
+					{
+						sLoopData = oConfig.fnCellRender( mTypeData, i, tr, aDataIndex[j] )+"";
+					}
+					else if ( typeof mTypeData == "string" )
+					{
+						/* Strip newlines, replace img tags with alt attr. and finally strip html... */
+						sLoopData = mTypeData.replace(/\n/g," ");
+						sLoopData =
+						    sLoopData.replace(/<img.*?\s+alt\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s>]+)).*?>/gi,
+						        '$1$2$3');
+						sLoopData = sLoopData.replace( /<.*?>/g, "" );
+					}
+					else
+					{
+						sLoopData = mTypeData+"";
+					}
+
+					/* Trim and clean the data */
+					sLoopData = sLoopData.replace(/^\s+/, '').replace(/\s+$/, '');
+					sLoopData = this._fnHtmlDecode( sLoopData );
+
+					/* Bound it and add it to the total data */
+					aRow.push( this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) );
+				}
+			}
+
+			aData.push( aRow.join(oConfig.sFieldSeperator) );
+
+			/* Details rows from fnOpen */
+			if ( oConfig.bOpenRows )
+			{
+				arr = $.grep(dt.aoOpenRows, function(o) { return o.nParent === tr; });
+
+				if ( arr.length === 1 )
+				{
+					sLoopData = this._fnBoundData( $('td', arr[0].nTr).html(), oConfig.sFieldBoundary, regex );
+					aData.push( sLoopData );
+				}
+			}
+		}
+
+		/*
+		 * Footer
+		 */
+		if ( oConfig.bFooter && dt.nTFoot !== null )
+		{
+			aRow = [];
+
+			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
+			{
+				if ( aColumnsInc[i] && dt.aoColumns[i].nTf !== null )
+				{
+					sLoopData = dt.aoColumns[i].nTf.innerHTML.replace(/\n/g," ").replace( /<.*?>/g, "" );
+					sLoopData = this._fnHtmlDecode( sLoopData );
+
+					aRow.push( this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) );
+				}
+			}
+
+			aData.push( aRow.join(oConfig.sFieldSeperator) );
+		}
+
+		var _sLastData = aData.join( this._fnNewline(oConfig) );
+		return _sLastData;
+	},
+
+
+	/**
+	 * Wrap data up with a boundary string
+	 *  @method  _fnBoundData
+	 *  @param   {String} sData data to bound
+	 *  @param   {String} sBoundary bounding char(s)
+	 *  @param   {RegExp} regex search for the bounding chars - constructed outside for efficiency
+	 *			 in the loop
+	 *  @returns {String} bound data
+	 *  @private 
+	 */
+	"_fnBoundData": function ( sData, sBoundary, regex )
+	{
+		if ( sBoundary === "" )
+		{
+			return sData;
+		}
+		else
+		{
+			return sBoundary + sData.replace(regex, sBoundary+sBoundary) + sBoundary;
+		}
+	},
+
+
+	/**
+	 * Break a string up into an array of smaller strings
+	 *  @method  _fnChunkData
+	 *  @param   {String} sData data to be broken up
+	 *  @param   {Int} iSize chunk size
+	 *  @returns {Array} String array of broken up text
+	 *  @private 
+	 */
+	"_fnChunkData": function ( sData, iSize )
+	{
+		var asReturn = [];
+		var iStrlen = sData.length;
+
+		for ( var i=0 ; i<iStrlen ; i+=iSize )
+		{
+			if ( i+iSize < iStrlen )
+			{
+				asReturn.push( sData.substring( i, i+iSize ) );
+			}
+			else
+			{
+				asReturn.push( sData.substring( i, iStrlen ) );
+			}
+		}
+
+		return asReturn;
+	},
+
+
+	/**
+	 * Decode HTML entities
+	 *  @method  _fnHtmlDecode
+	 *  @param   {String} sData encoded string
+	 *  @returns {String} decoded string
+	 *  @private 
+	 */
+	"_fnHtmlDecode": function ( sData )
+	{
+		if ( sData.indexOf('&') === -1 )
+		{
+			return sData;
+		}
+
+		var n = document.createElement('div');
+
+		return sData.replace( /&([^\s]*);/g, function( match, match2 ) {
+			if ( match.substr(1, 1) === '#' )
+			{
+				return String.fromCharCode( Number(match2.substr(1)) );
+			}
+			else
+			{
+				n.innerHTML = match;
+				return n.childNodes[0].nodeValue;
+			}
+		} );
+	},
+
+
+
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+	 * Printing functions
+	 */
+
+	/**
+	 * Show print display
+	 *  @method  _fnPrintStart
+	 *  @param   {Event} e Event object
+	 *  @param   {Object} oConfig Button configuration object
+	 *  @returns void
+	 *  @private 
+	 */
+	"_fnPrintStart": function ( oConfig )
+	{
+	  var that = this;
+	  var oSetDT = this.s.dt;
+
+		/* Parse through the DOM hiding everything that isn't needed for the table */
+		this._fnPrintHideNodes( oSetDT.nTable );
+
+		/* Show the whole table */
+		this.s.print.saveStart = oSetDT._iDisplayStart;
+		this.s.print.saveLength = oSetDT._iDisplayLength;
+
+		if ( oConfig.bShowAll )
+		{
+			oSetDT._iDisplayStart = 0;
+			oSetDT._iDisplayLength = -1;
+			if ( oSetDT.oApi._fnCalculateEnd ) {
+				oSetDT.oApi._fnCalculateEnd( oSetDT );
+			}
+			oSetDT.oApi._fnDraw( oSetDT );
+		}
+
+		/* Adjust the display for scrolling which might be done by DataTables */
+		if ( oSetDT.oScroll.sX !== "" || oSetDT.oScroll.sY !== "" )
+		{
+			this._fnPrintScrollStart( oSetDT );
+
+			// If the table redraws while in print view, the DataTables scrolling
+			// setup would hide the header, so we need to readd it on draw
+			$(this.s.dt.nTable).bind('draw.DTTT_Print', function () {
+				that._fnPrintScrollStart( oSetDT );
+			} );
+		}
+
+		/* Remove the other DataTables feature nodes - but leave the table! and info div */
+		var anFeature = oSetDT.aanFeatures;
+		for ( var cFeature in anFeature )
+		{
+			if ( cFeature != 'i' && cFeature != 't' && cFeature.length == 1 )
+			{
+				for ( var i=0, iLen=anFeature[cFeature].length ; i<iLen ; i++ )
+				{
+					this.dom.print.hidden.push( {
+						"node": anFeature[cFeature][i],
+						"display": "block"
+					} );
+					anFeature[cFeature][i].style.display = "none";
+				}
+			}
+		}
+
+		/* Print class can be used for styling */
+		$(document.body).addClass( this.classes.print.body );
+
+		/* Show information message to let the user know what is happening */
+		if ( oConfig.sInfo !== "" )
+		{
+			this.fnInfo( oConfig.sInfo, 3000 );
+		}
+
+		/* Add a message at the top of the page */
+		if ( oConfig.sMessage )
+		{
+			$('<div/>')
+				.addClass( this.classes.print.message )
+				.html( oConfig.sMessage )
+				.prependTo( 'body' );
+		}
+
+		/* Cache the scrolling and the jump to the top of the page */
+		this.s.print.saveScroll = $(window).scrollTop();
+		window.scrollTo( 0, 0 );
+
+		/* Bind a key event listener to the document for the escape key -
+		 * it is removed in the callback
+		 */
+		$(document).bind( "keydown.DTTT", function(e) {
+			/* Only interested in the escape key */
+			if ( e.keyCode == 27 )
+			{
+				e.preventDefault();
+				that._fnPrintEnd.call( that, e );
+			}
+		} );
+	},
+
+
+	/**
+	 * Printing is finished, resume normal display
+	 *  @method  _fnPrintEnd
+	 *  @param   {Event} e Event object
+	 *  @returns void
+	 *  @private 
+	 */
+	"_fnPrintEnd": function ( e )
+	{
+		var that = this;
+		var oSetDT = this.s.dt;
+		var oSetPrint = this.s.print;
+		var oDomPrint = this.dom.print;
+
+		/* Show all hidden nodes */
+		this._fnPrintShowNodes();
+
+		/* Restore DataTables' scrolling */
+		if ( oSetDT.oScroll.sX !== "" || oSetDT.oScroll.sY !== "" )
+		{
+			$(this.s.dt.nTable).unbind('draw.DTTT_Print');
+
+			this._fnPrintScrollEnd();
+		}
+
+		/* Restore the scroll */
+		window.scrollTo( 0, oSetPrint.saveScroll );
+
+		/* Drop the print message */
+		$('div.'+this.classes.print.message).remove();
+
+		/* Styling class */
+		$(document.body).removeClass( 'DTTT_Print' );
+
+		/* Restore the table length */
+		oSetDT._iDisplayStart = oSetPrint.saveStart;
+		oSetDT._iDisplayLength = oSetPrint.saveLength;
+		if ( oSetDT.oApi._fnCalculateEnd ) {
+			oSetDT.oApi._fnCalculateEnd( oSetDT );
+		}
+		oSetDT.oApi._fnDraw( oSetDT );
+
+		$(document).unbind( "keydown.DTTT" );
+	},
+
+
+	/**
+	 * Take account of scrolling in DataTables by showing the full table
+	 *  @returns void
+	 *  @private 
+	 */
+	"_fnPrintScrollStart": function ()
+	{
+		var
+			oSetDT = this.s.dt,
+			nScrollHeadInner = oSetDT.nScrollHead.getElementsByTagName('div')[0],
+			nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0],
+			nScrollBody = oSetDT.nTable.parentNode,
+			nTheadSize, nTfootSize;
+
+		/* Copy the header in the thead in the body table, this way we show one single table when
+		 * in print view. Note that this section of code is more or less verbatim from DT 1.7.0
+		 */
+		nTheadSize = oSetDT.nTable.getElementsByTagName('thead');
+		if ( nTheadSize.length > 0 )
+		{
+			oSetDT.nTable.removeChild( nTheadSize[0] );
+		}
+
+		if ( oSetDT.nTFoot !== null )
+		{
+			nTfootSize = oSetDT.nTable.getElementsByTagName('tfoot');
+			if ( nTfootSize.length > 0 )
+			{
+				oSetDT.nTable.removeChild( nTfootSize[0] );
+			}
+		}
+
+		nTheadSize = oSetDT.nTHead.cloneNode(true);
+		oSetDT.nTable.insertBefore( nTheadSize, oSetDT.nTable.childNodes[0] );
+
+		if ( oSetDT.nTFoot !== null )
+		{
+			nTfootSize = oSetDT.nTFoot.cloneNode(true);
+			oSetDT.nTable.insertBefore( nTfootSize, oSetDT.nTable.childNodes[1] );
+		}
+
+		/* Now adjust the table's viewport so we can actually see it */
+		if ( oSetDT.oScroll.sX !== "" )
+		{
+			oSetDT.nTable.style.width = $(oSetDT.nTable).outerWidth()+"px";
+			nScrollBody.style.width = $(oSetDT.nTable).outerWidth()+"px";
+			nScrollBody.style.overflow = "visible";
+		}
+
+		if ( oSetDT.oScroll.sY !== "" )
+		{
+			nScrollBody.style.height = $(oSetDT.nTable).outerHeight()+"px";
+			nScrollBody.style.overflow = "visible";
+		}
+	},
+
+
+	/**
+	 * Take account of scrolling in DataTables by showing the full table. Note that the redraw of
+	 * the DataTable that we do will actually deal with the majority of the hard work here
+	 *  @returns void
+	 *  @private 
+	 */
+	"_fnPrintScrollEnd": function ()
+	{
+		var
+			oSetDT = this.s.dt,
+			nScrollBody = oSetDT.nTable.parentNode;
+
+		if ( oSetDT.oScroll.sX !== "" )
+		{
+			nScrollBody.style.width = oSetDT.oApi._fnStringToCss( oSetDT.oScroll.sX );
+			nScrollBody.style.overflow = "auto";
+		}
+
+		if ( oSetDT.oScroll.sY !== "" )
+		{
+			nScrollBody.style.height = oSetDT.oApi._fnStringToCss( oSetDT.oScroll.sY );
+			nScrollBody.style.overflow = "auto";
+		}
+	},
+
+
+	/**
+	 * Resume the display of all TableTools hidden nodes
+	 *  @method  _fnPrintShowNodes
+	 *  @returns void
+	 *  @private 
+	 */
+	"_fnPrintShowNodes": function ( )
+	{
+	  var anHidden = this.dom.print.hidden;
+
+		for ( var i=0, iLen=anHidden.length ; i<iLen ; i++ )
+		{
+			anHidden[i].node.style.display = anHidden[i].display;
+		}
+		anHidden.splice( 0, anHidden.length );
+	},
+
+
+	/**
+	 * Hide nodes which are not needed in order to display the table. Note that this function is
+	 * recursive
+	 *  @method  _fnPrintHideNodes
+	 *  @param   {Node} nNode Element which should be showing in a 'print' display
+	 *  @returns void
+	 *  @private 
+	 */
+	"_fnPrintHideNodes": function ( nNode )
+	{
+		var anHidden = this.dom.print.hidden;
+
+		var nParent = nNode.parentNode;
+		var nChildren = nParent.childNodes;
+		for ( var i=0, iLen=nChildren.length ; i<iLen ; i++ )
+		{
+			if ( nChildren[i] != nNode && nChildren[i].nodeType == 1 )
+			{
+				/* If our node is shown (don't want to show nodes which were previously hidden) */
+				var sDisplay = $(nChildren[i]).css("display");
+				if ( sDisplay != "none" )
+				{
+					/* Cache the node and it's previous state so we can restore it */
+					anHidden.push( {
+						"node": nChildren[i],
+						"display": sDisplay
+					} );
+					nChildren[i].style.display = "none";
+				}
+			}
+		}
+
+		if ( nParent.nodeName.toUpperCase() != "BODY" )
+		{
+			this._fnPrintHideNodes( nParent );
+		}
+	}
+};
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Static variables
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/**
+ * Store of all instances that have been created of TableTools, so one can look up other (when
+ * there is need of a master)
+ *  @property _aInstances
+ *  @type	 Array
+ *  @default  []
+ *  @private
+ */
+TableTools._aInstances = [];
+
+
+/**
+ * Store of all listeners and their callback functions
+ *  @property _aListeners
+ *  @type	 Array
+ *  @default  []
+ */
+TableTools._aListeners = [];
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Static methods
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/**
+ * Get an array of all the master instances
+ *  @method  fnGetMasters
+ *  @returns {Array} List of master TableTools instances
+ *  @static
+ */
+TableTools.fnGetMasters = function ()
+{
+	var a = [];
+	for ( var i=0, iLen=TableTools._aInstances.length ; i<iLen ; i++ )
+	{
+		if ( TableTools._aInstances[i].s.master )
+		{
+			a.push( TableTools._aInstances[i] );
+		}
+	}
+	return a;
+};
+
+/**
+ * Get the master instance for a table node (or id if a string is given)
+ *  @method  fnGetInstance
+ *  @returns {Object} ID of table OR table node, for which we want the TableTools instance
+ *  @static
+ */
+TableTools.fnGetInstance = function ( node )
+{
+	if ( typeof node != 'object' )
+	{
+		node = document.getElementById(node);
+	}
+
+	for ( var i=0, iLen=TableTools._aInstances.length ; i<iLen ; i++ )
+	{
+		if ( TableTools._aInstances[i].s.master && TableTools._aInstances[i].dom.table == node )
+		{
+			return TableTools._aInstances[i];
+		}
+	}
+	return null;
+};
+
+
+/**
+ * Add a listener for a specific event
+ *  @method  _fnEventListen
+ *  @param   {Object} that Scope of the listening function (i.e. 'this' in the caller)
+ *  @param   {String} type Event type
+ *  @param   {Function} fn Function
+ *  @returns void
+ *  @private
+ *  @static
+ */
+TableTools._fnEventListen = function ( that, type, fn )
+{
+	TableTools._aListeners.push( {
+		"that": that,
+		"type": type,
+		"fn": fn
+	} );
+};
+
+
+/**
+ * An event has occurred - look up every listener and fire it off. We check that the event we are
+ * going to fire is attached to the same table (using the table node as reference) before firing
+ *  @method  _fnEventDispatch
+ *  @param   {Object} that Scope of the listening function (i.e. 'this' in the caller)
+ *  @param   {String} type Event type
+ *  @param   {Node} node Element that the event occurred on (may be null)
+ *  @param   {boolean} [selected] Indicate if the node was selected (true) or deselected (false)
+ *  @returns void
+ *  @private
+ *  @static
+ */
+TableTools._fnEventDispatch = function ( that, type, node, selected )
+{
+	var listeners = TableTools._aListeners;
+	for ( var i=0, iLen=listeners.length ; i<iLen ; i++ )
+	{
+		if ( that.dom.table == listeners[i].that.dom.table && listeners[i].type == type )
+		{
+			listeners[i].fn( node, selected );
+		}
+	}
+};
+
+
+
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Constants
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+
+
+TableTools.buttonBase = {
+	// Button base
+	"sAction": "text",
+	"sTag": "default",
+	"sLinerTag": "default",
+	"sButtonClass": "DTTT_button_text",
+	"sButtonText": "Button text",
+	"sTitle": "",
+	"sToolTip": "",
+
+	// Common button specific options
+	"sCharSet": "utf8",
+	"bBomInc": false,
+	"sFileName": "*.csv",
+	"sFieldBoundary": "",
+	"sFieldSeperator": "\t",
+	"sNewLine": "auto",
+	"mColumns": "all", /* "all", "visible", "hidden" or array of column integers */
+	"bHeader": true,
+	"bFooter": true,
+	"bOpenRows": false,
+	"bSelectedOnly": false,
+	"oSelectorOpts": undefined, // See http://datatables.net/docs/DataTables/1.9.4/#$ for full options
+
+	// Callbacks
+	"fnMouseover": null,
+	"fnMouseout": null,
+	"fnClick": null,
+	"fnSelect": null,
+	"fnComplete": null,
+	"fnInit": null,
+	"fnCellRender": null
+};
+
+
+/**
+ * @namespace Default button configurations
+ */
+TableTools.BUTTONS = {
+	"csv": $.extend( {}, TableTools.buttonBase, {
+		"sAction": "flash_save",
+		"sButtonClass": "DTTT_button_csv",
+		"sButtonText": "CSV",
+		"sFieldBoundary": '"',
+		"sFieldSeperator": ",",
+		"fnClick": function( nButton, oConfig, flash ) {
+			this.fnSetText( flash, this.fnGetTableData(oConfig) );
+		}
+	} ),
+
+	"xls": $.extend( {}, TableTools.buttonBase, {
+		"sAction": "flash_save",
+		"sCharSet": "utf16le",
+		"bBomInc": true,
+		"sButtonClass": "DTTT_button_xls",
+		"sButtonText": "Excel",
+		"fnClick": function( nButton, oConfig, flash ) {
+			this.fnSetText( flash, this.fnGetTableData(oConfig) );
+		}
+	} ),
+
+	"copy": $.extend( {}, TableTools.buttonBase, {
+		"sAction": "flash_copy",
+		"sButtonClass": "DTTT_button_copy",
+		"sButtonText": "Copy",
+		"fnClick": function( nButton, oConfig, flash ) {
+			this.fnSetText( flash, this.fnGetTableData(oConfig) );
+		},
+		"fnComplete": function(nButton, oConfig, flash, text) {
+			var
+				lines = text.split('\n').length,
+				len = this.s.dt.nTFoot === null ? lines-1 : lines-2,
+				plural = (len==1) ? "" : "s";
+			this.fnInfo( '<h6>Table copied</h6>'+
+				'<p>Copied '+len+' row'+plural+' to the clipboard.</p>',
+				1500
+			);
+		}
+	} ),
+
+	"pdf": $.extend( {}, TableTools.buttonBase, {
+		"sAction": "flash_pdf",
+		"sNewLine": "\n",
+		"sFileName": "*.pdf",
+		"sButtonClass": "DTTT_button_pdf",
+		"sButtonText": "PDF",
+		"sPdfOrientation": "portrait",
+		"sPdfSize": "A4",
+		"sPdfMessage": "",
+		"fnClick": function( nButton, oConfig, flash ) {
+			this.fnSetText( flash,
+				"title:"+ this.fnGetTitle(oConfig) +"\n"+
+				"message:"+ oConfig.sPdfMessage +"\n"+
+				"colWidth:"+ this.fnCalcColRatios(oConfig) +"\n"+
+				"orientation:"+ oConfig.sPdfOrientation +"\n"+
+				"size:"+ oConfig.sPdfSize +"\n"+
+				"--/TableToolsOpts--\n" +
+				this.fnGetTableData(oConfig)
+			);
+		}
+	} ),
+
+	"print": $.extend( {}, TableTools.buttonBase, {
+		"sInfo": "<h6>Print view</h6><p>Please use your browser's print function to "+
+		  "print this table. Press escape when finished.</p>",
+		"sMessage": null,
+		"bShowAll": true,
+		"sToolTip": "View print view",
+		"sButtonClass": "DTTT_button_print",
+		"sButtonText": "Print",
+		"fnClick": function ( nButton, oConfig ) {
+			this.fnPrint( true, oConfig );
+		}
+	} ),
+
+	"text": $.extend( {}, TableTools.buttonBase ),
+
+	"select": $.extend( {}, TableTools.buttonBase, {
+		"sButtonText": "Select button",
+		"fnSelect": function( nButton, oConfig ) {
+			if ( this.fnGetSelected().length !== 0 ) {
+				$(nButton).removeClass( this.classes.buttons.disabled );
+			} else {
+				$(nButton).addClass( this.classes.buttons.disabled );
+			}
+		},
+		"fnInit": function( nButton, oConfig ) {
+			$(nButton).addClass( this.classes.buttons.disabled );
+		}
+	} ),
+
+	"select_single": $.extend( {}, TableTools.buttonBase, {
+		"sButtonText": "Select button",
+		"fnSelect": function( nButton, oConfig ) {
+			var iSelected = this.fnGetSelected().length;
+			if ( iSelected == 1 ) {
+				$(nButton).removeClass( this.classes.buttons.disabled );
+			} else {
+				$(nButton).addClass( this.classes.buttons.disabled );
+			}
+		},
+		"fnInit": function( nButton, oConfig ) {
+			$(nButton).addClass( this.classes.buttons.disabled );
+		}
+	} ),
+
+	"select_all": $.extend( {}, TableTools.buttonBase, {
+		"sButtonText": "Select all",
+		"fnClick": function( nButton, oConfig ) {
+			this.fnSelectAll();
+		},
+		"fnSelect": function( nButton, oConfig ) {
+			if ( this.fnGetSelected().length == this.s.dt.fnRecordsDisplay() ) {
+				$(nButton).addClass( this.classes.buttons.disabled );
+			} else {
+				$(nButton).removeClass( this.classes.buttons.disabled );
+			}
+		}
+	} ),
+
+	"select_none": $.extend( {}, TableTools.buttonBase, {
+		"sButtonText": "Deselect all",
+		"fnClick": function( nButton, oConfig ) {
+			this.fnSelectNone();
+		},
+		"fnSelect": function( nButton, oConfig ) {
+			if ( this.fnGetSelected().length !== 0 ) {
+				$(nButton).removeClass( this.classes.buttons.disabled );
+			} else {
+				$(nButton).addClass( this.classes.buttons.disabled );
+			}
+		},
+		"fnInit": function( nButton, oConfig ) {
+			$(nButton).addClass( this.classes.buttons.disabled );
+		}
+	} ),
+
+	"ajax": $.extend( {}, TableTools.buttonBase, {
+		"sAjaxUrl": "/xhr.php",
+		"sButtonText": "Ajax button",
+		"fnClick": function( nButton, oConfig ) {
+			var sData = this.fnGetTableData(oConfig);
+			$.ajax( {
+				"url": oConfig.sAjaxUrl,
+				"data": [
+					{ "name": "tableData", "value": sData }
+				],
+				"success": oConfig.fnAjaxComplete,
+				"dataType": "json",
+				"type": "POST",
+				"cache": false,
+				"error": function () {
+					alert( "Error detected when sending table data to server" );
+				}
+			} );
+		},
+		"fnAjaxComplete": function( json ) {
+			alert( 'Ajax complete' );
+		}
+	} ),
+
+	"div": $.extend( {}, TableTools.buttonBase, {
+		"sAction": "div",
+		"sTag": "div",
+		"sButtonClass": "DTTT_nonbutton",
+		"sButtonText": "Text button"
+	} ),
+
+	"collection": $.extend( {}, TableTools.buttonBase, {
+		"sAction": "collection",
+		"sButtonClass": "DTTT_button_collection",
+		"sButtonText": "Collection",
+		"fnClick": function( nButton, oConfig ) {
+			this._fnCollectionShow(nButton, oConfig);
+		}
+	} )
+};
+/*
+ *  on* callback parameters:
+ *     1. node - button element
+ *     2. object - configuration object for this button
+ *     3. object - ZeroClipboard reference (flash button only)
+ *     4. string - Returned string from Flash (flash button only - and only on 'complete')
+ */
+
+// Alias to match the other plug-ins styling
+TableTools.buttons = TableTools.BUTTONS;
+
+
+/**
+ * @namespace Classes used by TableTools - allows the styles to be override easily.
+ *   Note that when TableTools initialises it will take a copy of the classes object
+ *   and will use its internal copy for the remainder of its run time.
+ */
+TableTools.classes = {
+	"container": "DTTT_container",
+	"buttons": {
+		"normal": "DTTT_button",
+		"disabled": "DTTT_disabled"
+	},
+	"collection": {
+		"container": "DTTT_collection",
+		"background": "DTTT_collection_background",
+		"buttons": {
+			"normal": "DTTT_button",
+			"disabled": "DTTT_disabled"
+		}
+	},
+	"select": {
+		"table": "DTTT_selectable",
+		"row": "DTTT_selected selected"
+	},
+	"print": {
+		"body": "DTTT_Print",
+		"info": "DTTT_print_info",
+		"message": "DTTT_PrintMessage"
+	}
+};
+
+
+/**
+ * @namespace ThemeRoller classes - built in for compatibility with DataTables' 
+ *   bJQueryUI option.
+ */
+TableTools.classes_themeroller = {
+	"container": "DTTT_container ui-buttonset ui-buttonset-multi",
+	"buttons": {
+		"normal": "DTTT_button ui-button ui-state-default"
+	},
+	"collection": {
+		"container": "DTTT_collection ui-buttonset ui-buttonset-multi"
+	}
+};
+
+
+/**
+ * @namespace TableTools default settings for initialisation
+ */
+TableTools.DEFAULTS = {
+	"sSwfPath":        "../swf/copy_csv_xls_pdf.swf",
+	"sRowSelect":      "none",
+	"sRowSelector":    "tr",
+	"sSelectedClass":  null,
+	"fnPreRowSelect":  null,
+	"fnRowSelected":   null,
+	"fnRowDeselected": null,
+	"aButtons":        [ "copy", "csv", "xls", "pdf", "print" ],
+	"oTags": {
+		"container": "div",
+		"button": "a", // We really want to use buttons here, but Firefox and IE ignore the
+		                 // click on the Flash element in the button (but not mouse[in|out]).
+		"liner": "span",
+		"collection": {
+			"container": "div",
+			"button": "a",
+			"liner": "span"
+		}
+	}
+};
+
+// Alias to match the other plug-ins
+TableTools.defaults = TableTools.DEFAULTS;
+
+
+/**
+ * Name of this class
+ *  @constant CLASS
+ *  @type	 String
+ *  @default  TableTools
+ */
+TableTools.prototype.CLASS = "TableTools";
+
+
+/**
+ * TableTools version
+ *  @constant  VERSION
+ *  @type	  String
+ *  @default   See code
+ */
+TableTools.version = "2.2.1";
+
+
+
+// DataTables 1.10 API
+// 
+// This will be extended in a big way in in TableTools 3 to provide API methods
+// such as rows().select() and rows.selected() etc, but for the moment the
+// tabletools() method simply returns the instance.
+
+if ( $.fn.dataTable.Api ) {
+	$.fn.dataTable.Api.register( 'tabletools()', function () {
+		var tt = null;
+
+		if ( this.context.length > 0 ) {
+			tt = TableTools.fnGetInstance( this.context[0].nTable );
+		}
+
+		return tt;
+	} );
+}
+
+
+
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Initialisation
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+/*
+ * Register a new feature with DataTables
+ */
+if ( typeof $.fn.dataTable == "function" &&
+	 typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
+	 $.fn.dataTableExt.fnVersionCheck('1.9.0') )
+{
+	$.fn.dataTableExt.aoFeatures.push( {
+		"fnInit": function( oDTSettings ) {
+			var init = oDTSettings.oInit;
+			var opts = init ?
+				init.tableTools || init.oTableTools || {} :
+				{};
+
+			var oTT = new TableTools( oDTSettings.oInstance, opts );
+			TableTools._aInstances.push( oTT );
+
+			return oTT.dom.container;
+		},
+		"cFeature": "T",
+		"sFeature": "TableTools"
+	} );
+}
+else
+{
+	alert( "Warning: TableTools requires DataTables 1.9.0 or newer - www.datatables.net/download");
+}
+
+$.fn.DataTable.TableTools = TableTools;
+
+})(jQuery, window, document);
+
+/*
+ * Register a new feature with DataTables
+ */
+if ( typeof $.fn.dataTable == "function" &&
+	 typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
+	 $.fn.dataTableExt.fnVersionCheck('1.9.0') )
+{
+	$.fn.dataTableExt.aoFeatures.push( {
+		"fnInit": function( oDTSettings ) {
+			var oOpts = typeof oDTSettings.oInit.oTableTools != 'undefined' ?
+				oDTSettings.oInit.oTableTools : {};
+
+			var oTT = new TableTools( oDTSettings.oInstance, oOpts );
+			TableTools._aInstances.push( oTT );
+
+			return oTT.dom.container;
+		},
+		"cFeature": "T",
+		"sFeature": "TableTools"
+	} );
+}
+else
+{
+	alert( "Warning: TableTools 2 requires DataTables 1.9.0 or newer - www.datatables.net/download");
+}
+
+
+$.fn.dataTable.TableTools = TableTools;
+$.fn.DataTable.TableTools = TableTools;
+
+
+return TableTools;
+}; // /factory
+
+
+// Define as an AMD module if possible
+if ( typeof define === 'function' && define.amd ) {
+	define( 'datatables-tabletools', ['jquery', 'datatables'], factory );
+}
+else if ( jQuery && !jQuery.fn.dataTable.TableTools ) {
+	// Otherwise simply initialise as normal, stopping multiple evaluation
+	factory( jQuery, jQuery.fn.dataTable );
+}
+
+
+})(window, document);
+


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/asns/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/asns/index.js b/traffic_portal/app/src/modules/private/admin/asns/index.js
new file mode 100644
index 0000000..1fc954e
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/asns/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.admin.asns', [])
+    .controller('AsnsController', require('./AsnsController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.asns', {
+                url: '/asns',
+                abstract: true,
+                views: {
+                    adminContent: {
+                        templateUrl: 'modules/private/admin/asns/asns.tpl.html',
+                        controller: 'AsnsController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/asns/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/asns/list/index.js b/traffic_portal/app/src/modules/private/admin/asns/list/index.js
new file mode 100644
index 0000000..622f724
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/asns/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.asns.list', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.asns.list', {
+                url: '',
+                views: {
+                    asnsContent: {
+                        templateUrl: 'common/modules/table/asns/table.asns.tpl.html',
+                        controller: 'TableASNsController',
+                        resolve: {
+                            asns: function(asnService) {
+                                return asnService.getASNs();
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/asns/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/asns/new/index.js b/traffic_portal/app/src/modules/private/admin/asns/new/index.js
new file mode 100644
index 0000000..a78a7d2
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/asns/new/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.asns.new', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.asns.new', {
+                url: '/new',
+                views: {
+                    asnsContent: {
+                        templateUrl: 'common/modules/form/asn/form.asn.tpl.html',
+                        controller: 'FormNewASNController',
+                        resolve: {
+                            asn: function() {
+                                return {};
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/cdns/cdns.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/cdns/cdns.tpl.html b/traffic_portal/app/src/modules/private/admin/cdns/cdns.tpl.html
new file mode 100644
index 0000000..b4d6fe7
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/cdns/cdns.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="cdnsContainer">
+    <div ui-view="cdnsContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/cdns/config/ConfigController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/cdns/config/ConfigController.js b/traffic_portal/app/src/modules/private/admin/cdns/config/ConfigController.js
new file mode 100644
index 0000000..0615ea6
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/cdns/config/ConfigController.js
@@ -0,0 +1,212 @@
+/*
+ * 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 ConfigController = function(cdn, currentSnapshot, newSnapshot, $scope, $state, $timeout, $uibModal, locationUtils, cdnService) {
+
+	$scope.cdn = cdn;
+
+	var oldConfig = currentSnapshot.config || null,
+		newConfig = newSnapshot.config || null;
+
+	var oldContentRouters = currentSnapshot.contentRouters || null,
+		newContentRouters = newSnapshot.contentRouters || null;
+
+	var oldMonitors = currentSnapshot.monitors || null,
+		newMonitors = newSnapshot.monitors || null;
+
+	var oldContentServers = currentSnapshot.contentServers || null,
+		newContentServers = newSnapshot.contentServers || null;
+
+	var oldDeliveryServices = currentSnapshot.deliveryServices || null,
+		newDeliveryServices = newSnapshot.deliveryServices || null;
+
+	var oldEdgeLocations = currentSnapshot.edgeLocations || null,
+		newEdgeLocations = newSnapshot.edgeLocations || null;
+
+	var oldStats = currentSnapshot.stats || null,
+		newStats = newSnapshot.stats || null;
+
+	var performDiff = function(oldJSON, newJSON, destination) {
+		var div = null,
+			prepend = '',
+			added = 0,
+			removed = 0;
+
+		var display = document.getElementById(destination),
+			fragment = document.createDocumentFragment();
+
+		if (oldJSON) {
+			var diff = JsDiff.diffJson(oldJSON, newJSON);
+			diff.forEach(function(part){
+				if (part.added) {
+					added++;
+				} else if (part.removed) {
+					removed++;
+				}
+				prepend = part.added ? '++' : part.removed ? '--' : '';
+				div = document.createElement('div');
+				div.className = part.added ? 'added' : part.removed ? 'removed' : 'no-change';
+
+				div.appendChild(document.createTextNode(prepend + part.value));
+				fragment.appendChild(div);
+			});
+
+			$scope[destination + "Count"].added = added;
+			$scope[destination + "Count"].removed = removed;
+			display.innerHTML = '';
+			display.appendChild(fragment);
+		} else {
+			display.innerHTML = 'Diff failed. You may need to perform your first snapshot.';
+		}
+
+	};
+
+	var snapshot = function() {
+		cdnService.snapshot(cdn);
+	};
+
+	$scope.configCount = {
+		added: 0,
+		removed: 0,
+		templateUrl: 'configPopoverTemplate.html'
+	};
+
+	$scope.contentRoutersCount = {
+		added: 0,
+		removed: 0,
+		templateUrl: 'crPopoverTemplate.html'
+	};
+
+	$scope.monitorsCount = {
+		added: 0,
+		removed: 0,
+		templateUrl: 'mPopoverTemplate.html'
+	};
+
+	$scope.contentServersCount = {
+		added: 0,
+		removed: 0,
+		templateUrl: 'csPopoverTemplate.html'
+	};
+
+	$scope.deliveryServicesCount = {
+		added: 0,
+		removed: 0,
+		templateUrl: 'dsPopoverTemplate.html'
+	};
+
+	$scope.edgeLocationsCount = {
+		added: 0,
+		removed: 0,
+		templateUrl: 'elPopoverTemplate.html'
+	};
+
+	$scope.statsCount = {
+		added: 0,
+		removed: 0,
+		templateUrl: 'statsPopoverTemplate.html'
+	};
+
+	$scope.diffConfig = function(timeout) {
+		$('#config').html('<i class="fa fa-refresh fa-spin fa-1x fa-fw"></i> Generating diff...');
+		$timeout(function() {
+			performDiff(oldConfig, newConfig, 'config');
+		}, timeout);
+	};
+
+	$scope.diffContentRouters = function(timeout) {
+		$('#contentRouters').html('<i class="fa fa-refresh fa-spin fa-1x fa-fw"></i> Generating diff...');
+		$timeout(function() {
+			performDiff(oldContentRouters, newContentRouters, 'contentRouters');
+		}, timeout);
+	};
+
+	$scope.diffMonitors = function(timeout) {
+		$('#monitors').html('<i class="fa fa-refresh fa-spin fa-1x fa-fw"></i> Generating diff...');
+		$timeout(function() {
+			performDiff(oldMonitors, newMonitors, 'monitors');
+		}, timeout);
+	};
+
+	$scope.diffContentServers = function(timeout) {
+		$('#contentServers').html('<i class="fa fa-refresh fa-spin fa-1x fa-fw"></i> Generating diff...');
+		$timeout(function() {
+			performDiff(oldContentServers, newContentServers, 'contentServers');
+		}, timeout);
+	};
+
+	$scope.diffDeliveryServices = function(timeout) {
+		$('#deliveryServices').html('<i class="fa fa-refresh fa-spin fa-1x fa-fw"></i> Generating diff...');
+		$timeout(function() {
+			performDiff(oldDeliveryServices, newDeliveryServices, 'deliveryServices');
+		}, timeout);
+	};
+
+	$scope.diffEdgeLocations = function(timeout) {
+		$('#edgeLocations').html('<i class="fa fa-refresh fa-spin fa-1x fa-fw"></i> Generating diff...');
+		$timeout(function() {
+			performDiff(oldEdgeLocations, newEdgeLocations, 'edgeLocations');
+		}, timeout);
+	};
+
+	$scope.diffStats = function(timeout) {
+		$('#stats').html('<i class="fa fa-refresh fa-spin fa-1x fa-fw"></i> Generating diff...');
+		$timeout(function() {
+			performDiff(oldStats, newStats, 'stats');
+		}, timeout);
+	};
+
+	$scope.confirmSnapshot = function(cdn) {
+		var params = {
+			title: 'Perform Snapshot',
+			message: 'Are you sure you want to snapshot the ' + cdn.name + ' config?'
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html',
+			controller: 'DialogConfirmController',
+			size: 'sm',
+			resolve: {
+				params: function () {
+					return params;
+				}
+			}
+		});
+		modalInstance.result.then(function() {
+			snapshot();
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$scope.diffConfig(0);
+		$scope.diffContentRouters(0);
+		$scope.diffMonitors(0);
+		$scope.diffContentServers(0);
+		$scope.diffDeliveryServices(0);
+		$scope.diffEdgeLocations(0);
+		$scope.diffStats(0);
+	});
+
+};
+
+ConfigController.$inject = ['cdn', 'currentSnapshot', 'newSnapshot', '$scope', '$state', '$timeout', '$uibModal', 'locationUtils', 'cdnService'];
+module.exports = ConfigController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/cdns/config/_config.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/cdns/config/_config.scss b/traffic_portal/app/src/modules/private/admin/cdns/config/_config.scss
new file mode 100644
index 0000000..e75548e
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/cdns/config/_config.scss
@@ -0,0 +1,50 @@
+/*
+
+
+ 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.
+
+*/
+
+#snapshotContainer {
+
+  pre {
+    margin: 20px 0 20px 0;
+  }
+
+  .nav-tabs {
+    border-bottom: 1px solid #ddd;
+  }
+
+  .tab {
+    padding: 20px 20px 0 20px;
+  }
+
+  .tab-heading {
+    font-size: 17px;
+  }
+
+  .added {
+    background-color: #dff0d8;
+    color: #3c763d;
+  }
+
+  .removed {
+    background-color: #f2dede;
+    color: #a94442;
+  }
+
+  .no-change {
+    color: grey;
+  }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/cdns/config/config.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/cdns/config/config.tpl.html b/traffic_portal/app/src/modules/private/admin/cdns/config/config.tpl.html
new file mode 100644
index 0000000..75f26bb
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/cdns/config/config.tpl.html
@@ -0,0 +1,124 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/cdns')">CDNs</a></li>
+            <li><a ng-click="navigateToPath('/admin/cdns/' + cdn.id)">{{::cdn.name}}</a></li>
+            <li class="active">Config Changes</li>
+        </ol>
+        <div class="pull-right" ng-show="!settings.isNew">
+            <button type="button" class="btn btn-default" ng-click="navigateToPath('/admin/cdns/' + cdn.id)">Cancel</button>
+            <button class="btn btn-primary" title="Snapshot {{cdn.name}} Config" ng-click="confirmSnapshot(cdn)"><i class="fa fa-camera"></i>&nbsp;&nbsp;Perform Snapshot</button>
+        </div>
+
+        <div class="clearfix"></div>
+    </div>
+    <div id="snapshotContainer" class="x_content">
+        <uib-tabset active="active" justified="true">
+            <uib-tab index="0" class="tab" ng-click="diffConfig(500)">
+                <uib-tab-heading uib-popover-template="configCount.templateUrl" popover-title="{{configCount.added + configCount.removed}} Total Changes" popover-trigger="mouseenter" popover-placement="top" popover-append-to-body="true">
+                    General [ {{configCount.added}} | {{configCount.removed}} ]
+                </uib-tab-heading>
+                <pre id="config"></pre>
+            </uib-tab>
+            <uib-tab index="1" class="tab" ng-click="diffContentRouters(500)">
+                <uib-tab-heading uib-popover-template="contentRoutersCount.templateUrl" popover-title="{{contentRoutersCount.added + contentRoutersCount.removed}} Total Changes" popover-trigger="mouseenter" popover-placement="top" popover-append-to-body="true">
+                    Traffic Routers [ {{contentRoutersCount.added}} | {{contentRoutersCount.removed}} ]
+                </uib-tab-heading>
+                <pre id="contentRouters"></pre>
+            </uib-tab>
+            <uib-tab index="1" class="tab" ng-click="diffMonitors(500)">
+                <uib-tab-heading uib-popover-template="monitorsCount.templateUrl" popover-title="{{monitorsCount.added + monitorsCount.removed}} Total Changes" popover-trigger="mouseenter" popover-placement="top" popover-append-to-body="true">
+                    Traffic Monitors [ {{monitorsCount.added}} | {{monitorsCount.removed}} ]
+                </uib-tab-heading>
+                <pre id="monitors"></pre>
+            </uib-tab>
+            <uib-tab index="2" class="tab" ng-click="diffContentServers(500)">
+                <uib-tab-heading uib-popover-template="contentServersCount.templateUrl" popover-title="{{contentServersCount.added + contentServersCount.removed}} Total Changes" popover-trigger="mouseenter" popover-placement="top" popover-append-to-body="true">
+                    Traffic Servers [ {{contentServersCount.added}} | {{contentServersCount.removed}} ]
+                </uib-tab-heading>
+                <pre id="contentServers"></pre>
+            </uib-tab>
+            <uib-tab index="3" class="tab" ng-click="diffDeliveryServices(500)">
+                <uib-tab-heading uib-popover-template="deliveryServicesCount.templateUrl" popover-title="{{deliveryServicesCount.added + deliveryServicesCount.removed}} Total Changes" popover-trigger="mouseenter" popover-placement="top" popover-append-to-body="true">
+                    Delivery Services [ {{deliveryServicesCount.added}} | {{deliveryServicesCount.removed}} ]
+                </uib-tab-heading>
+                <pre id="deliveryServices"></pre>
+            </uib-tab>
+            <uib-tab index="4" class="tab" ng-click="diffEdgeLocations(500)">
+                <uib-tab-heading uib-popover-template="edgeLocationsCount.templateUrl" popover-title="{{edgeLocationsCount.added + edgeLocationsCount.removed}} Total Changes" popover-trigger="mouseenter" popover-placement="top" popover-append-to-body="true">
+                    Edge Cache Groups [ {{edgeLocationsCount.added}} | {{edgeLocationsCount.removed}} ]
+                </uib-tab-heading>
+                <pre id="edgeLocations"></pre>
+            </uib-tab>
+            <uib-tab index="5" class="tab" ng-click="diffStats(500)">
+                <uib-tab-heading uib-popover-template="statsCount.templateUrl" popover-title="{{statsCount.added + statsCount.removed}} Total Changes" popover-trigger="mouseenter" popover-placement="top" popover-append-to-body="true">
+                    Stats [ {{statsCount.added}} | {{statsCount.removed}} ]
+                </uib-tab-heading>
+                <pre id="stats"></pre>
+            </uib-tab>
+        </uib-tabset>
+        <div class="modal-footer">
+            <button type="button" class="btn btn-default" ng-click="navigateToPath('/admin/cdns/' + cdn.id)">Cancel</button>
+            <button class="btn btn-primary" title="Snapshot {{cdn.name}} Config" ng-click="confirmSnapshot(cdn)"><i class="fa fa-camera"></i>&nbsp;&nbsp;Perform Snapshot</button>
+        </div>
+    </div>
+</div>
+
+<!--- start: templates for popovers --->
+
+<script type="text/ng-template" id="configPopoverTemplate.html">
+    <div>{{configCount.added}} additions (++)</div>
+    <div>{{configCount.removed}} removals (--)</div>
+</script>
+
+<script type="text/ng-template" id="crPopoverTemplate.html">
+    <div>{{contentRoutersCount.added}} additions (++)</div>
+    <div>{{contentRoutersCount.removed}} removals (--)</div>
+</script>
+
+<script type="text/ng-template" id="mPopoverTemplate.html">
+    <div>{{monitorsCount.added}} additions (++)</div>
+    <div>{{monitorsCount.removed}} removals (--)</div>
+</script>
+
+<script type="text/ng-template" id="csPopoverTemplate.html">
+    <div>{{contentServersCount.added}} additions (++)</div>
+    <div>{{contentServersCount.removed}} removals (--)</div>
+</script>
+
+<script type="text/ng-template" id="dsPopoverTemplate.html">
+    <div>{{deliveryServicesCount.added}} additions (++)</div>
+    <div>{{deliveryServicesCount.removed}} removals (--)</div>
+</script>
+
+<script type="text/ng-template" id="elPopoverTemplate.html">
+    <div>{{edgeLocationsCount.added}} additions (++)</div>
+    <div>{{edgeLocationsCount.removed}} removals (--)</div>
+</script>
+
+<script type="text/ng-template" id="statsPopoverTemplate.html">
+    <div>{{statsCount.added}} additions (++)</div>
+    <div>{{statsCount.removed}} removals (--)</div>
+</script>
+
+<!--- end: templates for popovers --->
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/cdns/config/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/cdns/config/index.js b/traffic_portal/app/src/modules/private/admin/cdns/config/index.js
new file mode 100644
index 0000000..fa920ef
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/cdns/config/index.js
@@ -0,0 +1,46 @@
+/*
+ * 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.admin.cdns.config', [])
+	.controller('ConfigController', require('./ConfigController'))
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.cdns.config', {
+				url: '/{cdnId}/config/changes',
+				views: {
+					cdnsContent: {
+						templateUrl: 'modules/private/admin/cdns/config/config.tpl.html',
+						controller: 'ConfigController',
+						resolve: {
+							cdn: function($stateParams, cdnService) {
+								return cdnService.getCDN($stateParams.cdnId);
+							},
+							currentSnapshot: function(cdn, cdnService) {
+								return cdnService.getCurrentSnapshot(cdn.name);
+							},
+							newSnapshot: function(cdn, cdnService) {
+								return cdnService.getNewSnapshot(cdn.name);
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/cdns/deliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/cdns/deliveryServices/index.js b/traffic_portal/app/src/modules/private/admin/cdns/deliveryServices/index.js
new file mode 100644
index 0000000..eb15fe0
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/cdns/deliveryServices/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.cdns.deliveryServices', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.cdns.deliveryServices', {
+				url: '/{cdnId}/delivery-services',
+				views: {
+					cdnsContent: {
+						templateUrl: 'common/modules/table/cdnDeliveryServices/table.cdnDeliveryServices.tpl.html',
+						controller: 'TableCDNDeliveryServicesController',
+						resolve: {
+							cdn: function($stateParams, cdnService) {
+								return cdnService.getCDN($stateParams.cdnId);
+							},
+							deliveryServices: function($stateParams, deliveryServiceService) {
+								return deliveryServiceService.getDeliveryServices({ cdn: $stateParams.cdnId });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/cdns/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/cdns/edit/index.js b/traffic_portal/app/src/modules/private/admin/cdns/edit/index.js
new file mode 100644
index 0000000..5f61713
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/cdns/edit/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.cdns.edit', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.cdns.edit', {
+                url: '/{cdnId:[0-9]{1,8}}',
+                views: {
+                    cdnsContent: {
+                        templateUrl: 'common/modules/form/cdn/form.cdn.tpl.html',
+                        controller: 'FormEditCDNController',
+                        resolve: {
+                            cdn: function($stateParams, cdnService) {
+                                return cdnService.getCDN($stateParams.cdnId);
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/cdns/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/cdns/index.js b/traffic_portal/app/src/modules/private/admin/cdns/index.js
new file mode 100644
index 0000000..5743625
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/cdns/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.admin.cdns', [])
+    .controller('CdnsController', require('./CdnsController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.cdns', {
+                url: '/cdns',
+                abstract: true,
+                views: {
+                    adminContent: {
+                        templateUrl: 'modules/private/admin/cdns/cdns.tpl.html',
+                        controller: 'CdnsController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/cdns/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/cdns/list/index.js b/traffic_portal/app/src/modules/private/admin/cdns/list/index.js
new file mode 100644
index 0000000..168608c
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/cdns/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.cdns.list', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.cdns.list', {
+                url: '',
+                views: {
+                    cdnsContent: {
+                        templateUrl: 'common/modules/table/cdns/table.cdns.tpl.html',
+                        controller: 'TableCDNsController',
+                        resolve: {
+                            cdns: function(cdnService) {
+                                return cdnService.getCDNs(true);
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/cdns/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/cdns/new/index.js b/traffic_portal/app/src/modules/private/admin/cdns/new/index.js
new file mode 100644
index 0000000..506c420
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/cdns/new/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.cdns.new', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.cdns.new', {
+                url: '/new',
+                views: {
+                    cdnsContent: {
+                        templateUrl: 'common/modules/form/cdn/form.cdn.tpl.html',
+                        controller: 'FormNewCDNController',
+                        resolve: {
+                            cdn: function() {
+                                return {
+                                    dnssecEnabled: false
+                                };
+
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/cdns/profiles/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/cdns/profiles/index.js b/traffic_portal/app/src/modules/private/admin/cdns/profiles/index.js
new file mode 100644
index 0000000..a74fa69
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/cdns/profiles/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.cdns.profiles', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.cdns.profiles', {
+				url: '/{cdnId}/profiles',
+				views: {
+					cdnsContent: {
+						templateUrl: 'common/modules/table/cdnProfiles/table.cdnProfiles.tpl.html',
+						controller: 'TableCDNProfilesController',
+						resolve: {
+							cdn: function($stateParams, cdnService) {
+								return cdnService.getCDN($stateParams.cdnId);
+							},
+							profiles: function($stateParams, profileService) {
+								return profileService.getProfiles({ cdn: $stateParams.cdnId });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/cdns/servers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/cdns/servers/index.js b/traffic_portal/app/src/modules/private/admin/cdns/servers/index.js
new file mode 100644
index 0000000..0af8c42
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/cdns/servers/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.cdns.servers', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.cdns.servers', {
+				url: '/{cdnId}/servers',
+				views: {
+					cdnsContent: {
+						templateUrl: 'common/modules/table/cdnServers/table.cdnServers.tpl.html',
+						controller: 'TableCDNServersController',
+						resolve: {
+							cdn: function($stateParams, cdnService) {
+								return cdnService.getCDN($stateParams.cdnId);
+							},
+							servers: function($stateParams, serverService) {
+								return serverService.getServers({ cdn: $stateParams.cdnId });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/changeLogs/changeLogs.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/changeLogs/changeLogs.tpl.html b/traffic_portal/app/src/modules/private/admin/changeLogs/changeLogs.tpl.html
new file mode 100644
index 0000000..0837cb4
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/changeLogs/changeLogs.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="changeLogsContainer">
+    <div ui-view="changeLogsContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/changeLogs/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/changeLogs/index.js b/traffic_portal/app/src/modules/private/admin/changeLogs/index.js
new file mode 100644
index 0000000..05fedcc
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/changeLogs/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.admin.changeLogs', [])
+	.controller('ChangeLogsController', require('./ChangeLogsController'))
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.changeLogs', {
+				url: '/change-logs',
+				abstract: true,
+				views: {
+					adminContent: {
+						templateUrl: 'modules/private/admin/changeLogs/changeLogs.tpl.html',
+						controller: 'ChangeLogsController'
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/changeLogs/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/changeLogs/list/index.js b/traffic_portal/app/src/modules/private/admin/changeLogs/list/index.js
new file mode 100644
index 0000000..7f4f330
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/changeLogs/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.changeLogs.list', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.changeLogs.list', {
+				url: '',
+				views: {
+					changeLogsContent: {
+						templateUrl: 'common/modules/table/changeLogs/table.changeLogs.tpl.html',
+						controller: 'TableChangeLogsController',
+						resolve: {
+							changeLogs: function(changeLogService) {
+								return changeLogService.getChangeLogs({ days: 3 });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/divisions/_divisions.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/divisions/_divisions.scss b/traffic_portal/app/src/modules/private/admin/divisions/_divisions.scss
new file mode 100644
index 0000000..d57b9c6
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/divisions/_divisions.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/admin/divisions/divisions.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/divisions/divisions.tpl.html b/traffic_portal/app/src/modules/private/admin/divisions/divisions.tpl.html
new file mode 100644
index 0000000..8c8d7e4
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/divisions/divisions.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="divisionsContainer">
+    <div ui-view="divisionsContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/divisions/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/divisions/edit/index.js b/traffic_portal/app/src/modules/private/admin/divisions/edit/index.js
new file mode 100644
index 0000000..91b2241
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/divisions/edit/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.divisions.edit', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.divisions.edit', {
+                url: '/{divisionId:[0-9]{1,8}}',
+                views: {
+                    divisionsContent: {
+                        templateUrl: 'common/modules/form/division/form.division.tpl.html',
+                        controller: 'FormEditDivisionController',
+                        resolve: {
+                            division: function($stateParams, divisionService) {
+                                return divisionService.getDivision($stateParams.divisionId);
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/divisions/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/divisions/index.js b/traffic_portal/app/src/modules/private/admin/divisions/index.js
new file mode 100644
index 0000000..1d7635b
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/divisions/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.admin.divisions', [])
+    .controller('DivisionsController', require('./DivisionsController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.divisions', {
+                url: '/divisions',
+                abstract: true,
+                views: {
+                    adminContent: {
+                        templateUrl: 'modules/private/admin/divisions/divisions.tpl.html',
+                        controller: 'DivisionsController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/divisions/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/divisions/list/index.js b/traffic_portal/app/src/modules/private/admin/divisions/list/index.js
new file mode 100644
index 0000000..df27925
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/divisions/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.divisions.list', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.divisions.list', {
+                url: '',
+                views: {
+                    divisionsContent: {
+                        templateUrl: 'common/modules/table/divisions/table.divisions.tpl.html',
+                        controller: 'TableDivisionsController',
+                        resolve: {
+                            divisions: function(divisionService) {
+                                return divisionService.getDivisions();
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/divisions/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/divisions/new/index.js b/traffic_portal/app/src/modules/private/admin/divisions/new/index.js
new file mode 100644
index 0000000..4ff5d64
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/divisions/new/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.divisions.new', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.divisions.new', {
+                url: '/new',
+                views: {
+                    divisionsContent: {
+                        templateUrl: 'common/modules/form/division/form.division.tpl.html',
+                        controller: 'FormNewDivisionController',
+                        resolve: {
+                            division: function() {
+                                return {};
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/divisions/regions/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/divisions/regions/index.js b/traffic_portal/app/src/modules/private/admin/divisions/regions/index.js
new file mode 100644
index 0000000..054885d
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/divisions/regions/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.divisions.regions', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.divisions.regions', {
+				url: '/{divisionId}/regions',
+				views: {
+					divisionsContent: {
+						templateUrl: 'common/modules/table/divisionRegions/table.divisionRegions.tpl.html',
+						controller: 'TableDivisionRegionsController',
+						resolve: {
+							division: function($stateParams, divisionService) {
+								return divisionService.getDivision($stateParams.divisionId);
+							},
+							divisionRegions: function($stateParams, regionService) {
+								return regionService.getRegions({ division: $stateParams.divisionId });
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/index.js b/traffic_portal/app/src/modules/private/admin/index.js
new file mode 100644
index 0000000..3ab0f5e
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/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.admin', [])
+    .controller('AdminController', require('./AdminController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin', {
+                url: 'admin',
+                abstract: true,
+                views: {
+                    privateContent: {
+                        templateUrl: 'modules/private/admin/admin.tpl.html',
+                        controller: 'AdminController'
+                    }
+                }
+            });
+        $urlRouterProvider.otherwise('/');
+    });

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/jobs/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/jobs/index.js b/traffic_portal/app/src/modules/private/admin/jobs/index.js
new file mode 100644
index 0000000..6a3b18e
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/jobs/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.admin.jobs', [])
+	.controller('JobsController', require('./JobsController'))
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.jobs', {
+				url: '/jobs',
+				abstract: true,
+				views: {
+					adminContent: {
+						templateUrl: 'modules/private/admin/jobs/jobs.tpl.html',
+						controller: 'JobsController'
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/jobs/jobs.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/jobs/jobs.tpl.html b/traffic_portal/app/src/modules/private/admin/jobs/jobs.tpl.html
new file mode 100644
index 0000000..3597900
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/jobs/jobs.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="jobsContainer">
+    <div ui-view="jobsContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/jobs/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/jobs/list/index.js b/traffic_portal/app/src/modules/private/admin/jobs/list/index.js
new file mode 100644
index 0000000..78447ed
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/jobs/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.jobs.list', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.jobs.list', {
+				url: '',
+				views: {
+					jobsContent: {
+						templateUrl: 'common/modules/table/jobs/table.jobs.tpl.html',
+						controller: 'TableJobsController',
+						resolve: {
+							jobs: function(jobService) {
+								return jobService.getJobs();
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/jobs/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/jobs/new/index.js b/traffic_portal/app/src/modules/private/admin/jobs/new/index.js
new file mode 100644
index 0000000..cad6672
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/jobs/new/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.jobs.new', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.jobs.new', {
+				url: '/new',
+				views: {
+					jobsContent: {
+						templateUrl: 'common/modules/form/job/form.job.tpl.html',
+						controller: 'FormNewJobController',
+						resolve: {
+							job: function() {
+								return { startTime: moment().format('YYYY-MM-DD HH:mm:ss') };
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/parameters/cacheGroups/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/parameters/cacheGroups/index.js b/traffic_portal/app/src/modules/private/admin/parameters/cacheGroups/index.js
new file mode 100644
index 0000000..d8eb784
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/parameters/cacheGroups/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.admin.parameters.cacheGroups', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.admin.parameters.cacheGroups', {
+				url: '/{parameterId}/cache-groups',
+				views: {
+					parametersContent: {
+						templateUrl: 'common/modules/table/parameterCacheGroups/table.parameterCacheGroups.tpl.html',
+						controller: 'TableParameterCacheGroupsController',
+						resolve: {
+							parameter: function($stateParams, parameterService) {
+								return parameterService.getParameter($stateParams.parameterId);
+							},
+							cacheGroups: function($stateParams, cacheGroupService) {
+								return cacheGroupService.getParameterCacheGroups($stateParams.parameterId);
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/parameters/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/parameters/edit/index.js b/traffic_portal/app/src/modules/private/admin/parameters/edit/index.js
new file mode 100644
index 0000000..e891bc9
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/parameters/edit/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.parameters.edit', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.parameters.edit', {
+                url: '/{parameterId:[0-9]{1,8}}',
+                views: {
+                    parametersContent: {
+                        templateUrl: 'common/modules/form/parameter/form.parameter.tpl.html',
+                        controller: 'FormEditParameterController',
+                        resolve: {
+                            parameter: function($stateParams, parameterService) {
+                                return parameterService.getParameter($stateParams.parameterId);
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/parameters/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/parameters/index.js b/traffic_portal/app/src/modules/private/admin/parameters/index.js
new file mode 100644
index 0000000..2542c80
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/parameters/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.admin.parameters', [])
+    .controller('ParametersController', require('./ParametersController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.parameters', {
+                url: '/parameters',
+                abstract: true,
+                views: {
+                    adminContent: {
+                        templateUrl: 'modules/private/admin/parameters/parameters.tpl.html',
+                        controller: 'ParametersController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/parameters/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/parameters/list/index.js b/traffic_portal/app/src/modules/private/admin/parameters/list/index.js
new file mode 100644
index 0000000..c0730f1
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/parameters/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.parameters.list', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.parameters.list', {
+                url: '',
+                views: {
+                    parametersContent: {
+                        templateUrl: 'common/modules/table/parameters/table.parameters.tpl.html',
+                        controller: 'TableParametersController',
+                        resolve: {
+                            parameters: function(parameterService) {
+                                return parameterService.getParameters();
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/parameters/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/parameters/new/index.js b/traffic_portal/app/src/modules/private/admin/parameters/new/index.js
new file mode 100644
index 0000000..4f46616
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/parameters/new/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.admin.parameters.new', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.admin.parameters.new', {
+                url: '/new',
+                views: {
+                    parametersContent: {
+                        templateUrl: 'common/modules/form/parameter/form.parameter.tpl.html',
+                        controller: 'FormNewParameterController',
+                        resolve: {
+                            parameter: function() {
+                                return {};
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/admin/parameters/parameters.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/admin/parameters/parameters.tpl.html b/traffic_portal/app/src/modules/private/admin/parameters/parameters.tpl.html
new file mode 100644
index 0000000..2ec147c
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/admin/parameters/parameters.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="parametersContainer">
+    <div ui-view="parametersContent"></div>
+</div>



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/server/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/server/edit/index.js b/traffic_portal/app/src/common/modules/form/server/edit/index.js
new file mode 100644
index 0000000..aff7a84
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/server/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.server.edit', [])
+    .controller('FormEditServerController', require('./FormEditServerController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/server/form.server.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/server/form.server.tpl.html b/traffic_portal/app/src/common/modules/form/server/form.server.tpl.html
new file mode 100644
index 0000000..2bc9dd2
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/server/form.server.tpl.html
@@ -0,0 +1,336 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/servers')">Servers</a></li>
+            <li class="active">{{serverName}}</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-primary" ng-click="confirmStatusUpdate()">Update Status</button>
+            <!--<button class="btn btn-success" ng-click="onlineServer()">Online Server</button>-->
+            <button class="btn btn-primary" title="Queue Server Updates" ng-show="!server.updPending" ng-click="queueServerUpdates(server)"><i class="fa fa-flag"></i></button>
+            <button class="btn btn-primary" title="Clear Server Updates" ng-show="server.updPending" ng-click="clearServerUpdates(server)"><i class="fa fa-ban"></i></button>
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li ng-show="!server.updPending"><a ng-click="queueServerUpdates(server)">Queue Server Updates</a></li>
+                    <li ng-show="server.updPending"><a ng-click="clearServerUpdates(server)">Clear Server Updates</a></li>
+                    <li class="divider"></li>
+                    <li><a ng-click="confirmStatusUpdate()">Update Status</a></li>
+                    <li class="divider"></li>
+                    <li><a ng-click="viewDeliveryServices()">View Delivery Services</a></li>
+                    <li><a ng-click="viewConfig()">View Config Files</a></li>
+                </ul>
+            </div>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="serverForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.status), 'has-feedback': hasError(serverForm.status)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Status *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="status" name="status" class="form-control" ng-model="server.statusId" ng-options="status.id as status.name for status in statuses" ng-disabled="true"></select>
+                </div>
+            </div>
+            <div class="form-group" ng-show="server.offlineReason.length > 0">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Offline Reason</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="offlineReason" name="offlineReason" type="text" class="form-control" ng-model="server.offlineReason" ng-maxlength="256" ng-readonly="true">
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.updPending), 'has-feedback': hasError(serverForm.updPending)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Update Pending *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="updPending" name="updPending" type="text" class="form-control" ng-model="server.updPending" ng-disabled="true">
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.hostName), 'has-feedback': hasError(serverForm.hostName)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Hostname *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="hostName" name="hostName" type="text" class="form-control" ng-model="server.hostName" ng-required="true" ng-maxlength="45" ng-pattern="/^\S*$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.hostName, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.hostName, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.hostName, 'pattern')">No Spaces</small>
+                    <span ng-show="hasError(serverForm.hostName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.domainName), 'has-feedback': hasError(serverForm.domainName)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Domain name *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="domainName" name="domainName" type="text" class="form-control" ng-model="server.domainName" ng-required="true" ng-maxlength="45" ng-pattern="/^\S*$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.domainName, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.domainName, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.domainName, 'pattern')">No Spaces</small>
+                    <span ng-show="hasError(serverForm.domainName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.tcpPort), 'has-feedback': hasError(serverForm.tcpPort)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">TCP Port</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="tcpPort" name="tcpPort" type="text" class="form-control" ng-model="server.tcpPort" ng-maxlength="10" ng-pattern="/^\d+$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.tcpPort, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.tcpPort, 'pattern')">Number</small>
+                    <span ng-show="hasError(serverForm.tcpPort)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.xmppId), 'has-feedback': hasError(serverForm.xmppId)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">XMPP ID</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="xmppId" name="xmppId" type="text" class="form-control" ng-model="server.xmppId" ng-maxlength="256" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.xmppId, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(serverForm.xmppId)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.xmppPasswd), 'has-feedback': hasError(serverForm.xmppPasswd)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">XMPP Password</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="xmppPasswd" name="xmppPasswd" type="text" class="form-control" ng-model="server.xmppPasswd" ng-maxlength="45" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.xmppPasswd, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(serverForm.xmppPasswd)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.interfaceName), 'has-feedback': hasError(serverForm.interfaceName)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Interface Name *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="interfaceName" name="interfaceName" type="text" class="form-control" ng-model="server.interfaceName" ng-required="true" ng-maxlength="45" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.interfaceName, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.interfaceName, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(serverForm.interfaceName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.ipAddress), 'has-feedback': hasError(serverForm.ipAddress)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">IP Address *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="ipAddress" name="ipAddress" type="text" class="form-control" ng-model="server.ipAddress" ng-required="true" ng-maxlength="45" ng-pattern="ipRegex()" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipAddress, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipAddress, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipAddress, 'pattern')">Invalid</small>
+                    <span ng-show="hasError(serverForm.ipAddress)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.ipNetmask), 'has-feedback': hasError(serverForm.ipNetmask)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">IP Netmask *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="ipNetmask" name="ipNetmask" type="text" class="form-control" ng-model="server.ipNetmask" ng-required="true" ng-maxlength="45" ng-pattern="validations.ipRegex" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipNetmask, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipNetmask, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipNetmask, 'pattern')">Invalid</small>
+                    <span ng-show="hasError(serverForm.ipNetmask)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.ipGateway), 'has-feedback': hasError(serverForm.ipGateway)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">IP Gateway *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="ipGateway" name="ipGateway" type="text" class="form-control" ng-model="server.ipGateway" ng-required="true" ng-maxlength="45" ng-pattern="ipRegex()" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipGateway, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipGateway, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipGateway, 'pattern')">Invalid</small>
+                    <span ng-show="hasError(serverForm.ipGateway)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.ip6Address), 'has-feedback': hasError(serverForm.ip6Address)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">IPv6 Address</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="ip6Address" name="ip6Address" type="text" class="form-control" ng-model="server.ip6Address" ng-maxlength="50" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.ip6Address, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(serverForm.ip6Address)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.ip6Gateway), 'has-feedback': hasError(serverForm.ip6Gateway)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">IPv6 Gateway</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="ip6Gateway" name="ip6Gateway" type="text" class="form-control" ng-model="server.ip6Gateway" ng-maxlength="50" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.ip6Gateway, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(serverForm.ip6Gateway)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.interfaceMtu), 'has-feedback': hasError(serverForm.interfaceMtu)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Interface MTU *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="interfaceMtu" name="interfaceMtu" type="text" class="form-control" ng-model="server.interfaceMtu" ng-required="true" ng-maxlength="11" ng-pattern="/(^1500$|^9000$)/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.interfaceMtu, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.interfaceMtu, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.interfaceMtu, 'pattern')">1500 or 9000</small>
+                    <span ng-show="hasError(serverForm.interfaceMtu)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.rack), 'has-feedback': hasError(serverForm.rack)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Rack</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="rack" name="rack" type="text" class="form-control" ng-model="server.rack" ng-maxlength="64" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.rack, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(serverForm.rack)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.mgmtIpAddress), 'has-feedback': hasError(serverForm.mgmtIpAddress)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Management IP Address</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="mgmtIpAddress" name="mgmtIpAddress" type="text" class="form-control" ng-model="server.mgmtIpAddress" ng-maxlength="50" ng-pattern="ipRegex()" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.mgmtIpAddress, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.mgmtIpAddress, 'pattern')">Invalid</small>
+                    <span ng-show="hasError(serverForm.mgmtIpAddress)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.mgmtIpNetmask), 'has-feedback': hasError(serverForm.mgmtIpNetmask)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Management IP Netmask</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="mgmtIpNetmask" name="mgmtIpNetmask" type="text" class="form-control" ng-model="server.mgmtIpNetmask" ng-maxlength="45" ng-pattern="ipRegex()" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.mgmtIpNetmask, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.mgmtIpNetmask, 'pattern')">Invalid</small>
+                    <span ng-show="hasError(serverForm.mgmtIpNetmask)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.mgmtIpGateway), 'has-feedback': hasError(serverForm.mgmtIpGateway)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Management IP Gateway</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="mgmtIpGateway" name="mgmtIpGateway" type="text" class="form-control" ng-model="server.mgmtIpGateway" ng-maxlength="45" ng-pattern="ipRegex()" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.mgmtIpGateway, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.mgmtIpGateway, 'pattern')">Invalid</small>
+                    <span ng-show="hasError(serverForm.mgmtIpGateway)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.iloIpAddress), 'has-feedback': hasError(serverForm.iloIpAddress)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">ILO IP Address</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="iloIpAddress" name="iloIpAddress" type="text" class="form-control" ng-model="server.iloIpAddress" ng-maxlength="45" ng-pattern="ipRegex()" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloIpAddress, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloIpAddress, 'pattern')">Invalid</small>
+                    <span ng-show="hasError(serverForm.iloIpAddress)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.iloIpNetmask), 'has-feedback': hasError(serverForm.iloIpNetmask)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">ILO IP Netmask</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="iloIpNetmask" name="iloIpNetmask" type="text" class="form-control" ng-model="server.iloIpNetmask" ng-maxlength="45" ng-pattern="ipRegex()" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloIpNetmask, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloIpNetmask, 'pattern')">Invalid</small>
+                    <span ng-show="hasError(serverForm.iloIpNetmask)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.iloIpGateway), 'has-feedback': hasError(serverForm.iloIpGateway)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">ILO IP Gateway</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="iloIpGateway" name="iloIpGateway" type="text" class="form-control" ng-model="server.iloIpGateway" ng-maxlength="45" ng-pattern="ipRegex()" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloIpGateway, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloIpGateway, 'pattern')">Invalid</small>
+                    <span ng-show="hasError(serverForm.iloIpGateway)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.iloUsername), 'has-feedback': hasError(serverForm.iloUsername)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">ILO Username</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="iloUsername" name="iloUsername" type="text" class="form-control" ng-model="server.iloUsername" ng-maxlength="45" ng-pattern="/^\S*$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloUsername, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloUsername, 'pattern')">No Spaces</small>
+                    <span ng-show="hasError(serverForm.iloUsername)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.iloPassword), 'has-feedback': hasError(serverForm.iloPassword)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">ILO Password</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="iloPassword" name="iloPassword" type="text" class="form-control" ng-model="server.iloPassword" ng-maxlength="45" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloPassword, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(serverForm.iloPassword)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.routerHostName), 'has-feedback': hasError(serverForm.routerHostName)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Router Hostname</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="routerHostName" name="routerHostName" type="text" class="form-control" ng-model="server.routerHostName" ng-maxlength="256" ng-pattern="/^\S*$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.routerHostName, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.routerHostName, 'pattern')">No Spaces</small>
+                    <span ng-show="hasError(serverForm.routerHostName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.routerPortName), 'has-feedback': hasError(serverForm.routerPortName)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Router Port Name</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="routerPortName" name="routerPortName" type="text" class="form-control" ng-model="server.routerPortName" ng-maxlength="256" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.routerPortName, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(serverForm.routerPortName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.httpsPort), 'has-feedback': hasError(serverForm.httpsPort)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">HTTPS Port</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="httpsPort" name="httpsPort" type="text" class="form-control" ng-model="server.httpsPort" ng-maxlength="10" ng-pattern="/^\d+$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.httpsPort, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.httpsPort, 'pattern')">Number</small>
+                    <span ng-show="hasError(serverForm.httpsPort)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.cdn), 'has-feedback': hasError(serverForm.cdn)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="cdn" name="cdn" class="form-control" ng-model="server.cdnId" ng-options="cdn.id as cdn.name for cdn in cdns" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.cdn, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.physLocation), 'has-feedback': hasError(serverForm.physLocation)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Phys Location *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="physLocation" name="physLocation" class="form-control" ng-model="server.physLocationId" ng-options="physLocation.id as physLocation.name for physLocation in physLocations" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.physLocation, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.cachegroup), 'has-feedback': hasError(serverForm.cachegroup)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Cache Group *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="cachegroup" name="cachegroup" class="form-control" ng-model="server.cachegroupId" ng-options="cachegroup.id as cachegroup.name for cachegroup in cacheGroups" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.cachegroup, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.type), 'has-feedback': hasError(serverForm.type)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Type *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="type" name="type" class="form-control" ng-model="server.typeId" ng-options="type.id as type.name for type in types" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.type, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(serverForm.profile), 'has-feedback': hasError(serverForm.profile)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Profile *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="profile" name="profile" class="form-control" ng-model="server.profileId" ng-options="profile.id as profile.name for profile in profiles" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(serverForm.profile, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(server)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="serverForm.$pristine || serverForm.$invalid" ng-click="save(server)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/server/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/server/index.js b/traffic_portal/app/src/common/modules/form/server/index.js
new file mode 100644
index 0000000..95bea58
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/server/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.server', [])
+    .controller('FormServerController', require('./FormServerController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/server/new/FormNewServerController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/server/new/FormNewServerController.js b/traffic_portal/app/src/common/modules/form/server/new/FormNewServerController.js
new file mode 100644
index 0000000..744f588
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/server/new/FormNewServerController.js
@@ -0,0 +1,39 @@
+/*
+ * 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 FormNewServerController = function(server, $scope, $controller, serverService) {
+
+    // extends the FormServerController to inherit common methods
+    angular.extend(this, $controller('FormServerController', { server: server, $scope: $scope }));
+
+    $scope.serverName = 'New';
+
+    $scope.settings = {
+        isNew: true,
+        saveLabel: 'Create'
+    };
+
+    $scope.save = function(server) {
+        serverService.createServer(server);
+    };
+
+};
+
+FormNewServerController.$inject = ['server', '$scope', '$controller', 'serverService'];
+module.exports = FormNewServerController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/server/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/server/new/index.js b/traffic_portal/app/src/common/modules/form/server/new/index.js
new file mode 100644
index 0000000..ff3487b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/server/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.server.new', [])
+    .controller('FormNewServerController', require('./FormNewServerController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/status/FormStatusController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/status/FormStatusController.js b/traffic_portal/app/src/common/modules/form/status/FormStatusController.js
new file mode 100644
index 0000000..fd015db
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/status/FormStatusController.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.
+ */
+
+var FormStatusController = function(status, $scope, $location, formUtils, stringUtils, locationUtils) {
+
+    $scope.status = status;
+
+    $scope.props = [
+        { name: 'name', type: 'text', required: true, maxLength: 45 }
+    ];
+
+    $scope.viewServers = function() {
+        $location.path($location.path() + '/servers');
+    };
+
+    $scope.labelize = stringUtils.labelize;
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
+    $scope.hasError = formUtils.hasError;
+
+    $scope.hasPropertyError = formUtils.hasPropertyError;
+
+};
+
+FormStatusController.$inject = ['status', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils'];
+module.exports = FormStatusController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/status/edit/FormEditStatusController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/status/edit/FormEditStatusController.js b/traffic_portal/app/src/common/modules/form/status/edit/FormEditStatusController.js
new file mode 100644
index 0000000..ff940be
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/status/edit/FormEditStatusController.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.
+ */
+
+var FormEditStatusController = function(status, $scope, $controller, $uibModal, $anchorScroll, locationUtils, statusService) {
+
+    // extends the FormStatusController to inherit common methods
+    angular.extend(this, $controller('FormStatusController', { status: status, $scope: $scope }));
+
+    var deleteStatus = function(status) {
+        statusService.deleteStatus(status.id)
+            .then(function() {
+                locationUtils.navigateToPath('/admin/statuses');
+            });
+    };
+
+    $scope.statusName = angular.copy(status.name);
+
+    $scope.settings = {
+        isNew: false,
+        saveLabel: 'Update'
+    };
+
+    $scope.save = function(status) {
+        statusService.updateStatus(status).
+            then(function() {
+                $scope.statusName = angular.copy(status.name);
+                $anchorScroll(); // scrolls window to top
+            });
+    };
+
+    $scope.confirmDelete = function(status) {
+        var params = {
+            title: 'Delete Status: ' + status.name,
+            key: status.name
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+            controller: 'DialogDeleteController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                }
+            }
+        });
+        modalInstance.result.then(function() {
+            deleteStatus(status);
+        }, function () {
+            // do nothing
+        });
+    };
+
+};
+
+FormEditStatusController.$inject = ['status', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'statusService'];
+module.exports = FormEditStatusController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/status/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/status/edit/index.js b/traffic_portal/app/src/common/modules/form/status/edit/index.js
new file mode 100644
index 0000000..55520d3
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/status/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.status.edit', [])
+    .controller('FormEditStatusController', require('./FormEditStatusController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/status/form.status.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/status/form.status.tpl.html b/traffic_portal/app/src/common/modules/form/status/form.status.tpl.html
new file mode 100644
index 0000000..d8733d7
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/status/form.status.tpl.html
@@ -0,0 +1,55 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/statuses')">Statuses</a></li>
+            <li class="active">{{statusName}}</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-primary" title="View Servers" ng-click="viewServers()">View Servers</button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="statusForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(statusForm[prop.name]), 'has-feedback': hasError(statusForm[prop.name])}" ng-repeat="prop in props">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">{{labelize(prop.name)}} <span ng-show="prop.required">*</span></label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="{{prop.name}}" name="{{prop.name}}" type="{{prop.type}}" class="form-control" ng-model="status[prop.name]" ng-readonly="prop.readonly" ng-required="prop.required" ng-maxlength="prop.maxLength" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(statusForm[prop.name], 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(statusForm[prop.name], 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(statusForm[prop.name])" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Description</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <textarea id="description" name="description" rows="3" cols="17" class="form-control" ng-model="status.description" maxlength="256"></textarea>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(status)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="statusForm.$pristine || statusForm.$invalid" ng-click="save(status)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/status/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/status/index.js b/traffic_portal/app/src/common/modules/form/status/index.js
new file mode 100644
index 0000000..87173fb
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/status/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.status', [])
+    .controller('FormStatusController', require('./FormStatusController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/status/new/FormNewStatusController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/status/new/FormNewStatusController.js b/traffic_portal/app/src/common/modules/form/status/new/FormNewStatusController.js
new file mode 100644
index 0000000..9ea4c87
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/status/new/FormNewStatusController.js
@@ -0,0 +1,39 @@
+/*
+ * 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 FormNewStatusController = function(status, $scope, $controller, statusService) {
+
+    // extends the FormStatusController to inherit common methods
+    angular.extend(this, $controller('FormStatusController', { status: status, $scope: $scope }));
+
+    $scope.statusName = 'New';
+
+    $scope.settings = {
+        isNew: true,
+        saveLabel: 'Create'
+    };
+
+    $scope.save = function(status) {
+        statusService.createStatus(status);
+    };
+
+};
+
+FormNewStatusController.$inject = ['status', '$scope', '$controller', 'statusService'];
+module.exports = FormNewStatusController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/status/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/status/new/index.js b/traffic_portal/app/src/common/modules/form/status/new/index.js
new file mode 100644
index 0000000..f3673fe
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/status/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.status.new', [])
+    .controller('FormNewStatusController', require('./FormNewStatusController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/tenant/FormTenantController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/tenant/FormTenantController.js b/traffic_portal/app/src/common/modules/form/tenant/FormTenantController.js
new file mode 100644
index 0000000..4acf374
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/tenant/FormTenantController.js
@@ -0,0 +1,50 @@
+/*
+ * 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 FormTenantController = function(tenant, $scope, formUtils, locationUtils, tenantService) {
+
+    var getTenants = function() {
+        tenantService.getTenants()
+            .then(function(result) {
+                $scope.tenants = result;
+            });
+    };
+
+    $scope.tenant = tenant;
+
+    $scope.falseTrue = [
+        { value: false, label: 'false' },
+        { value: true, label: 'true' }
+    ];
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
+    $scope.hasError = formUtils.hasError;
+
+    $scope.hasPropertyError = formUtils.hasPropertyError;
+
+    var init = function () {
+        getTenants();
+    };
+    init();
+
+};
+
+FormTenantController.$inject = ['tenant', '$scope', 'formUtils', 'locationUtils', 'tenantService'];
+module.exports = FormTenantController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/tenant/edit/FormEditTenantController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/tenant/edit/FormEditTenantController.js b/traffic_portal/app/src/common/modules/form/tenant/edit/FormEditTenantController.js
new file mode 100644
index 0000000..28c69e2
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/tenant/edit/FormEditTenantController.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.
+ */
+
+var FormEditTenantController = function(tenant, $scope, $controller, $uibModal, $anchorScroll, locationUtils, tenantService) {
+
+    // extends the FormTenantController to inherit common methods
+    angular.extend(this, $controller('FormTenantController', { tenant: tenant, $scope: $scope }));
+
+    var deleteTenant = function(tenant) {
+        tenantService.deleteTenant(tenant.id)
+            .then(function() {
+                locationUtils.navigateToPath('/admin/tenants');
+            });
+    };
+
+    $scope.tenantName = angular.copy(tenant.name);
+
+    $scope.settings = {
+        isNew: false,
+        saveLabel: 'Update'
+    };
+
+    $scope.save = function(tenant) {
+        tenantService.updateTenant(tenant).
+            then(function() {
+                $scope.tenantName = angular.copy(tenant.name);
+                $anchorScroll(); // scrolls window to top
+            });
+    };
+
+    $scope.confirmDelete = function(tenant) {
+        var params = {
+            title: 'Delete Tenant: ' + tenant.name,
+            key: tenant.name
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+            controller: 'DialogDeleteController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                }
+            }
+        });
+        modalInstance.result.then(function() {
+            deleteTenant(tenant);
+        }, function () {
+            // do nothing
+        });
+    };
+
+};
+
+FormEditTenantController.$inject = ['tenant', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'tenantService'];
+module.exports = FormEditTenantController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/tenant/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/tenant/edit/index.js b/traffic_portal/app/src/common/modules/form/tenant/edit/index.js
new file mode 100644
index 0000000..63484fd
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/tenant/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.tenant.edit', [])
+    .controller('FormEditTenantController', require('./FormEditTenantController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/tenant/form.tenant.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/tenant/form.tenant.tpl.html b/traffic_portal/app/src/common/modules/form/tenant/form.tenant.tpl.html
new file mode 100644
index 0000000..8567a86
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/tenant/form.tenant.tpl.html
@@ -0,0 +1,62 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb">
+            <li><a ng-click="navigateToPath('/admin/tenants')">Tenants</a></li>
+            <li class="active">{{tenantName}}</li>
+        </ol>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="tenantForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(tenantForm.name), 'has-feedback': hasError(tenantForm.name)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Name *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="name" name="name" type="text" class="form-control" ng-model="tenant.name" ng-required="true" ng-maxlength="45" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(tenantForm.name, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(tenantForm.name, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(tenantForm.name)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(tenantForm.active), 'has-feedback': hasError(tenantForm.active)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Active *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="active" name="active" class="form-control" ng-model="tenant.active" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(tenantForm.active, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(tenantForm.parentId), 'has-feedback': hasError(tenantForm.parentId)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Parent Tenant *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="parentId" name="parentId" class="form-control" ng-model="tenant.parentId" ng-options="tenant.id as tenant.name for tenant in tenants" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(tenantForm.parentId, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(tenant)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="tenantForm.$pristine || tenantForm.$invalid" ng-click="save(tenant)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/tenant/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/tenant/index.js b/traffic_portal/app/src/common/modules/form/tenant/index.js
new file mode 100644
index 0000000..7b76c87
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/tenant/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.tenant', [])
+    .controller('FormTenantController', require('./FormTenantController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/tenant/new/FormNewTenantController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/tenant/new/FormNewTenantController.js b/traffic_portal/app/src/common/modules/form/tenant/new/FormNewTenantController.js
new file mode 100644
index 0000000..b1aab29
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/tenant/new/FormNewTenantController.js
@@ -0,0 +1,42 @@
+/*
+ * 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 FormNewTenantController = function(tenant, $scope, $controller, locationUtils, tenantService) {
+
+    // extends the FormTenantController to inherit common methods
+    angular.extend(this, $controller('FormTenantController', { tenant: tenant, $scope: $scope }));
+
+    $scope.tenantName = 'New';
+
+    $scope.settings = {
+        isNew: true,
+        saveLabel: 'Create'
+    };
+
+    $scope.save = function(tenant) {
+        tenantService.createTenant(tenant).
+            then(function() {
+                locationUtils.navigateToPath('/admin/tenants');
+            });
+    };
+
+};
+
+FormNewTenantController.$inject = ['tenant', '$scope', '$controller', 'locationUtils', 'tenantService'];
+module.exports = FormNewTenantController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/tenant/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/tenant/new/index.js b/traffic_portal/app/src/common/modules/form/tenant/new/index.js
new file mode 100644
index 0000000..5e8a903
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/tenant/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.tenant.new', [])
+    .controller('FormNewTenantController', require('./FormNewTenantController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/type/FormTypeController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/type/FormTypeController.js b/traffic_portal/app/src/common/modules/form/type/FormTypeController.js
new file mode 100644
index 0000000..065fda9
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/type/FormTypeController.js
@@ -0,0 +1,56 @@
+/*
+ * 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 FormTypeController = function(type, $scope, $location, formUtils, stringUtils, locationUtils) {
+
+    $scope.type = type;
+
+    $scope.props = [
+        { name: 'name', type: 'text', required: true, maxLength: 45 },
+        { name: 'useInTable', type: 'text', required: true, maxLength: 45 }
+    ];
+
+    $scope.labelize = stringUtils.labelize;
+
+    $scope.viewServers = function() {
+        $location.path($location.path() + '/servers');
+    };
+
+    $scope.viewDeliveryServices = function() {
+        $location.path($location.path() + '/delivery-services');
+    };
+
+    $scope.viewCacheGroups = function() {
+        $location.path($location.path() + '/cache-groups');
+    };
+
+    $scope.viewStaticDnsEntries = function() {
+        $location.path($location.path() + '/static-dns-entries');
+    };
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
+    $scope.hasError = formUtils.hasError;
+
+    $scope.hasPropertyError = formUtils.hasPropertyError;
+
+};
+
+FormTypeController.$inject = ['type', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils'];
+module.exports = FormTypeController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/type/edit/FormEditTypeController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/type/edit/FormEditTypeController.js b/traffic_portal/app/src/common/modules/form/type/edit/FormEditTypeController.js
new file mode 100644
index 0000000..6dc8baa
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/type/edit/FormEditTypeController.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.
+ */
+
+var FormEditTypeController = function(type, $scope, $controller, $uibModal, $anchorScroll, locationUtils, typeService) {
+
+    // extends the FormTypeController to inherit common methods
+    angular.extend(this, $controller('FormTypeController', { type: type, $scope: $scope }));
+
+    var deleteType = function(type) {
+        typeService.deleteType(type.id)
+            .then(function() {
+                locationUtils.navigateToPath('/admin/types');
+            });
+    };
+
+    $scope.typeName = angular.copy(type.name);
+
+    $scope.settings = {
+        isNew: false,
+        saveLabel: 'Update'
+    };
+
+    $scope.save = function(type) {
+        typeService.updateType(type).
+            then(function() {
+                $scope.typeName = angular.copy(type.name);
+                $anchorScroll(); // scrolls window to top
+            });
+    };
+
+    $scope.confirmDelete = function(type) {
+        var params = {
+            title: 'Delete Type: ' + type.name,
+            key: type.name
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+            controller: 'DialogDeleteController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                }
+            }
+        });
+        modalInstance.result.then(function() {
+            deleteType(type);
+        }, function () {
+            // do nothing
+        });
+    };
+
+};
+
+FormEditTypeController.$inject = ['type', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'typeService'];
+module.exports = FormEditTypeController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/type/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/type/edit/index.js b/traffic_portal/app/src/common/modules/form/type/edit/index.js
new file mode 100644
index 0000000..e4f9cb9
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/type/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.type.edit', [])
+    .controller('FormEditTypeController', require('./FormEditTypeController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/type/form.type.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/type/form.type.tpl.html b/traffic_portal/app/src/common/modules/form/type/form.type.tpl.html
new file mode 100644
index 0000000..1fc3e1f
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/type/form.type.tpl.html
@@ -0,0 +1,58 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/types')">Types</a></li>
+            <li class="active">{{typeName}}</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-primary" title="View Servers" ng-show="type.useInTable == 'server'" ng-click="viewServers()">View Servers</button>
+            <button class="btn btn-primary" title="View Delivery Services" ng-show="type.useInTable == 'deliveryservice'" ng-click="viewDeliveryServices()">View Delivery Services</button>
+            <button class="btn btn-primary" title="View Cache Groups" ng-show="type.useInTable == 'cachegroup'" ng-click="viewCacheGroups()">View Cache Groups</button>
+            <button class="btn btn-primary" title="View Static DNS Entries" ng-show="type.useInTable == 'staticdnsentry'" ng-click="viewStaticDnsEntries()">View Static DNS Entries</button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="typeForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(typeForm[prop.name]), 'has-feedback': hasError(typeForm[prop.name])}" ng-repeat="prop in props">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">{{labelize(prop.name)}} <span ng-show="prop.required">*</span></label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="{{prop.name}}" name="{{prop.name}}" type="{{prop.type}}" class="form-control" ng-model="type[prop.name]" ng-readonly="prop.readonly" ng-required="prop.required" ng-maxlength="prop.maxLength" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(typeForm[prop.name], 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(typeForm[prop.name], 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(typeForm[prop.name])" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Description</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <textarea id="description" name="description" rows="3" cols="17" class="form-control" ng-model="type.description" maxlength="256"></textarea>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(type)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="typeForm.$pristine || typeForm.$invalid" ng-click="save(type)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/type/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/type/index.js b/traffic_portal/app/src/common/modules/form/type/index.js
new file mode 100644
index 0000000..24ae187
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/type/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.type', [])
+    .controller('FormTypeController', require('./FormTypeController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/type/new/FormNewTypeController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/type/new/FormNewTypeController.js b/traffic_portal/app/src/common/modules/form/type/new/FormNewTypeController.js
new file mode 100644
index 0000000..2f07a52
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/type/new/FormNewTypeController.js
@@ -0,0 +1,39 @@
+/*
+ * 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 FormNewTypeController = function(type, $scope, $controller, typeService) {
+
+    // extends the FormTypeController to inherit common methods
+    angular.extend(this, $controller('FormTypeController', { type: type, $scope: $scope }));
+
+    $scope.typeName = 'New';
+
+    $scope.settings = {
+        isNew: true,
+        saveLabel: 'Create'
+    };
+
+    $scope.save = function(type) {
+        typeService.createType(type);
+    };
+
+};
+
+FormNewTypeController.$inject = ['type', '$scope', '$controller', 'typeService'];
+module.exports = FormNewTypeController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/type/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/type/new/index.js b/traffic_portal/app/src/common/modules/form/type/new/index.js
new file mode 100644
index 0000000..6b067de
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/type/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.type.new', [])
+    .controller('FormNewTypeController', require('./FormNewTypeController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/user/FormUserController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/user/FormUserController.js b/traffic_portal/app/src/common/modules/form/user/FormUserController.js
new file mode 100644
index 0000000..8561601
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/user/FormUserController.js
@@ -0,0 +1,59 @@
+/*
+ * 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 FormUserController = function(user, $scope, $location, formUtils, stringUtils, locationUtils, roleService, tenantService) {
+
+    var getRoles = function() {
+        roleService.getRoles()
+            .then(function(result) {
+                $scope.roles = result;
+            });
+    };
+
+    var getTenants = function() {
+        tenantService.getTenants()
+            .then(function(result) {
+                $scope.tenants = result;
+            });
+    };
+
+    $scope.user = user;
+
+    $scope.labelize = stringUtils.labelize;
+
+    $scope.viewDeliveryServices = function() {
+        $location.path($location.path() + '/delivery-services');
+    };
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
+    $scope.hasError = formUtils.hasError;
+
+    $scope.hasPropertyError = formUtils.hasPropertyError;
+
+    var init = function () {
+        getRoles();
+        getTenants();
+    };
+    init();
+
+};
+
+FormUserController.$inject = ['user', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils', 'roleService', 'tenantService'];
+module.exports = FormUserController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/user/_form.user.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/user/_form.user.scss b/traffic_portal/app/src/common/modules/form/user/_form.user.scss
new file mode 100644
index 0000000..d57b9c6
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/user/_form.user.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.
+
+*/



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/statuses/TableStatusesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/statuses/TableStatusesController.js b/traffic_portal/app/src/common/modules/table/statuses/TableStatusesController.js
new file mode 100644
index 0000000..51c31cf
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/statuses/TableStatusesController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableStatusesController = function(statuses, $scope, $state, locationUtils) {
+
+    $scope.statuses = statuses;
+
+    $scope.editStatus = function(id) {
+        locationUtils.navigateToPath('/admin/statuses/' + id);
+    };
+
+    $scope.createStatus = function() {
+        locationUtils.navigateToPath('/admin/statuses/new');
+    };
+
+    $scope.refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+    angular.element(document).ready(function () {
+        $('#statusesTable').dataTable({
+            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+            "iDisplayLength": 25,
+            "aaSorting": []
+        });
+    });
+
+};
+
+TableStatusesController.$inject = ['statuses', '$scope', '$state', 'locationUtils'];
+module.exports = TableStatusesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/statuses/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/statuses/index.js b/traffic_portal/app/src/common/modules/table/statuses/index.js
new file mode 100644
index 0000000..9c39c7c
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/statuses/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.statuses', [])
+    .controller('TableStatusesController', require('./TableStatusesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/statuses/table.statuses.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/statuses/table.statuses.tpl.html b/traffic_portal/app/src/common/modules/table/statuses/table.statuses.tpl.html
new file mode 100644
index 0000000..1b35d5a
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/statuses/table.statuses.tpl.html
@@ -0,0 +1,49 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Statuses</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Create Status" ng-click="createStatus()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="statusesTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+                <th>description</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editStatus(status.id)" ng-repeat="status in ::statuses">
+                <td>{{::status.name}}</td>
+                <td>{{::status.description}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/tenants/TableTenantsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/tenants/TableTenantsController.js b/traffic_portal/app/src/common/modules/table/tenants/TableTenantsController.js
new file mode 100644
index 0000000..0e1a214
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/tenants/TableTenantsController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableTenantsController = function(tenants, $scope, $state, locationUtils) {
+
+    $scope.tenants = tenants;
+
+    $scope.editTenant = function(id) {
+        locationUtils.navigateToPath('/admin/tenants/' + id);
+    };
+
+    $scope.createTenant = function() {
+        locationUtils.navigateToPath('/admin/tenants/new');
+    };
+
+    $scope.refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+    angular.element(document).ready(function () {
+        $('#tenantsTable').dataTable({
+            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+            "iDisplayLength": 25,
+            "aaSorting": []
+        });
+    });
+
+};
+
+TableTenantsController.$inject = ['tenants', '$scope', '$state', 'locationUtils'];
+module.exports = TableTenantsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/tenants/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/tenants/index.js b/traffic_portal/app/src/common/modules/table/tenants/index.js
new file mode 100644
index 0000000..033e997
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/tenants/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.tenants', [])
+    .controller('TableTenantsController', require('./TableTenantsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/tenants/table.tenants.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/tenants/table.tenants.tpl.html b/traffic_portal/app/src/common/modules/table/tenants/table.tenants.tpl.html
new file mode 100644
index 0000000..c3db617
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/tenants/table.tenants.tpl.html
@@ -0,0 +1,55 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Tenants</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" ng-click="createTenant()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="tenantsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+                <th>active</th>
+                <th>parent</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editTenant(tenant.id)" ng-repeat="tenant in ::tenants">
+                <td>{{::tenant.name}}</td>
+                <td>{{::tenant.active}}</td>
+                <td>{{::tenant.parentName}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/typeCacheGroups/TableTypeCacheGroupsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/typeCacheGroups/TableTypeCacheGroupsController.js b/traffic_portal/app/src/common/modules/table/typeCacheGroups/TableTypeCacheGroupsController.js
new file mode 100644
index 0000000..e05b5bc
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/typeCacheGroups/TableTypeCacheGroupsController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableTypeCacheGroupsController = function(type, cacheGroups, $scope, $state, locationUtils) {
+
+	$scope.type = type;
+
+	$scope.cacheGroups = cacheGroups;
+
+	$scope.editCacheGroup = function(id) {
+		locationUtils.navigateToPath('/configure/cache-groups/' + id);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#cacheGroupsTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableTypeCacheGroupsController.$inject = ['type', 'cacheGroups', '$scope', '$state', 'locationUtils'];
+module.exports = TableTypeCacheGroupsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/typeCacheGroups/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/typeCacheGroups/index.js b/traffic_portal/app/src/common/modules/table/typeCacheGroups/index.js
new file mode 100644
index 0000000..c1d3a62
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/typeCacheGroups/index.js
@@ -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.
+ */
+
+module.exports = angular.module('trafficPortal.table.typeCacheGroups', [])
+	.controller('TableTypeCacheGroupsController', require('./TableTypeCacheGroupsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/typeCacheGroups/table.typeCacheGroups.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/typeCacheGroups/table.typeCacheGroups.tpl.html b/traffic_portal/app/src/common/modules/table/typeCacheGroups/table.typeCacheGroups.tpl.html
new file mode 100644
index 0000000..54a2663
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/typeCacheGroups/table.typeCacheGroups.tpl.html
@@ -0,0 +1,56 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/types')">Types</a></li>
+            <li><a ng-click="navigateToPath('/admin/types/' + type.id)">{{::type.name}}</a></li>
+            <li class="active">Cache Groups</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="cacheGroupsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+                <th>shortName</th>
+                <th>type</th>
+                <th>latitude</th>
+                <th>longitude</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editCacheGroup(cacheGroup.id)" ng-repeat="cacheGroup in ::cacheGroups">
+                <td>{{::cacheGroup.name}}</td>
+                <td>{{::cacheGroup.shortName}}</td>
+                <td>{{::cacheGroup.typeName}}</td>
+                <td>{{::cacheGroup.latitude}}</td>
+                <td>{{::cacheGroup.longitude}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/typeDeliveryServices/TableTypeDeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/typeDeliveryServices/TableTypeDeliveryServicesController.js b/traffic_portal/app/src/common/modules/table/typeDeliveryServices/TableTypeDeliveryServicesController.js
new file mode 100644
index 0000000..e41053c
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/typeDeliveryServices/TableTypeDeliveryServicesController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableTypeDeliveryServicesController = function(type, deliveryServices, $scope, $state, locationUtils) {
+
+	$scope.type = type;
+
+	$scope.deliveryServices = deliveryServices;
+
+	$scope.editDeliveryServices = function(ds) {
+		locationUtils.navigateToPath('/configure/delivery-services/' + ds.id + '?type=' + ds.type);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#deliveryServicesTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableTypeDeliveryServicesController.$inject = ['type', 'deliveryServices', '$scope', '$state', 'locationUtils'];
+module.exports = TableTypeDeliveryServicesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/typeDeliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/typeDeliveryServices/index.js b/traffic_portal/app/src/common/modules/table/typeDeliveryServices/index.js
new file mode 100644
index 0000000..3b6514e
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/typeDeliveryServices/index.js
@@ -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.
+ */
+
+module.exports = angular.module('trafficPortal.table.typeDeliveryServices', [])
+	.controller('TableTypeDeliveryServicesController', require('./TableTypeDeliveryServicesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/typeDeliveryServices/table.typeDeliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/typeDeliveryServices/table.typeDeliveryServices.tpl.html b/traffic_portal/app/src/common/modules/table/typeDeliveryServices/table.typeDeliveryServices.tpl.html
new file mode 100644
index 0000000..7473c3b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/typeDeliveryServices/table.typeDeliveryServices.tpl.html
@@ -0,0 +1,66 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/types')">Types</a></li>
+            <li><a ng-click="navigateToPath('/admin/types/' + type.id)">{{::type.name}}</a></li>
+            <li class="active">Delivery Services</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="deliveryServicesTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>xmlId</th>
+                <th>orgServerFqdn</th>
+                <th>active</th>
+                <th>type</th>
+                <th>protocol</th>
+                <th>cdn</th>
+                <th>ipv6RoutingEnabled</th>
+                <th>dscp</th>
+                <th>signed</th>
+                <th>qstringIgnore</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editDeliveryService(deliveryService)" ng-repeat="deliveryService in ::deliveryServices">
+                <td>{{::deliveryService.xmlId}}</td>
+                <td>{{::deliveryService.orgServerFqdn}}</td>
+                <td>{{::deliveryService.active}}</td>
+                <td>{{::deliveryService.type}}</td>
+                <td>{{::deliveryService.protocol}}</td>
+                <td>{{::deliveryService.cdnName}}</td>
+                <td>{{::deliveryService.ipv6RoutingEnabled}}</td>
+                <td>{{::deliveryService.dscp}}</td>
+                <td>{{::deliveryService.signed}}</td>
+                <td>{{::deliveryService.qstringIgnore}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/typeServers/TableTypeServersController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/typeServers/TableTypeServersController.js b/traffic_portal/app/src/common/modules/table/typeServers/TableTypeServersController.js
new file mode 100644
index 0000000..f0e30d4
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/typeServers/TableTypeServersController.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.
+ */
+
+var TableTypeServersController = function(type, servers, $scope, $state, locationUtils, serverUtils) {
+
+	$scope.type = type;
+
+	$scope.servers = servers;
+
+	$scope.editServer = function(id) {
+		locationUtils.navigateToPath('/configure/servers/' + id);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.isOffline = serverUtils.isOffline;
+
+	$scope.offlineReason = serverUtils.offlineReason;
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#serversTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableTypeServersController.$inject = ['type', 'servers', '$scope', '$state', 'locationUtils', 'serverUtils'];
+module.exports = TableTypeServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/typeServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/typeServers/index.js b/traffic_portal/app/src/common/modules/table/typeServers/index.js
new file mode 100644
index 0000000..b282b7e
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/typeServers/index.js
@@ -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.
+ */
+
+module.exports = angular.module('trafficPortal.table.typeServers', [])
+	.controller('TableTypeServersController', require('./TableTypeServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/typeServers/table.typeServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/typeServers/table.typeServers.tpl.html b/traffic_portal/app/src/common/modules/table/typeServers/table.typeServers.tpl.html
new file mode 100644
index 0000000..e311c42
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/typeServers/table.typeServers.tpl.html
@@ -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.
+-->
+
+<div class="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/types')">Types</a></li>
+            <li><a ng-click="navigateToPath('/admin/types/' + type.id)">{{::type.name}}</a></li>
+            <li class="active">Servers</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="serversTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Update?</th>
+                <th>hostName</th>
+                <th>domainName</th>
+                <th>ipAddress</th>
+                <th>ip6Address</th>
+                <th>status</th>
+                <th>type</th>
+                <th>profile</th>
+                <th>cdn</th>
+                <th>cachegroup</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editServer(server.id)" ng-repeat="server in ::servers" ng-class="::{'active': server.updPending}">
+                <td class="update-column">
+                    <i class="fa fa-flag" ng-if="server.updPending"></i>
+                    <i class="fa fa-ban" ng-if="!server.updPending"></i>
+                </td>
+                <td>{{::server.hostName}}</td>
+                <td>{{::server.domainName}}</td>
+                <td>{{::server.ipAddress}}</td>
+                <td>{{::server.ip6Address}}</td>
+                <td>
+                    <span ng-if="!isOffline(server.status)">{{::server.status}}</span>
+                    <span ng-if="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
+                </td>
+                <td>{{::server.type}}</td>
+                <td>{{::server.profile}}</td>
+                <td>{{::server.cdnName}}</td>
+                <td>{{::server.cachegroup}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/typeStaticDnsEntries/TableTypeStaticDnsEntriesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/typeStaticDnsEntries/TableTypeStaticDnsEntriesController.js b/traffic_portal/app/src/common/modules/table/typeStaticDnsEntries/TableTypeStaticDnsEntriesController.js
new file mode 100644
index 0000000..add4ae5
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/typeStaticDnsEntries/TableTypeStaticDnsEntriesController.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.
+ */
+
+var TableTypeStaticDnsEntriesController = function(type, staticDnsEntries, $scope, $state, locationUtils) {
+
+	$scope.type = type;
+
+	$scope.staticDnsEntries = staticDnsEntries;
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#staticDnsEntriesTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableTypeStaticDnsEntriesController.$inject = ['type', 'staticDnsEntries', '$scope', '$state', 'locationUtils'];
+module.exports = TableTypeStaticDnsEntriesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/typeStaticDnsEntries/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/typeStaticDnsEntries/index.js b/traffic_portal/app/src/common/modules/table/typeStaticDnsEntries/index.js
new file mode 100644
index 0000000..f1a366b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/typeStaticDnsEntries/index.js
@@ -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.
+ */
+
+module.exports = angular.module('trafficPortal.table.typeStaticDnsEntries', [])
+	.controller('TableTypeStaticDnsEntriesController', require('./TableTypeStaticDnsEntriesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/typeStaticDnsEntries/table.typeStaticDnsEntries.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/typeStaticDnsEntries/table.typeStaticDnsEntries.tpl.html b/traffic_portal/app/src/common/modules/table/typeStaticDnsEntries/table.typeStaticDnsEntries.tpl.html
new file mode 100644
index 0000000..38c322a
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/typeStaticDnsEntries/table.typeStaticDnsEntries.tpl.html
@@ -0,0 +1,58 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/types')">Types</a></li>
+            <li><a ng-click="navigateToPath('/admin/types/' + type.id)">{{::type.name}}</a></li>
+            <li class="active">Static DNS Entries</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="staticDnsEntriesTable" class="table responsive-utilities jambo_table">
+            <thead>
+                <tr class="headings">
+                    <th>host</th>
+                    <th>address</th>
+                    <th>type</th>
+                    <th>ttl</th>
+                    <th>deliveryservice</th>
+                    <th>cachegroup</th>
+                </tr>
+            </thead>
+            <tbody>
+                <tr ng-repeat="staticDnsEntry in ::staticDnsEntries">
+                    <td>{{::staticDnsEntry.host}}</td>
+                    <td>{{::staticDnsEntry.address}}</td>
+                    <td>{{::staticDnsEntry.type}}</td>
+                    <td>{{::staticDnsEntry.ttl}}</td>
+                    <td>{{::staticDnsEntry.deliveryservice}}</td>
+                    <td>{{::staticDnsEntry.cachegroup}}</td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/types/TableTypesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/types/TableTypesController.js b/traffic_portal/app/src/common/modules/table/types/TableTypesController.js
new file mode 100644
index 0000000..d6f73b9
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/types/TableTypesController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableTypesController = function(types, $scope, $state, locationUtils) {
+
+    $scope.types = types;
+
+    $scope.editType = function(id) {
+        locationUtils.navigateToPath('/admin/types/' + id);
+    };
+
+    $scope.createType = function() {
+        locationUtils.navigateToPath('/admin/types/new');
+    };
+
+    $scope.refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+    angular.element(document).ready(function () {
+        $('#typesTable').dataTable({
+            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+            "iDisplayLength": 25,
+            "aaSorting": []
+        });
+    });
+
+};
+
+TableTypesController.$inject = ['types', '$scope', '$state', 'locationUtils'];
+module.exports = TableTypesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/types/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/types/index.js b/traffic_portal/app/src/common/modules/table/types/index.js
new file mode 100644
index 0000000..6e69735
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/types/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.types', [])
+    .controller('TableTypesController', require('./TableTypesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/types/table.types.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/types/table.types.tpl.html b/traffic_portal/app/src/common/modules/table/types/table.types.tpl.html
new file mode 100644
index 0000000..63bc37b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/types/table.types.tpl.html
@@ -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.
+-->
+
+<div class="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Types</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Create Type" ng-click="createType()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="typesTable" class="table responsive-utilities jambo_table">
+            <thead>
+                <tr class="headings">
+                    <th>name</th>
+                    <th>useInTable</th>
+                    <th>description</th>
+                </tr>
+            </thead>
+            <tbody>
+                <tr ng-click="editType(type.id)" ng-repeat="type in ::types">
+                    <td>{{::type.name}}</td>
+                    <td>{{::type.useInTable}}</td>
+                    <td>{{::type.description}}</td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/userDeliveryServices/TableUserDSUnassignedController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/userDeliveryServices/TableUserDSUnassignedController.js b/traffic_portal/app/src/common/modules/table/userDeliveryServices/TableUserDSUnassignedController.js
new file mode 100644
index 0000000..5e430f0
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/userDeliveryServices/TableUserDSUnassignedController.js
@@ -0,0 +1,107 @@
+/*
+ * 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 TableUserDSUnassignedController = function(user, deliveryServices, userDeliveryServices, $scope, $uibModalInstance) {
+
+	var selectedDeliveryServiceIds = [];
+
+	var addDS = function(dsId) {
+		if (_.indexOf(selectedDeliveryServiceIds, dsId) == -1) {
+			selectedDeliveryServiceIds.push(dsId);
+		}
+	};
+
+	var removeDS = function(dsId) {
+		selectedDeliveryServiceIds = _.without(selectedDeliveryServiceIds, dsId);
+	};
+
+	var addAll = function() {
+		markDSs(true);
+		selectedDeliveryServiceIds = _.pluck(deliveryServices, 'id');
+	};
+
+	var removeAll = function() {
+		markDSs(false);
+		selectedDeliveryServiceIds = [];
+	};
+
+	var markDSs = function(selected) {
+		$scope.selectedDSs = _.map(deliveryServices, function(ds) {
+			ds['selected'] = selected;
+			return ds;
+		});
+	};
+
+	$scope.user = user;
+
+	$scope.selectedDSs = _.map(deliveryServices, function(ds) {
+		var isAssigned = _.find(userDeliveryServices, function(userDS) { return userDS.id == ds.id });
+		if (isAssigned) {
+			ds['selected'] = true; // so the checkbox will be checked
+			selectedDeliveryServiceIds.push(ds.id); // so the ds is added to selected delivery services
+		}
+		return ds;
+	});
+
+	$scope.allSelected = function() {
+		return deliveryServices.length == selectedDeliveryServiceIds.length;
+	};
+
+	$scope.selectAll = function($event) {
+		var checkbox = $event.target;
+		if (checkbox.checked) {
+			addAll();
+		} else {
+			removeAll();
+		}
+	};
+
+	$scope.updateDeliveryServices = function($event, dsId) {
+		var checkbox = $event.target;
+		if (checkbox.checked) {
+			addDS(dsId);
+		} else {
+			removeDS(dsId);
+		}
+	};
+
+	$scope.submit = function() {
+		$uibModalInstance.close(selectedDeliveryServiceIds);
+	};
+
+	$scope.cancel = function () {
+		$uibModalInstance.dismiss('cancel');
+	};
+
+	angular.element(document).ready(function () {
+		$('#userDSUnassignedTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"order": [[ 1, 'asc' ]],
+			"columnDefs": [
+				{ 'orderable': false, 'targets': 0 },
+				{ "width": "5%", "targets": 0 }
+			]
+		});
+	});
+
+};
+
+TableUserDSUnassignedController.$inject = ['user', 'deliveryServices', 'userDeliveryServices', '$scope', '$uibModalInstance'];
+module.exports = TableUserDSUnassignedController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/userDeliveryServices/TableUserDeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/userDeliveryServices/TableUserDeliveryServicesController.js b/traffic_portal/app/src/common/modules/table/userDeliveryServices/TableUserDeliveryServicesController.js
new file mode 100644
index 0000000..69ab8bf
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/userDeliveryServices/TableUserDeliveryServicesController.js
@@ -0,0 +1,82 @@
+/*
+ * 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 TableUserDeliveryServicesController = function(user, userDeliveryServices, $scope, $state, $uibModal, locationUtils, userService) {
+
+	$scope.user = user;
+
+	$scope.userDeliveryServices = userDeliveryServices;
+
+	$scope.removeDS = function(dsId) {
+		userService.deleteUserDeliveryService(user.id, dsId)
+			.then(
+				function() {
+					$scope.refresh();
+				}
+			);
+	};
+
+	$scope.selectDSs = function() {
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/table/userDeliveryServices/table.userDSUnassigned.tpl.html',
+			controller: 'TableUserDSUnassignedController',
+			size: 'lg',
+			resolve: {
+				user: function() {
+					return user;
+				},
+				deliveryServices: function(deliveryServiceService) {
+					return deliveryServiceService.getDeliveryServices();
+				},
+				userDeliveryServices: function() {
+					return userDeliveryServices;
+				}
+			}
+		});
+		modalInstance.result.then(function(selectedDSIds) {
+			console.log(selectedDSIds);
+			userService.assignUserDeliveryServices(user.id, selectedDSIds)
+				.then(
+					function() {
+						$scope.refresh();
+					}
+				);
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#deliveryServicesTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableUserDeliveryServicesController.$inject = ['user', 'userDeliveryServices', '$scope', '$state', '$uibModal', 'locationUtils', 'userService'];
+module.exports = TableUserDeliveryServicesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/userDeliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/userDeliveryServices/index.js b/traffic_portal/app/src/common/modules/table/userDeliveryServices/index.js
new file mode 100644
index 0000000..4bcbe1e
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/userDeliveryServices/index.js
@@ -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.
+ */
+
+module.exports = angular.module('trafficPortal.table.userDeliveryServices', [])
+	.controller('TableUserDeliveryServicesController', require('./TableUserDeliveryServicesController'))
+	.controller('TableUserDSUnassignedController', require('./TableUserDSUnassignedController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/userDeliveryServices/table.userDSUnassigned.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/userDeliveryServices/table.userDSUnassigned.tpl.html b/traffic_portal/app/src/common/modules/table/userDeliveryServices/table.userDSUnassigned.tpl.html
new file mode 100644
index 0000000..58d9621
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/userDeliveryServices/table.userDSUnassigned.tpl.html
@@ -0,0 +1,47 @@
+<!--
+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="modal-header">
+    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+    <h3 class="modal-title">Assign Delivery Services to {{::user.username}}</h3>
+</div>
+<div class="modal-body">
+    <table id="userDSUnassignedTable" class="table responsive-utilities jambo_table" style="table-layout:fixed; width:100%;">
+        <thead>
+        <tr class="headings">
+            <th style="padding-left: 10px;"><input type="checkbox" ng-click="selectAll($event)" ng-checked="allSelected()"></th>
+            <th>xmlId</th>
+            <th>displayName</th>
+        </tr>
+        </thead>
+        <tbody>
+        <tr ng-repeat="ds in ::selectedDSs">
+            <td><input type="checkbox" ng-click="updateDeliveryServices($event, ds.id)" ng-checked="ds.selected"></td>
+            <td>{{::ds.xmlId}}</td>
+            <td>{{::ds.displayName}}</td>
+        </tr>
+        </tbody>
+    </table>
+</div>
+<div class="modal-footer">
+    <button class="btn btn-link" ng-click="cancel()">cancel</button>
+    <button class="btn btn-primary" ng-click="submit()">Submit</button>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/userDeliveryServices/table.userDeliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/userDeliveryServices/table.userDeliveryServices.tpl.html b/traffic_portal/app/src/common/modules/table/userDeliveryServices/table.userDeliveryServices.tpl.html
new file mode 100644
index 0000000..c0122cb
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/userDeliveryServices/table.userDeliveryServices.tpl.html
@@ -0,0 +1,55 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/users')">Users</a></li>
+            <li><a ng-click="navigateToPath('/admin/users/' + user.id)">{{::user.username}}</a></li>
+            <li class="active">Delivery Services</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Link Delivery Services to User" ng-click="selectDSs()"><i class="fa fa-link"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="deliveryServicesTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>xmlId</th>
+                <th>orgServerFqdn</th>
+                <th>cdn</th>
+                <th></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="deliveryService in ::userDeliveryServices">
+                <td>{{::deliveryService.xmlId}}</td>
+                <td>{{::deliveryService.orgServerFqdn}}</td>
+                <td>{{::deliveryService.cdnName}}</td>
+                <td><button type="button" class="btn btn-link" title="Unlink Delivery Service from User" ng-click="removeDS(deliveryService.id)"><i class="fa fa-chain-broken"></i></button></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/users/TableUsersController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/users/TableUsersController.js b/traffic_portal/app/src/common/modules/table/users/TableUsersController.js
new file mode 100644
index 0000000..867bddf
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/users/TableUsersController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableUsersController = function(users, $scope, $state, locationUtils) {
+
+    $scope.users = users;
+
+    $scope.editUser = function(id) {
+        locationUtils.navigateToPath('/admin/users/' + id);
+    };
+
+    $scope.createUser = function() {
+        locationUtils.navigateToPath('/admin/users/new');
+    };
+
+    $scope.refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+    angular.element(document).ready(function () {
+        $('#usersTable').dataTable({
+            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+            "iDisplayLength": 25,
+            "aaSorting": []
+        });
+    });
+
+};
+
+TableUsersController.$inject = ['users', '$scope', '$state', 'locationUtils'];
+module.exports = TableUsersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/users/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/users/index.js b/traffic_portal/app/src/common/modules/table/users/index.js
new file mode 100644
index 0000000..ee8604d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/users/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.users', [])
+    .controller('TableUsersController', require('./TableUsersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/users/table.users.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/users/table.users.tpl.html b/traffic_portal/app/src/common/modules/table/users/table.users.tpl.html
new file mode 100644
index 0000000..928b4aa
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/users/table.users.tpl.html
@@ -0,0 +1,57 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Users</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Create User" ng-click="createUser()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="usersTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Full Name</th>
+                <th>Username</th>
+                <th>Email</th>
+                <th>Role</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editUser(user.id)" ng-repeat="user in ::users">
+                <td>{{::user.fullName}}</td>
+                <td>{{::user.username}}</td>
+                <td>{{::user.email}}</td>
+                <td>{{::user.rolename}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/tools/purge/ToolsPurgeController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/tools/purge/ToolsPurgeController.js b/traffic_portal/app/src/common/modules/tools/purge/ToolsPurgeController.js
deleted file mode 100644
index 906754f..0000000
--- a/traffic_portal/app/src/common/modules/tools/purge/ToolsPurgeController.js
+++ /dev/null
@@ -1,92 +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 ToolsPurgeController = function($scope, $uibModal, $stateParams, messageModel, deliveryServicesModel, dateUtils, formUtils, deliveryServiceService, userService) {
-
-    var getPurgeJobs = function() {
-        $scope.loadingPurgeJobs = true;
-        deliveryServiceService.getPurgeJobs($scope.deliveryService.id, false)
-            .then(function(response) {
-                $scope.loadingPurgeJobs = false;
-                $scope.purgeJobs = response;
-            });
-    };
-
-    var createPurgeJob = function(jobParams) {
-        userService.createUserPurgeJob(jobParams)
-            .then(function(response) {
-                getPurgeJobs();
-            });
-    };
-
-    $scope.deliveryService = deliveryServicesModel.getDeliveryService($stateParams.deliveryServiceId);
-
-    $scope.dateFormat = dateUtils.dateFormat;
-
-    $scope.resetPurgeJobData = function() {
-        $scope.newPurgeJobData = {
-            dsId: $scope.deliveryService.id,
-            dsXmlId: $scope.deliveryService.xmlId,
-            regex: '',
-            ttl: 672,
-            startTime: moment().format('YYYY-MM-DD HH:mm:ss')
-        };
-    };
-    $scope.resetPurgeJobData();
-
-    $scope.confirmPurgeJobCreate = function(newPurgeJob) {
-        var params = {
-            title: 'Confirmation required',
-            message: 'Are you sure you want to invalidate content for ' + $scope.deliveryService.orgServerFqdn + newPurgeJob.regex
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/confirm/dialog.confirm.tpl.html',
-            controller: 'DialogConfirmController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                }
-            }
-        });
-        modalInstance.result
-            .then(
-            function() {
-                createPurgeJob($scope.newPurgeJobData);
-                $scope.resetPurgeJobData();
-                $scope.purgeForm.$setPristine();
-            },
-            function () {
-            });
-    };
-
-    $scope.toDate = function(date) {
-        return moment(date).toDate(); // hack for https://issues.apache.org/jira/browse/TC-78
-    };
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-    angular.element(document).ready(function () {
-        getPurgeJobs();
-    });
-
-};
-
-ToolsPurgeController.$inject = ['$scope', '$uibModal', '$stateParams', 'messageModel', 'deliveryServicesModel', 'dateUtils', 'formUtils', 'deliveryServiceService', 'userService'];
-module.exports = ToolsPurgeController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/tools/purge/_tools.purge.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/tools/purge/_tools.purge.scss b/traffic_portal/app/src/common/modules/tools/purge/_tools.purge.scss
deleted file mode 100644
index c1b1c4e..0000000
--- a/traffic_portal/app/src/common/modules/tools/purge/_tools.purge.scss
+++ /dev/null
@@ -1,54 +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.
-
-*/
-
-#purgeFormContainer {
-  width: 450px;
-  margin: 10px;
-  cursor: default !important;
-
-  #purgeForm {
-    padding: 20px;
-  }
-
-  #purgeJobsLoading {
-    padding: 10px;
-  }
-}
-
-#purgeJobs {
-  margin-top: 10px;
-
-  .list-group {
-    margin-bottom:0px;
-
-    .list-group-item {
-
-      &:hover {
-        text-decoration: none;
-        background-color: rgb(255, 255, 255);
-      }
-
-      .purge-job-start {
-        font-size: 11px;
-        color: #999;
-      }
-
-    }
-
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/tools/purge/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/tools/purge/index.js b/traffic_portal/app/src/common/modules/tools/purge/index.js
deleted file mode 100644
index d8792a1..0000000
--- a/traffic_portal/app/src/common/modules/tools/purge/index.js
+++ /dev/null
@@ -1,19 +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.tools.purge', [])
-    .controller('ToolsPurgeController', require('./ToolsPurgeController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/tools/purge/tools.purge.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/tools/purge/tools.purge.tpl.html b/traffic_portal/app/src/common/modules/tools/purge/tools.purge.tpl.html
deleted file mode 100644
index c6243f3..0000000
--- a/traffic_portal/app/src/common/modules/tools/purge/tools.purge.tpl.html
+++ /dev/null
@@ -1,47 +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="purgeFormContainer" ng-click="$event.stopPropagation()">
-    <form id="purgeForm" name="purgeForm" role="form" ng-submit="confirmPurgeJobCreate(newPurgeJobData);" novalidate>
-        <div class="row">
-            <div class="col-sm-12 col-md-12">
-                <div class="form-group" ng-class="{'has-error': hasError(purgeForm.regex), 'has-feedback': hasError(purgeForm.regex)}">
-                    <label for="regex" class="control-label">Content pattern (regex) to match:</label>
-                    <input id="regex" name="regex" type="text" class="form-control" placeholder="eg. /path/to/content/.*\.jpg" ng-model="newPurgeJobData.regex" ng-pattern="/^\//" autofocus required>
-                    <small class="input-error" ng-show="hasPropertyError(purgeForm.regex, 'pattern')">Must Start with /</small>
-                    <small class="input-error" ng-show="hasPropertyError(purgeForm.regex, 'required')">Required</small>
-                    <span ng-show="hasError(purgeForm.regex)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-        </div>
-        <button class="btn btn-block action-btn" ng-disabled="purgeForm.$invalid">Invalidate Content</button>
-    </form>
-    <hr>
-    <h6 id="purgeJobsLoading">My purge jobs for {{deliveryService.displayName}} <i class="fa fa-spin fa-spinner fa-fw" ng-show="loadingPurgeJobs"></i></h6>
-    <div id="purgeJobs" ng-show="!loadingPurgeJobs">
-        <div class="list-group">
-            <li class="list-group-item" ng-repeat="purgeJob in purgeJobs">
-                <span>{{purgeJob.assetUrl}}</span>
-                <br>
-                <span class="purge-job-start">{{dateFormat(toDate(purgeJob.startTime), "mmm d yyyy h:MM TT (Z)")}}</span>
-            </li>
-        </div>
-        <div class="no-picks-alert alert alert-info" ng-show="purgeJobs.length == 0">
-            No purge jobs
-        </div>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/cacheGroups/WidgetCacheGroupsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/cacheGroups/WidgetCacheGroupsController.js b/traffic_portal/app/src/common/modules/widget/cacheGroups/WidgetCacheGroupsController.js
new file mode 100644
index 0000000..43cda07
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/cacheGroups/WidgetCacheGroupsController.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.
+ */
+
+var WidgetCacheGroupsController = function(cacheGroupHealth, $scope, locationUtils) {
+
+	// pagination
+	$scope.currentCacheGroupsPage = 1;
+	$scope.cacheGroupsPerPage = 10;
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	$scope.onlinePercent = function(location) {
+		return (location.online / (location.online + location.offline)) * 100;
+	};
+
+	var init = function() {
+		if (cacheGroupHealth) {
+			// only set this if it's passed in
+			$scope.cacheGroupHealth = cacheGroupHealth;
+		}
+	};
+	init();
+
+};
+
+WidgetCacheGroupsController.$inject = ['cacheGroupHealth', '$scope', 'locationUtils'];
+module.exports = WidgetCacheGroupsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/cacheGroups/_widget.cacheGroups.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/cacheGroups/_widget.cacheGroups.scss b/traffic_portal/app/src/common/modules/widget/cacheGroups/_widget.cacheGroups.scss
new file mode 100644
index 0000000..99435c4
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/cacheGroups/_widget.cacheGroups.scss
@@ -0,0 +1,62 @@
+/*
+
+
+ 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.
+
+*/
+
+#cache-groups-outer-container {
+
+  #cacheGroupsContainer {
+    max-height: 452px;
+    margin-bottom: 0;
+
+    .list-group-item {
+      background-color: transparent;
+    }
+
+    .cache-group-health {
+      height: 45px;
+
+      .cache-groups-table {
+        margin-top: -10px;
+        border-style: none;
+
+        td {
+          border-top: none !important;
+          padding: 12px 8px !important;
+        }
+
+      }
+
+    }
+
+  }
+
+  .cache-groups-pagination {
+    margin: 0 0 10px 0;
+    float: left;
+  }
+
+  .cache-group-search-form {
+    float: right;
+    width: 250px;
+    margin-bottom: 10px;
+  }
+
+}
+
+#cacheGroupsLoadingContainer {
+  height: 555px;
+  background-color: transparent;
+}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/cacheGroups/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/cacheGroups/index.js b/traffic_portal/app/src/common/modules/widget/cacheGroups/index.js
new file mode 100644
index 0000000..3da2fce
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/cacheGroups/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.widget.cacheGroups', [])
+	.controller('WidgetCacheGroupsController', require('./WidgetCacheGroupsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/cacheGroups/widget.cacheGroups.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/cacheGroups/widget.cacheGroups.tpl.html b/traffic_portal/app/src/common/modules/widget/cacheGroups/widget.cacheGroups.tpl.html
new file mode 100644
index 0000000..38fa790
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/cacheGroups/widget.cacheGroups.tpl.html
@@ -0,0 +1,69 @@
+<!--
+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="x_title">
+    <h2>Cache Groups <small>{{cacheGroupHealth.totalOnline/(cacheGroupHealth.totalOnline + cacheGroupHealth.totalOffline) | percentFilter}} online</small></h2>
+    <ul class="nav navbar-right panel_toolbox">
+        <li><a class="collapse-link" ng-click="navigateToPath('/monitor/map')"><i class="fa fa-map-marker"></i></a></li>
+        <li><a class="collapse-link"><i class="fa fa-chevron-up"></i></a></li>
+        <li><a class="close-link"><i class="fa fa-close"></i></a></li>
+    </ul>
+    <div class="clearfix"></div>
+</div>
+<div class="x_content">
+    <div id="cache-groups-outer-container">
+        <div id="cacheGroupsContainer">
+            <div class="alert alert-info" ng-show="(cacheGroupHealth.cachegroups | filter:search:strict).length == 0">
+                No matching cache groups
+            </div>
+            <div class="list-group">
+                <a class="cache-group-health list-group-item" ng-repeat="cg in cacheGroupHealth.cachegroups | orderBy:[onlinePercent, 'name'] | filter:search:strict | offsetFilter:(currentCacheGroupsPage-1)*cacheGroupsPerPage | limitTo:cacheGroupsPerPage">
+                    <div class="row">
+                        <table class="cache-groups-table table">
+                            <tbody>
+                            <tr>
+                                <td class="col-lg-4 col-md-4 col-sm-4">{{cg.name}}</td>
+                                <td class="col-lg-4 col-md-4 col-sm-4">{{cg.online/(cg.online + cg.offline) | percentFilter}} Online [ {{cg.online}} Online | {{cg.offline}} Offline ]</td>
+                                <td class="col-lg-4 col-md-4 col-sm-4">
+                                    <div class="progress">
+                                        <div class="progress-bar bg-green" role="progressbar" ng-style="{'width': onlinePercent(cg) + '%'}">
+                                            <span class="sr-only">{{cg.online}} Servers Online | {{cg.offline}} Servers Offline</span>
+                                        </div>
+                                    </div>
+                                </td>
+                            </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </a>
+            </div>
+        </div>
+        <div>
+            <div ng-show="(cacheGroupHealth.cachegroups | filter:search:strict).length > 0">
+                <uib-pagination class="cache-groups-pagination pagination-md" boundary-links="true" max-size="2" total-items="(cacheGroupHealth.cachegroups | filter:search:strict).length" items-per-page="cacheGroupsPerPage" ng-model="currentCacheGroupsPage" previous-text="&lsaquo;" next-text="&rsaquo;" first-text="&laquo;" last-text="&raquo;"></uib-pagination>
+            </div>
+            <div class="input-group cache-group-search-form">
+                <input type="text" class="filter-input form-control" placeholder="Filter cache groups..." ng-model="search.name">
+                <span class="filter-input-group-btn input-group-btn">
+                    <button class="btn btn-default" type="button"><i class="fa fa-search"></i></button>
+                </span>
+            </div>
+        </div>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/widget/capacity/WidgetCapacityController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/widget/capacity/WidgetCapacityController.js b/traffic_portal/app/src/common/modules/widget/capacity/WidgetCapacityController.js
new file mode 100644
index 0000000..e7c57cb
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/widget/capacity/WidgetCapacityController.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 WidgetCapacityController = function($scope, cdnService) {
+
+	var getCapacity = function() {
+		cdnService.getCapacity()
+			.then(function(response) {
+				$scope.availablePercent = response.availablePercent;
+				$scope.utilizedPercent = response.utilizedPercent;
+				$scope.maintenancePercent = response.maintenancePercent;
+				$scope.unavailablePercent = response.unavailablePercent;
+
+				var data = [];
+
+				data.push({
+					label: "Available",
+					color: '#1ABB9C',
+					data: $scope.availablePercent
+				});
+				data.push({
+					label: "Utilized",
+					color: '#3498DB',
+					data: $scope.utilizedPercent
+				});
+				data.push({
+					label: "Maintenance",
+					color: '#73879C',
+					data: $scope.maintenancePercent
+				});
+				data.push({
+					label: "Down",
+					color: '#E74C3C',
+					data: $scope.unavailablePercent
+				});
+
+				buildGraph(data);
+			});
+
+	};
+
+	var buildGraph = function(graphData) {
+
+		var options = {
+			series: {
+				pie: {
+					show: true,
+					innerRadius: 0.5,
+					radius: 1,
+					label: {
+						show: false
+					}
+				}
+			},
+			grid: {
+				hoverable: true
+			},
+			tooltip: true,
+			tooltipOpts: {
+				cssClass: "capacityChartTooltip",
+				content: "%s: %p.2%",
+				defaultTheme: false
+			},
+			legend: {
+				show: false
+			}
+		};
+
+		$.plot($("#capacityChart"), graphData, options);
+	};
+
+	$scope.availablePercent = 0;
+	$scope.utilizedPercent = 0;
+	$scope.maintenancePercent = 0;
+	$scope.unavailablePercent = 0;
+
+	var init = function() {
+		getCapacity();
+	};
+	init();
+
+};
+
+WidgetCapacityController.$inject = ['$scope', 'cdnService'];
+module.exports = WidgetCapacityController;



[52/52] incubator-trafficcontrol git commit: This closes #708.

Posted by da...@apache.org.
This closes #708.


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/commit/0bfb2cb7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/tree/0bfb2cb7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/diff/0bfb2cb7

Branch: refs/heads/master
Commit: 0bfb2cb73b9aa01a860dc2037ec4b5797d3d06e0
Parents: 3195e0c
Author: Dan Kirkwood <da...@gmail.com>
Authored: Fri Jun 30 16:41:10 2017 -0600
Committer: Dan Kirkwood <da...@gmail.com>
Committed: Fri Jun 30 16:41:10 2017 -0600

----------------------------------------------------------------------

----------------------------------------------------------------------



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/DeliveryServiceService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/DeliveryServiceService.js b/traffic_portal/app/src/common/api/DeliveryServiceService.js
index e2f2976..b653f06 100644
--- a/traffic_portal/app/src/common/api/DeliveryServiceService.js
+++ b/traffic_portal/app/src/common/api/DeliveryServiceService.js
@@ -1,177 +1,103 @@
 /*
-
-
- 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 DeliveryServiceService = function($http, $q, deliveryServicesModel, messageModel, propertiesModel, ENV) {
-
-    var capacityRequest,
-        routingMethodsRequest,
-        cacheGroupHealthRequest;
-
-    var displayTimoutError = function(options) {
-        var msg = (angular.isDefined(options.message)) ? options.message : 'Request timeout';
-        if (options.status.toString().match(/^5\d[24]$/)) {
-            // 502 or 504
-            messageModel.setMessages([ { level: 'error', text: msg } ], false);
-        }
-    };
-
-    this.getDeliveryServices = function() {
-        var promise = $http.get(ENV.apiEndpoint['1.2'] + "deliveryservices.json")
-            .success(function(result) {
-                deliveryServicesModel.setDeliveryServices(result.response);
-                return result.response;
-            })
-            .error(function(fault) {
-            });
+var DeliveryServiceService = function(Restangular, locationUtils, httpService, messageModel, ENV) {
 
-        return promise;
+    this.getDeliveryServices = function(queryParams) {
+        return Restangular.all('deliveryservices').getList(queryParams);
     };
 
-    this.getDeliveryService = function(deliveryServiceId) {
-        var deferred = $q.defer();
-        $http.get(ENV.apiEndpoint['1.2'] + "deliveryservices/" + deliveryServiceId + ".json")
-            .success(function(result) {
-                deferred.resolve(result.response[0]);
-            })
-            .error(function(fault) {
-                deferred.resolve(null);
-            });
-
-        return deferred.promise;
+    this.getDeliveryService = function(id) {
+        return Restangular.one("deliveryservices", id).get();
     };
 
-    this.getState = function(deliveryServiceId, ignoreLoadingBar) {
-        var deferred = $q.defer();
-        $http.get(ENV.apiEndpoint['1.2'] + "deliveryservices/" + deliveryServiceId + "/state.json", { ignoreLoadingBar: ignoreLoadingBar })
-            .success(function(result) {
-                deferred.resolve(result.response);
-            })
-            .error(function(fault, status) {
-                displayTimoutError({ status: status });
-                deferred.reject();
-            });
-
-        return deferred.promise;
+    this.createDeliveryService = function(deliveryService) {
+        return Restangular.service('deliveryservices').post(deliveryService)
+            .then(
+                function(response) {
+                    messageModel.setMessages([ { level: 'success', text: 'DeliveryService created' } ], true);
+                    locationUtils.navigateToPath('/configure/delivery-services/' + response.id + '?type=' + response.type);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
     };
 
-    this.getCapacity = function(deliveryServiceId, ignoreLoadingBar, showTimeoutError) {
-        if (capacityRequest) {
-            capacityRequest.reject();
-        }
-        capacityRequest = $q.defer();
-
-        $http.get(ENV.apiEndpoint['1.2'] + "deliveryservices/" + deliveryServiceId + "/capacity.json",
-            { timeout: capacityRequest.promise, ignoreLoadingBar: ignoreLoadingBar })
-            .success(function(result) {
-                capacityRequest.resolve(result.response);
-            })
-            .error(function(fault, status) {
-                if (showTimeoutError) displayTimoutError({ status: status });
-                capacityRequest.reject();
-            });
-
-        return capacityRequest.promise;
+    this.updateDeliveryService = function(deliveryService) {
+        return deliveryService.put()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Delivery service updated' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
     };
 
-
-    this.getRoutingMethods = function(deliveryServiceId, ignoreLoadingBar, showTimeoutError) {
-        if (routingMethodsRequest) {
-            routingMethodsRequest.reject();
-        }
-        routingMethodsRequest = $q.defer();
-
-        $http.get(ENV.apiEndpoint['1.2'] + "deliveryservices/" + deliveryServiceId + "/routing.json",
-            { timeout: routingMethodsRequest.promise, ignoreLoadingBar: ignoreLoadingBar })
-            .success(function(result) {
-                routingMethodsRequest.resolve(result.response);
-            })
-            .error(function(fault, status) {
-                if (showTimeoutError) displayTimoutError({ status: status });
-                routingMethodsRequest.reject();
-            });
-
-        return routingMethodsRequest.promise;
+    this.deleteDeliveryService = function(id) {
+        return Restangular.one("deliveryservices", id).remove()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Delivery service deleted' } ], true);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
+                }
+            );
     };
 
-    this.getCacheGroupHealth = function(deliveryServiceId, ignoreLoadingBar, showTimeoutError) {
-        if (cacheGroupHealthRequest) {
-            cacheGroupHealthRequest.reject();
-        }
-        cacheGroupHealthRequest = $q.defer();
-
-        $http.get(ENV.apiEndpoint['1.2'] + "deliveryservices/" + deliveryServiceId + "/health.json",
-            { timeout: cacheGroupHealthRequest.promise, ignoreLoadingBar: ignoreLoadingBar })
-            .success(function(result) {
-                cacheGroupHealthRequest.resolve(result.response);
-            })
-            .error(function(fault, status) {
-                if (showTimeoutError) displayTimoutError({ status: status });
-                cacheGroupHealthRequest.reject();
-            });
-
-        return cacheGroupHealthRequest.promise;
+    this.getServerDeliveryServices = function(serverId) {
+        return Restangular.one('servers', serverId).getList('deliveryservices');
     };
 
-    this.getPurgeJobs = function(deliveryServiceId, ignoreLoadingBar) {
-        var deferred = $q.defer();
-        $http.get(ENV.apiEndpoint['1.2'] + "user/current/jobs.json?dsId=" + deliveryServiceId + "&keyword=PURGE", { ignoreLoadingBar: ignoreLoadingBar })
-            .success(function(result) {
-                deferred.resolve(result.response);
-            })
-            .error(function(fault) {
-                deferred.reject();
-            });
-
-        return deferred.promise;
+    this.getUserDeliveryServices = function(userId) {
+        return Restangular.one('users', userId).getList('deliveryservices');
     };
 
-    this.getServers = function(deliveryServiceId, ignoreLoadingBar) {
-        var deferred = $q.defer();
-        $http.get(ENV.apiEndpoint['1.2'] + "servers.json?orderby=type&dsId=" + deliveryServiceId, { ignoreLoadingBar: ignoreLoadingBar })
-            .success(function(result) {
-                deferred.resolve(result.response);
-            })
-            .error(function(fault) {
-                deferred.reject();
-            });
-
-        return deferred.promise;
+    this.deleteDeliveryServiceServer = function(dsId, serverId) {
+        return httpService.delete(ENV.api['root'] + 'deliveryservice_server/' + dsId + '/' + serverId)
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Delivery service and server were unlinked.' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
+                }
+            );
     };
 
-    this.createDSRequest = function(dsData) {
-        var deferred = $q.defer();
-        $http.post(ENV.apiEndpoint['1.2'] + "deliveryservices/request", { emailTo: propertiesModel.properties.deliveryService.request.email, details: dsData } )
-            .success(function(result) {
-                if (angular.isDefined(result.alerts)) {
-                    messageModel.setMessages(result.alerts, false);
+    this.assignDeliveryServiceServers = function(dsId, servers) {
+        return Restangular.service('deliveryserviceserver').post( { dsId: dsId, servers: servers, replace: true } )
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Servers linked to delivery service' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
                 }
-                deferred.resolve(result);
-            })
-            .error(function(fault) {
-                if (angular.isDefined(fault.alerts)) {
-                    messageModel.setMessages(fault.alerts, false);
-                }
-                deferred.reject();
-            });
-
-        return deferred.promise;
+            );
     };
 
+
 };
 
-DeliveryServiceService.$inject = ['$http', '$q', 'deliveryServicesModel', 'messageModel', 'propertiesModel', 'ENV'];
-module.exports = DeliveryServiceService;
\ No newline at end of file
+DeliveryServiceService.$inject = ['Restangular', 'locationUtils', 'httpService', 'messageModel', 'ENV'];
+module.exports = DeliveryServiceService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/DivisionService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/DivisionService.js b/traffic_portal/app/src/common/api/DivisionService.js
new file mode 100644
index 0000000..6ffc6ee
--- /dev/null
+++ b/traffic_portal/app/src/common/api/DivisionService.js
@@ -0,0 +1,70 @@
+/*
+ * 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 DivisionService = function(Restangular, locationUtils, messageModel) {
+
+    this.getDivisions = function(queryParams) {
+        return Restangular.all('divisions').getList(queryParams);
+    };
+
+    this.getDivision = function(id) {
+        return Restangular.one("divisions", id).get();
+    };
+
+    this.createDivision = function(division) {
+        return Restangular.service('divisions').post(division)
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Division created' } ], true);
+                    locationUtils.navigateToPath('/admin/divisions');
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.updateDivision = function(division) {
+        return division.put()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Division updated' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.deleteDivision = function(id) {
+        return Restangular.one("divisions", id).remove()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Division deleted' } ], true);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
+                }
+            );
+    };
+
+};
+
+DivisionService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
+module.exports = DivisionService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/HealthService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/HealthService.js b/traffic_portal/app/src/common/api/HealthService.js
deleted file mode 100644
index a7948cd..0000000
--- a/traffic_portal/app/src/common/api/HealthService.js
+++ /dev/null
@@ -1,45 +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 HealthService = function($http, $q, ENV) {
-
-    var displayTimoutError = function(options) {
-        var msg = (angular.isDefined(options.message)) ? options.message : 'Request timeout. Failed to load cache groups.';
-        if (options.status.toString().match(/^5\d[24]$/)) {
-            // 502 or 504
-            messageModel.setMessages([ { level: 'error', text: msg } ], false);
-        }
-    };
-
-    this.getCacheGroupHealth = function(entityId, ignoreLoadingBar, showTimeoutError) {
-        var deferred = $q.defer();
-        $http.get(ENV.apiEndpoint['1.2'] + "cdns/health.json", { ignoreLoadingBar: ignoreLoadingBar })
-            .success(function(result) {
-                deferred.resolve(result.response);
-            })
-            .error(function(fault, status) {
-                if (showTimeoutError) displayTimoutError({ status: status });
-                deferred.reject();
-            });
-
-        return deferred.promise;
-    };
-
-};
-
-HealthService.$inject = ['$http', '$q', 'ENV'];
-module.exports = HealthService;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/HttpService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/HttpService.js b/traffic_portal/app/src/common/api/HttpService.js
new file mode 100644
index 0000000..a74b7ff
--- /dev/null
+++ b/traffic_portal/app/src/common/api/HttpService.js
@@ -0,0 +1,89 @@
+/*
+ * 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 HttpService = function($http, $q) {
+
+    this.get = function(resource) {
+        var deferred = $q.defer();
+
+        $http.get(resource)
+            .then(
+                function(result) {
+                    deferred.resolve(result);
+                },
+                function(fault) {
+                    deferred.reject(fault);
+                }
+            );
+
+        return deferred.promise;
+    };
+
+    this.post = function(resource, payload) {
+        var deferred = $q.defer();
+
+        $http.post(resource, payload)
+            .then(
+                function(result) {
+                    deferred.resolve(result);
+                },
+                function(fault) {
+                    deferred.reject(fault);
+                }
+            );
+
+        return deferred.promise;
+    };
+
+    this.put = function(resource, payload) {
+        var deferred = $q.defer();
+
+        $http.put(resource, payload)
+            .then(
+                function(result) {
+                    deferred.resolve(result.response);
+                },
+                function(fault) {
+                    deferred.reject(fault);
+                }
+            );
+
+        return deferred.promise;
+    };
+
+    this.delete = function(resource) {
+        var deferred = $q.defer();
+
+        $http.delete(resource)
+            .then(
+                function(result) {
+                    deferred.resolve(result.response);
+                },
+                function(fault) {
+                    deferred.reject(fault);
+                }
+            );
+
+        return deferred.promise;
+    };
+
+};
+
+HttpService.$inject = ['$http', '$q'];
+module.exports = HttpService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/JobService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/JobService.js b/traffic_portal/app/src/common/api/JobService.js
new file mode 100644
index 0000000..ab05d30
--- /dev/null
+++ b/traffic_portal/app/src/common/api/JobService.js
@@ -0,0 +1,33 @@
+/*
+ * 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 JobService = function(Restangular) {
+
+	this.getJobs = function(queryParams) {
+		return Restangular.all('jobs').getList(queryParams);
+	};
+
+	this.createJob = function(job) {
+		return Restangular.service('user/current/jobs').post(job);
+	};
+
+};
+
+JobService.$inject = ['Restangular'];
+module.exports = JobService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/ParameterService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/ParameterService.js b/traffic_portal/app/src/common/api/ParameterService.js
new file mode 100644
index 0000000..21223f2
--- /dev/null
+++ b/traffic_portal/app/src/common/api/ParameterService.js
@@ -0,0 +1,82 @@
+/*
+ * 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 ParameterService = function(Restangular, locationUtils, messageModel) {
+
+    this.getParameters = function(queryParams) {
+        return Restangular.all('parameters').getList(queryParams);
+    };
+
+    this.getParameter = function(id) {
+        return Restangular.one("parameters", id).get();
+    };
+
+    this.createParameter = function(parameter) {
+        return Restangular.service('parameters').post(parameter)
+            .then(
+            function() {
+                messageModel.setMessages([ { level: 'success', text: 'Parameter created' } ], true);
+                locationUtils.navigateToPath('/admin/parameters');
+            },
+            function(fault) {
+                messageModel.setMessages(fault.data.alerts, false);
+            }
+        );
+    };
+
+    this.updateParameter = function(parameter) {
+        return parameter.put()
+            .then(
+            function() {
+                messageModel.setMessages([ { level: 'success', text: 'Parameter updated' } ], false);
+            },
+            function(fault) {
+                messageModel.setMessages(fault.data.alerts, false);
+            }
+        );
+    };
+
+    this.deleteParameter = function(id) {
+        return Restangular.one("parameters", id).remove()
+            .then(
+            function() {
+                messageModel.setMessages([ { level: 'success', text: 'Parameter deleted' } ], true);
+            },
+            function(fault) {
+                messageModel.setMessages(fault.data.alerts, true);
+            }
+        );
+    };
+
+    this.getProfileParameters = function(profileId) {
+        return Restangular.one('profiles', profileId).getList('parameters');
+    };
+
+    this.getProfileUnassignedParams = function(profileId) {
+        return Restangular.one('profiles', profileId).getList('unassigned_parameters');
+    };
+
+    this.getCacheGroupUnassignedParams = function(cgId) {
+        return Restangular.one('cachegroups', cgId).getList('unassigned_parameters');
+    };
+
+};
+
+ParameterService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
+module.exports = ParameterService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/PhysLocationService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/PhysLocationService.js b/traffic_portal/app/src/common/api/PhysLocationService.js
new file mode 100644
index 0000000..9ddf07a
--- /dev/null
+++ b/traffic_portal/app/src/common/api/PhysLocationService.js
@@ -0,0 +1,71 @@
+/*
+ * 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 PhysLocationService = function(Restangular, locationUtils, messageModel) {
+
+    this.getPhysLocations = function(queryParams) {
+        return Restangular.all('phys_locations').getList(queryParams);
+    };
+
+    this.getPhysLocation = function(id) {
+        return Restangular.one("phys_locations", id).get();
+    };
+
+    this.createPhysLocation = function(physLocation) {
+        return Restangular.service('phys_locations').post(physLocation)
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Physical location created' } ], true);
+                    locationUtils.navigateToPath('/admin/phys-locations');
+
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.updatePhysLocation = function(physLocation) {
+        return physLocation.put()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Physical location updated' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.deletePhysLocation = function(id) {
+        return Restangular.one("phys_locations", id).remove()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Physical location deleted' } ], true);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
+                }
+            );
+    };
+
+};
+
+PhysLocationService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
+module.exports = PhysLocationService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/PortalService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/PortalService.js b/traffic_portal/app/src/common/api/PortalService.js
deleted file mode 100644
index baadf8e..0000000
--- a/traffic_portal/app/src/common/api/PortalService.js
+++ /dev/null
@@ -1,43 +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 PortalService = function($http, $q) {
-
-    this.getReleaseVersionInfo = function() {
-        var deferred = $q.defer();
-        $http.get('traffic_portal_release.json')
-            .success(function(result) {
-                deferred.resolve(result);
-            });
-
-        return deferred.promise;
-    };
-
-    this.getProperties = function() {
-        var deferred = $q.defer();
-        $http.get('traffic_portal_properties.json')
-            .success(function(result) {
-                deferred.resolve(result.properties);
-            });
-
-        return deferred.promise;
-    };
-
-};
-
-PortalService.$inject = ['$http', '$q'];
-module.exports = PortalService;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/ProfileParameterService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/ProfileParameterService.js b/traffic_portal/app/src/common/api/ProfileParameterService.js
new file mode 100644
index 0000000..a81678d
--- /dev/null
+++ b/traffic_portal/app/src/common/api/ProfileParameterService.js
@@ -0,0 +1,49 @@
+/*
+ * 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 ProfileParameterService = function(Restangular, httpService, messageModel, ENV) {
+
+	this.unlinkProfileParameter = function(profileId, paramId) {
+		return httpService.delete(ENV.api['root'] + 'profileparameters/' + profileId + '/' + paramId)
+			.then(
+				function() {
+					messageModel.setMessages([ { level: 'success', text: 'Profile and parameter were unlinked.' } ], false);
+				},
+				function(fault) {
+					messageModel.setMessages(fault.data.alerts, true);
+				}
+			);
+	};
+
+	this.linkProfileParameters = function(profileParamMappings) {
+		return Restangular.service('profileparameters').post(profileParamMappings)
+			.then(
+				function() {
+					messageModel.setMessages([ { level: 'success', text: 'Parameters linked to profile' } ], false);
+				},
+				function(fault) {
+					messageModel.setMessages(fault.data.alerts, false);
+				}
+			);
+	};
+
+};
+
+ProfileParameterService.$inject = ['Restangular', 'httpService', 'messageModel', 'ENV'];
+module.exports = ProfileParameterService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/ProfileService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/ProfileService.js b/traffic_portal/app/src/common/api/ProfileService.js
new file mode 100644
index 0000000..d7c9df9
--- /dev/null
+++ b/traffic_portal/app/src/common/api/ProfileService.js
@@ -0,0 +1,79 @@
+/*
+ * 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 ProfileService = function(Restangular, locationUtils, messageModel) {
+
+    this.getProfiles = function(queryParams) {
+        return Restangular.all('profiles').getList(queryParams);
+    };
+
+    this.getProfile = function(id) {
+        return Restangular.one("profiles", id).get();
+    };
+
+    this.createProfile = function(profile) {
+        return Restangular.service('profiles').post(profile)
+            .then(
+            function() {
+                messageModel.setMessages([ { level: 'success', text: 'Profile created' } ], true);
+                locationUtils.navigateToPath('/admin/profiles');
+            },
+            function(fault) {
+                messageModel.setMessages(fault.data.alerts, false);
+            }
+        );
+    };
+
+    this.updateProfile = function(profile) {
+        return profile.put()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Profile updated' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+        );
+    };
+
+    this.deleteProfile = function(id) {
+        return Restangular.one("profiles", id).remove()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Profile deleted' } ], true);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
+                }
+        );
+    };
+
+    this.getParameterProfiles = function(paramId) {
+        return Restangular.one('parameters', paramId).getList('profiles');
+    };
+
+    this.getParamUnassignedProfiles = function(paramId) {
+        return Restangular.one('parameters', paramId).getList('unassigned_profiles');
+    };
+
+
+};
+
+ProfileService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
+module.exports = ProfileService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/RegexService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/RegexService.js b/traffic_portal/app/src/common/api/RegexService.js
new file mode 100644
index 0000000..fcd3a64
--- /dev/null
+++ b/traffic_portal/app/src/common/api/RegexService.js
@@ -0,0 +1,29 @@
+/*
+ * 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 RegexService = function(Restangular, locationUtils, messageModel) {
+
+	this.getRegexes = function(dsId) {
+		return Restangular.all('deliveryservices_regexes').getList({ dsId: dsId });
+	};
+
+};
+
+RegexService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
+module.exports = RegexService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/RegionService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/RegionService.js b/traffic_portal/app/src/common/api/RegionService.js
new file mode 100644
index 0000000..d8d87e9
--- /dev/null
+++ b/traffic_portal/app/src/common/api/RegionService.js
@@ -0,0 +1,69 @@
+/*
+ * 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 RegionService = function(Restangular, messageModel) {
+
+    this.getRegions = function(queryParams) {
+        return Restangular.all('regions').getList(queryParams);
+    };
+
+    this.getRegion = function(id) {
+        return Restangular.one("regions", id).get();
+    };
+
+    this.createRegion = function(region) {
+        return Restangular.service('regions').post(region)
+            .then(
+            function() {
+                messageModel.setMessages([ { level: 'success', text: 'Region created' } ], true);
+            },
+            function(fault) {
+                messageModel.setMessages(fault.data.alerts, false);
+            }
+        );
+    };
+
+    this.updateRegion = function(region) {
+        return region.put()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Region updated' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.deleteRegion = function(id) {
+        return Restangular.one("regions", id).remove()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Region deleted' } ], true);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
+                }
+            );
+    };
+
+};
+
+RegionService.$inject = ['Restangular', 'messageModel'];
+module.exports = RegionService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/RoleService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/RoleService.js b/traffic_portal/app/src/common/api/RoleService.js
new file mode 100644
index 0000000..bcd9b3b
--- /dev/null
+++ b/traffic_portal/app/src/common/api/RoleService.js
@@ -0,0 +1,57 @@
+/*
+ * 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 RoleService = function(Restangular, messageModel) {
+
+    this.getRoles = function(queryParams) {
+        return Restangular.all('roles').getList(queryParams);
+    };
+
+    this.getRole = function(id) {
+        return Restangular.one("roles", id).get();
+    };
+
+    this.updateRole = function(role) {
+        return role.put()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Role updated' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+        );
+    };
+
+    this.deleteRole = function(id) {
+        return Restangular.one("roles", id).remove()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Role deleted' } ], true);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
+                }
+        );
+    };
+
+};
+
+RoleService.$inject = ['Restangular', 'messageModel'];
+module.exports = RoleService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/ServerService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/ServerService.js b/traffic_portal/app/src/common/api/ServerService.js
new file mode 100644
index 0000000..3aaffed
--- /dev/null
+++ b/traffic_portal/app/src/common/api/ServerService.js
@@ -0,0 +1,138 @@
+/*
+ * 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 ServerService = function($http, $q, Restangular, locationUtils, messageModel, ENV) {
+
+    this.getServers = function(queryParams) {
+        return Restangular.all('servers').getList(queryParams);
+    };
+
+    this.getServer = function(id) {
+        return Restangular.one("servers", id).get();
+    };
+
+    this.createServer = function(server) {
+        return Restangular.service('servers').post(server)
+            .then(
+                function(response) {
+                    messageModel.setMessages([ { level: 'success', text: 'Server created' } ], true);
+                    locationUtils.navigateToPath('/configure/servers/' + response.id);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.updateServer = function(server) {
+        return server.put()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Server updated' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.deleteServer = function(id) {
+        return Restangular.one("servers", id).remove()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Server deleted' } ], true);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
+                }
+            );
+    };
+
+    this.getDeliveryServiceServers = function(dsId) {
+        return Restangular.one('deliveryservices', dsId).getList('servers');
+    };
+
+    this.getUnassignedDeliveryServiceServers = function(dsId) {
+        return Restangular.one('deliveryservices', dsId).getList('servers/unassigned');
+    };
+
+    this.getEligibleDeliveryServiceServers = function(dsId) {
+        return Restangular.one('deliveryservices', dsId).getList('servers/eligible');
+    };
+
+    this.queueServerUpdates = function(id) {
+        return Restangular.one("servers", id).customPOST( { action: "queue"}, "queue_update" )
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Queued server updates' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.clearServerUpdates = function(id) {
+        return Restangular.one("servers", id).customPOST( { action: "dequeue"}, "queue_update" )
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Cleared server updates' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.getStatusCount = function() {
+        var request = $q.defer();
+
+        $http.get(ENV.api['root'] + "servers/status")
+            .then(
+                function(result) {
+                    request.resolve(result.data.response);
+                },
+                function() {
+                    request.reject();
+                }
+            );
+
+        return request.promise;
+    };
+
+    this.updateStatus = function(id, payload) {
+        var request = $q.defer();
+
+        $http.put(ENV.api['root'] + "servers/" + id + "/status", payload)
+            .then(
+                function(result) {
+                    request.resolve(result);
+                },
+                function(fault) {
+                    request.reject(fault);
+                }
+            );
+
+        return request.promise;
+    };
+
+};
+
+ServerService.$inject = ['$http', '$q', 'Restangular', 'locationUtils', 'messageModel', 'ENV'];
+module.exports = ServerService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/StaticDnsEntryService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/StaticDnsEntryService.js b/traffic_portal/app/src/common/api/StaticDnsEntryService.js
new file mode 100644
index 0000000..aa56365
--- /dev/null
+++ b/traffic_portal/app/src/common/api/StaticDnsEntryService.js
@@ -0,0 +1,29 @@
+/*
+ * 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 StaticDnsEntryService = function(Restangular) {
+
+	this.getStaticDnsEntries = function(queryParams) {
+		return Restangular.all('staticdnsentries').getList(queryParams);
+	};
+
+};
+
+StaticDnsEntryService.$inject = ['Restangular'];
+module.exports = StaticDnsEntryService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/StatsService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/StatsService.js b/traffic_portal/app/src/common/api/StatsService.js
deleted file mode 100644
index 98ab370..0000000
--- a/traffic_portal/app/src/common/api/StatsService.js
+++ /dev/null
@@ -1,159 +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 StatsService = function($http, $q, messageModel, ENV) {
-
-    var edgeBandwidthRequest,
-        edgeBandwidthSummaryRequest;
-
-    var edgeTransactionsRequest,
-        edgeTransactionsSummaryRequest;
-
-    var retentionPeriodInDays; // used as an influxdb override, leave null if no override
-
-    var displayTimoutError = function(options) {
-        var msg = (angular.isDefined(options.message)) ? options.message : 'Request timeout. Please narrow your chart window.';
-        if (options.status.toString().match(/^5\d[24]$/)) {
-            // 502 or 504
-            messageModel.setMessages([ { level: 'error', text: msg } ], false);
-        }
-    };
-
-    this.getEdgeBandwidthBatch = function(deliveryService, start, end, interval, exclude, ignoreLoadingBar, showError) {
-        var deferred = $q.defer();
-
-        var url = ENV.apiEndpoint['1.2'] + "deliveryservice_stats.json",
-            params = { deliveryServiceName: deliveryService.xmlId, metricType: 'kbps', serverType: 'edge', startDate: start.seconds(00).format(), endDate: end.seconds(00).format(), interval: interval, exclude: exclude, retentionPeriodInDays: retentionPeriodInDays };
-
-        $http.get(url, { params: params, ignoreLoadingBar: ignoreLoadingBar })
-            .success(function(result) {
-                deferred.resolve(result.response);
-            })
-            .error(function(fault, status) {
-                if (showError) displayTimoutError({ status: status });
-                deferred.reject();
-            });
-
-        return deferred.promise;
-    };
-
-    this.getEdgeBandwidth = function(deliveryService, start, end, interval, exclude, ignoreLoadingBar, showError) {
-        if (edgeBandwidthRequest) {
-            edgeBandwidthRequest.reject();
-        }
-        edgeBandwidthRequest = $q.defer();
-
-        var url = ENV.apiEndpoint['1.2'] + "deliveryservice_stats.json",
-            params = { deliveryServiceName: deliveryService.xmlId, metricType: 'kbps', serverType: 'edge', startDate: start.seconds(00).format(), endDate: end.seconds(00).format(), interval: interval, exclude: exclude, retentionPeriodInDays: retentionPeriodInDays};
-
-        $http.get(url, { params: params, timeout: edgeBandwidthRequest.promise, ignoreLoadingBar: ignoreLoadingBar })
-            .success(function(result) {
-                edgeBandwidthRequest.resolve(result.response);
-            })
-            .error(function(fault, status) {
-                if (showError) displayTimoutError({ status: status });
-                edgeBandwidthRequest.reject();
-            });
-
-        return edgeBandwidthRequest.promise;
-    };
-
-    this.getEdgeBandwidthSummary = function(deliveryService, start, end, interval, exclude, ignoreLoadingBar, showError) {
-        if (edgeBandwidthSummaryRequest) {
-            edgeBandwidthSummaryRequest.reject();
-        }
-        edgeBandwidthSummaryRequest = $q.defer();
-
-        var url = ENV.apiEndpoint['1.2'] + "deliveryservice_stats.json",
-            params = { deliveryServiceName: deliveryService.xmlId, metricType: 'kbps', serverType: 'edge', startDate: start.seconds(00).format(), endDate: end.seconds(00).format(), interval: interval, exclude: exclude, retentionPeriodInDays: retentionPeriodInDays };
-
-        $http.get(url, { params: params, timeout: edgeBandwidthSummaryRequest.promise, ignoreLoadingBar: ignoreLoadingBar })
-            .success(function(result) {
-                edgeBandwidthSummaryRequest.resolve(result.response);
-            })
-            .error(function(fault, status) {
-                if (showError) displayTimoutError({ status: status });
-                edgeBandwidthSummaryRequest.reject();
-            });
-
-        return edgeBandwidthSummaryRequest.promise;
-    };
-
-    this.getEdgeTransactions = function(deliveryService, start, end, interval, exclude, ignoreLoadingBar, showError) {
-        if (edgeTransactionsRequest) {
-            edgeTransactionsRequest.reject();
-        }
-        edgeTransactionsRequest = $q.defer();
-
-        var url = ENV.apiEndpoint['1.2'] + "deliveryservice_stats.json",
-            params = { deliveryServiceName: deliveryService.xmlId, metricType: 'tps_total', serverType: 'edge', startDate: start.seconds(00).format(), endDate: end.seconds(00).format(), interval: interval, exclude: exclude, retentionPeriodInDays: retentionPeriodInDays };
-
-        $http.get(url, { params: params, timeout: edgeTransactionsRequest.promise, ignoreLoadingBar: ignoreLoadingBar })
-            .success(function(result) {
-                edgeTransactionsRequest.resolve(result.response);
-            })
-            .error(function(fault, status) {
-                if (showError) displayTimoutError({ status: status });
-                edgeTransactionsRequest.reject();
-            });
-
-        return edgeTransactionsRequest.promise;
-    };
-
-    this.getEdgeTransactionsSummary = function(deliveryService, start, end, interval, ignoreLoadingBar, showError) {
-        if (edgeTransactionsSummaryRequest) {
-            edgeTransactionsSummaryRequest.reject();
-        }
-        edgeTransactionsSummaryRequest = $q.defer();
-
-        var url = ENV.apiEndpoint['1.2'] + "deliveryservice_stats.json",
-            params = { deliveryServiceName: deliveryService.xmlId, metricType: 'tps_total', serverType: 'edge', startDate: start.seconds(00).format(), endDate: end.seconds(00).format(), interval: interval, exclude: 'series', retentionPeriodInDays: retentionPeriodInDays };
-
-        $http.get(url, { params: params, timeout: edgeTransactionsSummaryRequest.promise, ignoreLoadingBar: ignoreLoadingBar })
-            .success(function(result) {
-                edgeTransactionsSummaryRequest.resolve(result.response);
-            })
-            .error(function(fault, status) {
-                if (showError) displayTimoutError({ status: status });
-                edgeTransactionsSummaryRequest.reject();
-            });
-
-        return edgeTransactionsSummaryRequest.promise;
-    };
-
-    this.getEdgeTransactionsByStatusGroup = function(deliveryService, httpStatus, start, end, interval, exclude, ignoreLoadingBar, showError) {
-        var request = $q.defer();
-
-        var url = ENV.apiEndpoint['1.2'] + "deliveryservice_stats.json",
-            params = { deliveryServiceName: deliveryService.xmlId, metricType: 'tps_' + httpStatus, serverType: 'edge', startDate: start.seconds(00).format(), endDate: end.seconds(00).format(), interval: interval, exclude: exclude, retentionPeriodInDays: retentionPeriodInDays };
-
-        $http.get(url, { params: params, ignoreLoadingBar: ignoreLoadingBar })
-            .success(function(result) {
-                request.resolve(result.response);
-            })
-            .error(function(fault, status) {
-                if (showError) displayTimoutError({ status: status });
-                request.reject();
-            });
-
-        return request.promise;
-    };
-
-};
-
-StatsService.$inject = ['$http', '$q', 'messageModel', 'ENV'];
-module.exports = StatsService;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/StatusService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/StatusService.js b/traffic_portal/app/src/common/api/StatusService.js
new file mode 100644
index 0000000..dd656d8
--- /dev/null
+++ b/traffic_portal/app/src/common/api/StatusService.js
@@ -0,0 +1,70 @@
+/*
+ * 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 StatusService = function(Restangular, locationUtils, messageModel) {
+
+    this.getStatuses = function(queryParams) {
+        return Restangular.all('statuses').getList(queryParams);
+    };
+
+    this.getStatus = function(id) {
+        return Restangular.one("statuses", id).get();
+    };
+
+    this.createStatus = function(status) {
+        return Restangular.service('statuses').post(status)
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Status created' } ], true);
+                    locationUtils.navigateToPath('/admin/statuses');
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.updateStatus = function(status) {
+        return status.put()
+            .then(
+            function() {
+                messageModel.setMessages([ { level: 'success', text: 'Status updated' } ], false);
+            },
+            function(fault) {
+                messageModel.setMessages(fault.data.alerts, false);
+            }
+        );
+    };
+
+    this.deleteStatus = function(id) {
+        return Restangular.one("statuses", id).remove()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Status deleted' } ], true);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
+                }
+        );
+    };
+
+};
+
+StatusService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
+module.exports = StatusService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/TenantService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/TenantService.js b/traffic_portal/app/src/common/api/TenantService.js
new file mode 100644
index 0000000..b350033
--- /dev/null
+++ b/traffic_portal/app/src/common/api/TenantService.js
@@ -0,0 +1,69 @@
+/*
+ * 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 TenantService = function(Restangular, messageModel) {
+
+    this.getTenants = function(queryParams) {
+        return Restangular.all('tenants').getList(queryParams);
+    };
+
+    this.getTenant = function(id) {
+        return Restangular.one("tenants", id).get();
+    };
+
+    this.createTenant = function(tenant) {
+        return Restangular.service('tenants').post(tenant)
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Tenant created' } ], true);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+        );
+    };
+
+    this.updateTenant = function(tenant) {
+        return tenant.put()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Tenant updated' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.deleteTenant = function(id) {
+        return Restangular.one("tenants", id).remove()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Tenant deleted' } ], true);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
+                }
+            );
+    };
+
+};
+
+TenantService.$inject = ['Restangular', 'messageModel'];
+module.exports = TenantService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/TrafficPortalService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/TrafficPortalService.js b/traffic_portal/app/src/common/api/TrafficPortalService.js
new file mode 100644
index 0000000..857fcbf
--- /dev/null
+++ b/traffic_portal/app/src/common/api/TrafficPortalService.js
@@ -0,0 +1,57 @@
+/*
+ * 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 TrafficPortalService = function($http, $q) {
+
+    this.getReleaseVersionInfo = function() {
+        var deferred = $q.defer();
+        $http.get('traffic_portal_release.json')
+            .then(
+                function(result) {
+                    deferred.resolve(result);
+                },
+                function(fault) {
+                    deferred.reject(fault);
+                }
+            );
+
+        return deferred.promise;
+    };
+
+    this.dumpDB = function() {
+        // todo: need to fix this so it is not hard-coded
+        window.location = 'http://localhost:3000/api/1.2/dbdump';
+    };
+
+    this.getProperties = function() {
+        var deferred = $q.defer();
+        $http.get('traffic_portal_properties.json')
+            .then(
+                function(result) {
+                    deferred.resolve(result.data.properties);
+                }
+            );
+
+        return deferred.promise;
+    };
+
+};
+
+TrafficPortalService.$inject = ['$http', '$q'];
+module.exports = TrafficPortalService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/TypeService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/TypeService.js b/traffic_portal/app/src/common/api/TypeService.js
new file mode 100644
index 0000000..2ec57fd
--- /dev/null
+++ b/traffic_portal/app/src/common/api/TypeService.js
@@ -0,0 +1,70 @@
+/*
+ * 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 TypeService = function(Restangular, locationUtils, messageModel) {
+
+    this.getTypes = function(queryParams) {
+        return Restangular.all('types').getList(queryParams);
+    };
+
+    this.getType = function(id) {
+        return Restangular.one("types", id).get();
+    };
+
+    this.createType = function(type) {
+        return Restangular.service('types').post(type)
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Type created' } ], true);
+                    locationUtils.navigateToPath('/admin/types');
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
+    };
+
+    this.updateType = function(type) {
+        return type.put()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Type updated' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+        );
+    };
+
+    this.deleteType = function(id) {
+        return Restangular.one("types", id).remove()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Type deleted' } ], true);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
+                }
+        );
+    };
+
+};
+
+TypeService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
+module.exports = TypeService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/UserService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/UserService.js b/traffic_portal/app/src/common/api/UserService.js
old mode 100755
new mode 100644
index e393dfa..3b187a1
--- a/traffic_portal/app/src/common/api/UserService.js
+++ b/traffic_portal/app/src/common/api/UserService.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.
  */
 
-var UserService = function($http, $state, $q, $location, authService, userModel, messageModel, ENV) {
+var UserService = function(Restangular, $http, $location, $q, authService, httpService, locationUtils, userModel, messageModel, ENV) {
 
     var service = this;
 
@@ -32,74 +34,111 @@ var UserService = function($http, $state, $q, $location, authService, userModel,
                     }
                 );
         } else {
-            $http.get(ENV.apiEndpoint['1.2'] + "user/current.json")
-                .success(function(result) {
-                    userModel.setUser(result.response);
-                    deferred.resolve(result.response);
-                })
-                .error(function(fault) {
-                    deferred.reject(fault);
-                });
+            $http.get(ENV.api['root'] + "user/current")
+                .then(
+                    function(result) {
+                        userModel.setUser(result.data.response);
+                        deferred.resolve(result.data.response);
+                    },
+                    function(fault) {
+                        deferred.reject(fault);
+                    }
+                );
 
             return deferred.promise;
         }
     };
 
-    this.updateCurrentUser = function(userData) {
-        var deferred = $q.defer();
-        var user = _.omit(userData, 'loaded'); // let's pull the loaded key off of there
-        $http.post(ENV.apiEndpoint['1.2'] + "user/current/update", { user: user })
-            .success(function(result) {
-                userModel.setUser(userData);
-                messageModel.setMessages(result.alerts, false);
-                deferred.resolve(result);
-            })
-            .error(function(fault) {
-                if (angular.isDefined(fault.alerts)) {
-                    messageModel.setMessages(fault.alerts, false);
+    this.getUsers = function(queryParams) {
+        return Restangular.all('users').getList(queryParams);
+    };
+
+    this.getUser = function(id) {
+        return Restangular.one("users", id).get();
+    };
+
+    this.createUser = function(user) {
+        return Restangular.service('users').post(user)
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'User created' } ], true);
+                    locationUtils.navigateToPath('/admin/users');
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
                 }
-                deferred.reject();
-            });
+            );
+    };
 
-        return deferred.promise;
+    this.updateUser = function(user) {
+        return $http.put(ENV.api['root'] + "users/" + user.id, user)
+            .then(
+                function() {
+                    if (userModel.user.id == user.id) {
+                        // if you are updating the currently logged in user...
+                        userModel.setUser(user);
+                    }
+                    messageModel.setMessages([ { level: 'success', text: 'User updated' } ], false);
+                },
+                function() {
+                    messageModel.setMessages([ { level: 'error', text: 'User updated failed' } ], false);
+                }
+            );
+    };
+
+    this.deleteUser = function(id) {
+        return Restangular.one("users", id).remove()
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'User deleted' } ], true);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
+                }
+            );
     };
 
-    this.resetPassword = function(email) {
+    this.getUnassignedUserDeliveryServices = function(userId) {
         var deferred = $q.defer();
-        $http.post(
-                ENV.apiEndpoint['1.2'] + "user/reset_password", { email: email })
-            .success(function(result) {
-                messageModel.setMessages(result.alerts, false);
-                deferred.resolve(result);
-            })
-            .error(function(fault) {
-                if (angular.isDefined(fault.alerts)) {
-                    messageModel.setMessages(fault.alerts, false);
+
+        $http.get(ENV.api['root'] + "user/" + userId + "/deliveryservices/available")
+            .then(
+                function(result) {
+                    deferred.resolve(result.data.response);
+                },
+                function(fault) {
+                    deferred.reject(fault);
                 }
-                deferred.reject();
-            });
+            );
 
         return deferred.promise;
     };
 
-    this.createUserPurgeJob = function(jobParams) {
-        var deferred = $q.defer();
-        $http.post(ENV.apiEndpoint['1.2'] + "user/current/jobs", jobParams)
-            .success(function(result) {
-                messageModel.setMessages(result.alerts, false);
-                deferred.resolve(result);
-            })
-            .error(function(fault) {
-                if (angular.isDefined(fault.alerts)) {
-                    messageModel.setMessages(fault.alerts, false);
+    this.deleteUserDeliveryService = function(userId, dsId) {
+        return httpService.delete(ENV.api['root'] + 'deliveryservice_user/' + dsId + '/' + userId)
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'User and delivery service were unlinked.' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, true);
                 }
-                deferred.reject();
-            });
+            );
+    };
 
-        return deferred.promise;
+    this.assignUserDeliveryServices = function(userId, deliveryServices) {
+        return Restangular.service('deliveryservice_user').post( { userId: userId, deliveryServices: deliveryServices, replace: true } )
+            .then(
+                function() {
+                    messageModel.setMessages([ { level: 'success', text: 'Delivery services linked to user' } ], false);
+                },
+                function(fault) {
+                    messageModel.setMessages(fault.data.alerts, false);
+                }
+            );
     };
 
 };
 
-UserService.$inject = ['$http', '$state', '$q', '$location', 'authService', 'userModel', 'messageModel', 'ENV'];
-module.exports = UserService;
\ No newline at end of file
+UserService.$inject = ['Restangular', '$http', '$location', '$q', 'authService', 'httpService', 'locationUtils', 'userModel', 'messageModel', 'ENV'];
+module.exports = UserService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/api/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/api/index.js b/traffic_portal/app/src/common/api/index.js
old mode 100755
new mode 100644
index 8d8effe..1cfa851
--- a/traffic_portal/app/src/common/api/index.js
+++ b/traffic_portal/app/src/common/api/index.js
@@ -1,25 +1,46 @@
 /*
-
-
- 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.api', [])
     .service('authService', require('./AuthService'))
+    .service('asnService', require('./ASNService'))
+    .service('cacheGroupService', require('./CacheGroupService'))
+    .service('cacheGroupParameterService', require('./CacheGroupParameterService'))
+	.service('cacheStatsService', require('./CacheStatsService'))
+	.service('cdnService', require('./CDNService'))
+    .service('changeLogService', require('./ChangeLogService'))
     .service('deliveryServiceService', require('./DeliveryServiceService'))
-    .service('healthService', require('./HealthService'))
-    .service('portalService', require('./PortalService'))
-    .service('statsService', require('./StatsService'))
+	.service('deliveryServiceRegexService', require('./DeliveryServiceRegexService'))
+	.service('divisionService', require('./DivisionService'))
+    .service('httpService', require('./HttpService'))
+    .service('jobService', require('./JobService'))
+    .service('physLocationService', require('./PhysLocationService'))
+    .service('parameterService', require('./ParameterService'))
+    .service('profileService', require('./ProfileService'))
+    .service('profileParameterService', require('./ProfileParameterService'))
+    .service('roleService', require('./RoleService'))
+    .service('regionService', require('./RegionService'))
+    .service('serverService', require('./ServerService'))
+    .service('staticDnsEntryService', require('./StaticDnsEntryService'))
+    .service('statusService', require('./StatusService'))
+    .service('tenantService', require('./TenantService'))
+    .service('typeService', require('./TypeService'))
+    .service('trafficPortalService', require('./TrafficPortalService'))
     .service('userService', require('./UserService'))
-;
\ No newline at end of file
+;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/directives/enter/EnterDirective.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/directives/enter/EnterDirective.js b/traffic_portal/app/src/common/directives/enter/EnterDirective.js
deleted file mode 100644
index a2b49e3..0000000
--- a/traffic_portal/app/src/common/directives/enter/EnterDirective.js
+++ /dev/null
@@ -1,31 +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 EnterDirective = function() {
-    return function (scope, element, attrs) {
-        element.bind("keydown keypress", function (event) {
-            if(event.which === 13) {
-                scope.$apply(function (){
-                    scope.$eval(attrs.enter);
-                });
-                event.preventDefault();
-            }
-        });
-    };
-};
-
-module.exports = EnterDirective;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/directives/enter/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/directives/enter/index.js b/traffic_portal/app/src/common/directives/enter/index.js
deleted file mode 100644
index d141390..0000000
--- a/traffic_portal/app/src/common/directives/enter/index.js
+++ /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.
-
- */
-
-module.exports = angular.module('trafficPortal.directives.enter',[])
-    .directive('enter', require('./EnterDirective'))
-;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/directives/formattedDate/FormattedDateDirective.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/directives/formattedDate/FormattedDateDirective.js b/traffic_portal/app/src/common/directives/formattedDate/FormattedDateDirective.js
deleted file mode 100644
index 0d77baa..0000000
--- a/traffic_portal/app/src/common/directives/formattedDate/FormattedDateDirective.js
+++ /dev/null
@@ -1,34 +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 FormattedDateDirective = function(dateUtils) {
-    return {
-        link: function (scope, element, attrs, ctrl) {
-            ctrl.$formatters.unshift(function (modelValue) {
-                return dateUtils.dateFormat(modelValue, "mmm d yyyy h:MM tt (Z)")
-            });
-
-            ctrl.$parsers.unshift(function (viewValue) {
-                return dateUtils.dateFormat(modelValue, "mmm d yyyy h:MM tt (Z)")
-            });
-        },
-        restrict: 'A',
-        require: 'ngModel'
-    }
-};
-
-module.exports = FormattedDateDirective;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/directives/formattedDate/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/directives/formattedDate/index.js b/traffic_portal/app/src/common/directives/formattedDate/index.js
deleted file mode 100644
index d2c25ac..0000000
--- a/traffic_portal/app/src/common/directives/formattedDate/index.js
+++ /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.
-
- */
-
-module.exports = angular.module('trafficPortal.directives.formattedDate',[])
-    .directive('formattedDate', require('./FormattedDateDirective'))
-;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/directives/match/MatchDirective.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/directives/match/MatchDirective.js b/traffic_portal/app/src/common/directives/match/MatchDirective.js
index 5b4aac7..e174d30 100644
--- a/traffic_portal/app/src/common/directives/match/MatchDirective.js
+++ b/traffic_portal/app/src/common/directives/match/MatchDirective.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.
  */
 
 var MatchDirective = function() {



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/js/ng-map_1.17.6.min.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/js/ng-map_1.17.6.min.js b/traffic_ops/experimental/ui/app/src/assets/js/ng-map_1.17.6.min.js
deleted file mode 100644
index d6608ef..0000000
--- a/traffic_ops/experimental/ui/app/src/assets/js/ng-map_1.17.6.min.js
+++ /dev/null
@@ -1,26 +0,0 @@
-!function(e,t){"object"==typeof exports?module.exports=t(require("angular")):"function"==typeof define&&define.amd?define(["angular"],t):t(e.angular)}(this,function(angular){/**
- * AngularJS Google Maps Ver. 1.17.3
- *
- * The MIT License (MIT)
- * 
- * Copyright (c) 2014, 2015, 1016 Allen Kim
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- * the Software, and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-return angular.module("ngMap",[]),function(){"use strict";var e,t=function(t,n,o,i,a,r,s){e=a;var p=this;p.mapOptions,p.mapEvents,p.eventListeners,p.addObject=function(e,t){if(p.map){p.map[e]=p.map[e]||{};var n=Object.keys(p.map[e]).length;p.map[e][t.id||n]=t,p.map instanceof google.maps.Map&&("infoWindows"!=e&&t.setMap&&t.setMap&&t.setMap(p.map),t.centered&&t.position&&p.map.setCenter(t.position),"markers"==e&&p.objectChanged("markers"),"customMarkers"==e&&p.objectChanged("customMarkers"))}},p.deleteObject=function(e,t){if(t.map){var n=t.map[e];for(var o in n)n[o]===t&&(google.maps.event.clearInstanceListeners(t),delete n[o]);t.map&&t.setMap&&t.setMap(null),"markers"==e&&p.objectChanged("markers"),"customMarkers"==e&&p.objectChanged("customMarkers")}},p.observeAttrSetObj=function(t,n,o){if(n.noWatcher)return!1;for(var i=e.getAttrsToObserve(t),a=0;a<i.length;a++){var s=i[a];n.$observe(s,r.observeAndSet(s,o))}},p.zoomToIncludeMarkers=function(){if(null!=p.map.markers&&Object.keys(p.m
 ap.markers).length>0||null!=p.map.customMarkers&&Object.keys(p.map.customMarkers).length>0){var e=new google.maps.LatLngBounds;for(var t in p.map.markers)e.extend(p.map.markers[t].getPosition());for(var n in p.map.customMarkers)e.extend(p.map.customMarkers[n].getPosition());p.mapOptions.maximumZoom&&(p.enableMaximumZoomCheck=!0),p.map.fitBounds(e)}},p.objectChanged=function(e){!p.map||"markers"!=e&&"customMarkers"!=e||"auto"!=p.map.zoomToIncludeMarkers||p.zoomToIncludeMarkers()},p.initializeMap=function(){var a=p.mapOptions,u=p.mapEvents,l=p.map;if(p.map=s.getMapInstance(n[0]),r.setStyle(n[0]),l){var g=e.filter(o),d=e.getOptions(g),m=e.getControlOptions(g);a=angular.extend(d,m);for(var f in l){var v=l[f];if("object"==typeof v)for(var y in v)p.addObject(f,v[y])}p.map.showInfoWindow=p.showInfoWindow,p.map.hideInfoWindow=p.hideInfoWindow}a.zoom=a.zoom||15;var h=a.center;if(!a.center||"string"==typeof h&&h.match(/\{\{.*\}\}/))a.center=new google.maps.LatLng(0,0);else if(!(h instanceof g
 oogle.maps.LatLng)){var M=a.center;delete a.center,r.getGeoLocation(M,a.geoLocationOptions).then(function(e){p.map.setCenter(e);var n=a.geoCallback;n&&i(n)(t)},function(){a.geoFallbackCenter&&p.map.setCenter(a.geoFallbackCenter)})}p.map.setOptions(a);for(var b in u){var O=u[b],w=google.maps.event.addListener(p.map,b,O);p.eventListeners[b]=w}p.observeAttrSetObj(c,o,p.map),p.singleInfoWindow=a.singleInfoWindow,google.maps.event.trigger(p.map,"resize"),google.maps.event.addListenerOnce(p.map,"idle",function(){r.addMap(p),a.zoomToIncludeMarkers&&p.zoomToIncludeMarkers(),t.map=p.map,t.$emit("mapInitialized",p.map),o.mapInitialized&&i(o.mapInitialized)(t,{map:p.map})}),a.zoomToIncludeMarkers&&a.maximumZoom&&google.maps.event.addListener(p.map,"zoom_changed",function(){1==p.enableMaximumZoomCheck&&(p.enableMaximumZoomCheck=!1,google.maps.event.addListenerOnce(p.map,"bounds_changed",function(){p.map.setZoom(Math.min(a.maximumZoom,p.map.getZoom()))}))})},t.google=google;var c=e.orgAttributes
 (n),u=e.filter(o),l=e.getOptions(u,{scope:t}),g=e.getControlOptions(u),d=angular.extend(l,g),m=e.getEvents(t,u);if(Object.keys(m).length&&void 0,p.mapOptions=d,p.mapEvents=m,p.eventListeners={},l.lazyInit){if(o.id&&0===o.id.indexOf("{{",0)&&-1!==o.id.indexOf("}}",o.id.length-"}}".length))var f=o.id.slice(2,-2),v=i(f)(t);else var v=o.id;p.map={id:v},r.addMap(p)}else p.initializeMap();l.triggerResize&&google.maps.event.trigger(p.map,"resize"),n.bind("$destroy",function(){s.returnMapInstance(p.map),r.deleteMap(p)})};t.$inject=["$scope","$element","$attrs","$parse","Attr2MapOptions","NgMap","NgMapPool"],angular.module("ngMap").controller("__MapController",t)}(),function(){"use strict";var e,t=function(t,o,i,a){a=a[0]||a[1];var r=e.orgAttributes(o),s=e.filter(i),p=e.getOptions(s,{scope:t}),c=e.getEvents(t,s),u=n(p,c);a.addObject("bicyclingLayers",u),a.observeAttrSetObj(r,i,u),o.bind("$destroy",function(){a.deleteObject("bicyclingLayers",u)})},n=function(e,t){var n=new google.maps.Bicycli
 ngLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n},o=function(n){return e=n,{restrict:"E",require:["?^map","?^ngMap"],link:t}};o.$inject=["Attr2MapOptions"],angular.module("ngMap").directive("bicyclingLayer",o)}(),function(){"use strict";var e,t,n,o=function(n,o,i,a){a=a[0]||a[1];var r=e.filter(i),s=e.getOptions(r,{scope:n}),p=e.getEvents(n,r),c=o[0].parentElement.removeChild(o[0]);t(c.innerHTML.trim())(n);for(var u in p)google.maps.event.addDomListener(c,u,p[u]);a.addObject("customControls",c);var l=s.position;a.map.controls[google.maps.ControlPosition[l]].push(c),o.bind("$destroy",function(){a.deleteObject("customControls",c)})},i=function(i,a,r){return e=i,t=a,n=r,{restrict:"E",require:["?^map","?^ngMap"],link:o}};i.$inject=["Attr2MapOptions","$compile","NgMap"],angular.module("ngMap").directive("customControl",i)}(),function(){"use strict";var e,t,n,o,i=function(e){e=e||{},this.el=document.createElement("div"),this.el.style.display="inline-block",this.el
 .style.visibility="hidden",this.visible=!0;for(var t in e)this[t]=e[t]},a=function(){i.prototype=new google.maps.OverlayView,i.prototype.setContent=function(e,t){this.el.innerHTML=e,this.el.style.position="absolute",t&&n(angular.element(this.el).contents())(t)},i.prototype.getDraggable=function(){return this.draggable},i.prototype.setDraggable=function(e){this.draggable=e},i.prototype.getPosition=function(){return this.position},i.prototype.setPosition=function(e){if(e&&(this.position=e),this.getProjection()&&"function"==typeof this.position.lng){var n=this.getProjection().fromLatLngToDivPixel(this.position),o=this,i=function(){var e=Math.round(n.x-o.el.offsetWidth/2),t=Math.round(n.y-o.el.offsetHeight-10);o.el.style.left=e+"px",o.el.style.top=t+"px",o.el.style.visibility="visible"};o.el.offsetWidth&&o.el.offsetHeight?i():t(i,300)}},i.prototype.setZIndex=function(e){e&&(this.zIndex=e),this.el.style.zIndex=this.zIndex},i.prototype.getVisible=function(){return this.visible},i.prototyp
 e.setVisible=function(e){this.el.style.display=e?"inline-block":"none",this.visible=e},i.prototype.addClass=function(e){var t=this.el.className.trim().split(" ");-1==t.indexOf(e)&&t.push(e),this.el.className=t.join(" ")},i.prototype.removeClass=function(e){var t=this.el.className.split(" "),n=t.indexOf(e);n>-1&&t.splice(n,1),this.el.className=t.join(" ")},i.prototype.onAdd=function(){this.getPanes().overlayMouseTarget.appendChild(this.el)},i.prototype.draw=function(){this.setPosition(),this.setZIndex(this.zIndex),this.setVisible(this.visible)},i.prototype.onRemove=function(){this.el.parentNode.removeChild(this.el)}},r=function(n,a){return function(r,s,p,c){c=c[0]||c[1];var u=e.orgAttributes(s),l=e.filter(p),g=e.getOptions(l,{scope:r}),d=e.getEvents(r,l);s[0].style.display="none";var m=new i(g);t(function(){r.$watch("["+a.join(",")+"]",function(){m.setContent(n,r)},!0),m.setContent(s[0].innerHTML,r);var e=s[0].firstElementChild.className;m.addClass("custom-marker"),m.addClass(e),g.po
 sition instanceof google.maps.LatLng||o.getGeoLocation(g.position).then(function(e){m.setPosition(e)})});for(var f in d)google.maps.event.addDomListener(m.el,f,d[f]);c.addObject("customMarkers",m),c.observeAttrSetObj(u,p,m),s.bind("$destroy",function(){c.deleteObject("customMarkers",m)})}},s=function(i,s,p,c){return e=p,t=i,n=s,o=c,{restrict:"E",require:["?^map","?^ngMap"],compile:function(e){a(),e[0].style.display="none";var t=e.html(),n=t.match(/{{([^}]+)}}/g),o=[];return(n||[]).forEach(function(e){var t=e.replace("{{","").replace("}}","");-1==e.indexOf("::")&&-1==e.indexOf("this.")&&-1==o.indexOf(t)&&o.push(e.replace("{{","").replace("}}",""))}),r(t,o)}}};s.$inject=["$timeout","$compile","Attr2MapOptions","NgMap"],angular.module("ngMap").directive("customMarker",s)}(),function(){"use strict";var e,t,n,o=function(e,t){e.panel&&(e.panel=document.getElementById(e.panel)||document.querySelector(e.panel));var n=new google.maps.DirectionsRenderer(e);for(var o in t)google.maps.event.add
 Listener(n,o,t[o]);return n},i=function(e,o){var i=new google.maps.DirectionsService,a=o;a.travelMode=a.travelMode||"DRIVING";var r=["origin","destination","travelMode","transitOptions","unitSystem","durationInTraffic","waypoints","optimizeWaypoints","provideRouteAlternatives","avoidHighways","avoidTolls","region"];for(var s in a)-1===r.indexOf(s)&&delete a[s];a.waypoints&&("[]"==a.waypoints||""===a.waypoints)&&delete a.waypoints;var p=function(n){i.route(n,function(n,o){o==google.maps.DirectionsStatus.OK&&t(function(){e.setDirections(n)})})};a.origin&&a.destination&&("current-location"==a.origin?n.getCurrentPosition().then(function(e){a.origin=new google.maps.LatLng(e.coords.latitude,e.coords.longitude),p(a)}):"current-location"==a.destination?n.getCurrentPosition().then(function(e){a.destination=new google.maps.LatLng(e.coords.latitude,e.coords.longitude),p(a)}):p(a))},a=function(a,r,s,p){var c=a;e=p,t=r,n=s;var u=function(n,a,r,s){s=s[0]||s[1];var p=c.orgAttributes(a),u=c.filter(
 r),l=c.getOptions(u,{scope:n}),g=c.getEvents(n,u),d=c.getAttrsToObserve(p),m=o(l,g);s.addObject("directionsRenderers",m),d.forEach(function(e){!function(e){r.$observe(e,function(n){if("panel"==e)t(function(){var e=document.getElementById(n)||document.querySelector(n);e&&m.setPanel(e)});else if(l[e]!==n){var o=c.toOptionValue(n,{key:e});l[e]=o,i(m,l)}})}(e)}),e.getMap().then(function(){i(m,l)}),a.bind("$destroy",function(){s.deleteObject("directionsRenderers",m)})};return{restrict:"E",require:["?^map","?^ngMap"],link:u}};a.$inject=["Attr2MapOptions","$timeout","NavigatorGeolocation","NgMap"],angular.module("ngMap").directive("directions",a)}(),function(){"use strict";angular.module("ngMap").directive("drawingManager",["Attr2MapOptions",function(e){var t=e;return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,n,o,i){i=i[0]||i[1];var a=t.filter(o),r=t.getOptions(a,{scope:e}),s=t.getControlOptions(a),p=t.getEvents(e,a),c=new google.maps.drawing.DrawingManager({drawingMode:r.dr
 awingmode,drawingControl:r.drawingcontrol,drawingControlOptions:s.drawingControlOptions,circleOptions:r.circleoptions,markerOptions:r.markeroptions,polygonOptions:r.polygonoptions,polylineOptions:r.polylineoptions,rectangleOptions:r.rectangleoptions});o.$observe("drawingControlOptions",function(e){c.drawingControlOptions=t.getControlOptions({drawingControlOptions:e}).drawingControlOptions,c.setDrawingMode(null),c.setMap(i.map)});for(var u in p)google.maps.event.addListener(c,u,p[u]);i.addObject("mapDrawingManager",c),n.bind("$destroy",function(){i.deleteObject("mapDrawingManager",c)})}}}])}(),function(){"use strict";angular.module("ngMap").directive("dynamicMapsEngineLayer",["Attr2MapOptions",function(e){var t=e,n=function(e,t){var n=new google.maps.visualization.DynamicMapsEngineLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n};return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,o,i,a){a=a[0]||a[1];var r=t.filter(i),s=t.getOptions(r,{scope:e}),p=
 t.getEvents(e,r,p),c=n(s,p);a.addObject("mapsEngineLayers",c)}}}])}(),function(){"use strict";angular.module("ngMap").directive("fusionTablesLayer",["Attr2MapOptions",function(e){var t=e,n=function(e,t){var n=new google.maps.FusionTablesLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n};return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,o,i,a){a=a[0]||a[1];var r=t.filter(i),s=t.getOptions(r,{scope:e}),p=t.getEvents(e,r,p),c=n(s,p);a.addObject("fusionTablesLayers",c)}}}])}(),function(){"use strict";angular.module("ngMap").directive("heatmapLayer",["Attr2MapOptions","$window",function(e,t){var n=e;return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,o,i,a){a=a[0]||a[1];var r=n.filter(i),s=n.getOptions(r,{scope:e});if(s.data=t[i.data]||e[i.data],!(s.data instanceof Array))throw"invalid heatmap data";s.data=new google.maps.MVCArray(s.data);{var p=new google.maps.visualization.HeatmapLayer(s);n.getEvents(e,r)}a.addObject("heatmapLayers",p)}}
 }])}(),function(){"use strict";var e=function(e,t,n,o,i,a,r){var s=e,p=function(e,a,r){var s;!e.position||e.position instanceof google.maps.LatLng||delete e.position,s=new google.maps.InfoWindow(e);for(var p in a)p&&google.maps.event.addListener(s,p,a[p]);var c=n(function(e){angular.isString(r)?o(r).then(function(t){e(angular.element(t).wrap("<div>").parent())},function(e){throw"info-window template request failed: "+e}):e(r)}).then(function(e){var t=e.html().trim();if(1!=angular.element(t).length)throw"info-window working as a template must have a container";s.__template=t.replace(/\s?ng-non-bindable[='"]+/,"")});return s.__open=function(e,n,o){c.then(function(){i(function(){o&&(n.anchor=o);var i=t(s.__template)(n);s.setContent(i[0]),n.$apply(),o&&o.getPosition?s.open(e,o):o&&o instanceof google.maps.LatLng?(s.open(e),s.setPosition(o)):s.open(e);var a=s.content.parentElement.parentElement.parentElement;a.className="ng-map-info-window"})})},s},c=function(e,t,n,o){o=o[0]||o[1],t.css(
 "display","none");var i,c=s.orgAttributes(t),u=s.filter(n),l=s.getOptions(u,{scope:e}),g=s.getEvents(e,u),d=p(l,g,l.template||t);!l.position||l.position instanceof google.maps.LatLng||(i=l.position),i&&r.getGeoLocation(i).then(function(t){d.setPosition(t),d.__open(o.map,e,t);var i=n.geoCallback;i&&a(i)(e)}),o.addObject("infoWindows",d),o.observeAttrSetObj(c,n,d),o.showInfoWindow=o.map.showInfoWindow=o.showInfoWindow||function(t,n,i){var a="string"==typeof t?t:n,r="string"==typeof t?n:i;if("string"==typeof r)if("undefined"!=typeof o.map.markers&&"undefined"!=typeof o.map.markers[r])r=o.map.markers[r];else{if("undefined"==typeof o.map.customMarkers[r])throw new Error("Cant open info window for id "+r+". Marker or CustomMarker is not defined");r=o.map.customMarkers[r]}var s=o.map.infoWindows[a],p=r?r:this.getPosition?this:null;s.__open(o.map,e,p),o.singleInfoWindow&&(o.lastInfoWindow&&e.hideInfoWindow(o.lastInfoWindow),o.lastInfoWindow=a)},o.hideInfoWindow=o.map.hideInfoWindow=o.hideIn
 foWindow||function(e,t){var n="string"==typeof e?e:t,i=o.map.infoWindows[n];i.close()},e.showInfoWindow=o.map.showInfoWindow,e.hideInfoWindow=o.map.hideInfoWindow;var m=d.mapId?{id:d.mapId}:0;r.getMap(m).then(function(t){if(d.visible&&d.__open(t,e),d.visibleOnMarker){var n=d.visibleOnMarker;d.__open(t,e,t.markers[n])}})};return{restrict:"E",require:["?^map","?^ngMap"],link:c}};e.$inject=["Attr2MapOptions","$compile","$q","$templateRequest","$timeout","$parse","NgMap"],angular.module("ngMap").directive("infoWindow",e)}(),function(){"use strict";angular.module("ngMap").directive("kmlLayer",["Attr2MapOptions",function(e){var t=e,n=function(e,t){var n=new google.maps.KmlLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n};return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,o,i,a){a=a[0]||a[1];var r=t.orgAttributes(o),s=t.filter(i),p=t.getOptions(s,{scope:e}),c=t.getEvents(e,s),u=n(p,c);a.addObject("kmlLayers",u),a.observeAttrSetObj(r,i,u),o.bind("$destro
 y",function(){a.deleteObject("kmlLayers",u)})}}}])}(),function(){"use strict";angular.module("ngMap").directive("mapData",["Attr2MapOptions","NgMap",function(e,t){var n=e;return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,o,i){var a=n.filter(i),r=n.getOptions(a,{scope:e}),s=n.getEvents(e,a,s);t.getMap().then(function(t){for(var n in r){var o=r[n];"function"==typeof e[o]?t.data[n](e[o]):t.data[n](o)}for(var i in s)t.data.addListener(i,s[i])})}}}])}(),function(){"use strict";var e,t,n,o=[],i=[],a=function(n,a,r){var s=r.mapLazyLoadParams||r.mapLazyLoad;if(void 0===window.google||void 0===window.google.maps){i.push({scope:n,element:a,savedHtml:o[i.length]}),window.lazyLoadCallback=function(){e(function(){i.forEach(function(e){e.element.html(e.savedHtml),t(e.element.contents())(e.scope)})},100)};var p=document.createElement("script");p.src=s+(s.indexOf("?")>-1?"&":"?")+"callback=lazyLoadCallback",document.querySelector('script[src="'+p.src+'"]')||document.body.appendChild(p
 )}else a.html(o),t(a.contents())(n)},r=function(e,t){return!t.mapLazyLoad&&void 0,o.push(e.html()),n=t.mapLazyLoad,void 0!==window.google&&void 0!==window.google.maps?!1:(e.html(""),{pre:a})},s=function(n,o){return t=n,e=o,{compile:r}};s.$inject=["$compile","$timeout"],angular.module("ngMap").directive("mapLazyLoad",s)}(),function(){"use strict";angular.module("ngMap").directive("mapType",["$parse","NgMap",function(e,t){return{restrict:"E",require:["?^map","?^ngMap"],link:function(n,o,i,a){a=a[0]||a[1];var r,s=i.name;if(!s)throw"invalid map-type name";if(r=e(i.object)(n),!r)throw"invalid map-type object";t.getMap().then(function(e){e.mapTypes.set(s,r)}),a.addObject("mapTypes",r)}}}])}(),function(){"use strict";var e=function(){return{restrict:"AE",controller:"__MapController",controllerAs:"ngmap"}};angular.module("ngMap").directive("map",[e]),angular.module("ngMap").directive("ngMap",[e])}(),function(){"use strict";angular.module("ngMap").directive("mapsEngineLayer",["Attr2MapOption
 s",function(e){var t=e,n=function(e,t){var n=new google.maps.visualization.MapsEngineLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n};return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,o,i,a){a=a[0]||a[1];var r=t.filter(i),s=t.getOptions(r,{scope:e}),p=t.getEvents(e,r,p),c=n(s,p);a.addObject("mapsEngineLayers",c)}}}])}(),function(){"use strict";var e,t,n,o=function(e,t){var o;if(n.defaultOptions.marker)for(var i in n.defaultOptions.marker)"undefined"==typeof e[i]&&(e[i]=n.defaultOptions.marker[i]);e.position instanceof google.maps.LatLng||(e.position=new google.maps.LatLng(0,0)),o=new google.maps.Marker(e),Object.keys(t).length>0;for(var a in t)a&&google.maps.event.addListener(o,a,t[a]);return o},i=function(i,a,r,s){s=s[0]||s[1];var p,c=e.orgAttributes(a),u=e.filter(r),l=e.getOptions(u,i,{scope:i}),g=e.getEvents(i,u);l.position instanceof google.maps.LatLng||(p=l.position);var d=o(l,g);s.addObject("markers",d),p&&n.getGeoLocation(p).then(functio
 n(e){d.setPosition(e),l.centered&&d.map.setCenter(e);var n=r.geoCallback;n&&t(n)(i)}),s.observeAttrSetObj(c,r,d),a.bind("$destroy",function(){s.deleteObject("markers",d)})},a=function(o,a,r){return e=o,t=a,n=r,{restrict:"E",require:["^?map","?^ngMap"],link:i}};a.$inject=["Attr2MapOptions","$parse","NgMap"],angular.module("ngMap").directive("marker",a)}(),function(){"use strict";angular.module("ngMap").directive("overlayMapType",["NgMap",function(e){return{restrict:"E",require:["?^map","?^ngMap"],link:function(t,n,o,i){i=i[0]||i[1];var a=o.initMethod||"insertAt",r=t[o.object];e.getMap().then(function(e){if("insertAt"==a){var t=parseInt(o.index,10);e.overlayMapTypes.insertAt(t,r)}else"push"==a&&e.overlayMapTypes.push(r)}),i.addObject("overlayMapTypes",r)}}}])}(),function(){"use strict";var e=function(e,t){var n=e,o=function(e,o,i,a){if("false"===i.placesAutoComplete)return!1;var r=n.filter(i),s=n.getOptions(r,{scope:e}),p=n.getEvents(e,r),c=new google.maps.places.Autocomplete(o[0],s);
 for(var u in p)google.maps.event.addListener(c,u,p[u]);var l=function(){t(function(){a&&a.$setViewValue(o.val())},100)};google.maps.event.addListener(c,"place_changed",l),o[0].addEventListener("change",l),i.$observe("types",function(e){if(e){var t=n.toOptionValue(e,{key:"types"});c.setTypes(t)}}),i.$observe("componentRestrictions",function(t){t&&c.setComponentRestrictions(e.$eval(t))})};return{restrict:"A",require:"?ngModel",link:o}};e.$inject=["Attr2MapOptions","$timeout"],angular.module("ngMap").directive("placesAutoComplete",e)}(),function(){"use strict";var e=function(e,t){var n,o=e.name;switch(delete e.name,o){case"circle":e.center instanceof google.maps.LatLng||(e.center=new google.maps.LatLng(0,0)),n=new google.maps.Circle(e);break;case"polygon":n=new google.maps.Polygon(e);break;case"polyline":n=new google.maps.Polyline(e);break;case"rectangle":n=new google.maps.Rectangle(e);break;case"groundOverlay":case"image":var i=e.url,a={opacity:e.opacity,clickable:e.clickable,id:e.id}
 ;n=new google.maps.GroundOverlay(i,e.bounds,a)}for(var r in t)t[r]&&google.maps.event.addListener(n,r,t[r]);return n},t=function(t,n,o){var i=t,a=function(t,a,r,s){s=s[0]||s[1];var p,c,u=i.orgAttributes(a),l=i.filter(r),g=i.getOptions(l,{scope:t}),d=i.getEvents(t,l);c=g.name,g.center instanceof google.maps.LatLng||(p=g.center);var m=e(g,d);s.addObject("shapes",m),p&&"circle"==c&&o.getGeoLocation(p).then(function(e){m.setCenter(e),m.centered&&m.map.setCenter(e);var o=r.geoCallback;o&&n(o)(t)}),s.observeAttrSetObj(u,r,m),a.bind("$destroy",function(){s.deleteObject("shapes",m)})};return{restrict:"E",require:["?^map","?^ngMap"],link:a}};t.$inject=["Attr2MapOptions","$parse","NgMap"],angular.module("ngMap").directive("shape",t)}(),function(){"use strict";var e=function(e,t){var n=e,o=function(e,t,n){var o,i;t.container&&(i=document.getElementById(t.container),i=i||document.querySelector(t.container)),i?o=new google.maps.StreetViewPanorama(i,t):(o=e.getStreetView(),o.setOptions(t));for(va
 r a in n)a&&google.maps.event.addListener(o,a,n[a]);return o},i=function(e,i,a){var r=n.filter(a),s=n.getOptions(r,{scope:e}),p=n.getControlOptions(r),c=angular.extend(s,p),u=n.getEvents(e,r);t.getMap().then(function(e){var t=o(e,c,u);e.setStreetView(t),!t.getPosition()&&t.setPosition(e.getCenter()),google.maps.event.addListener(t,"position_changed",function(){t.getPosition()!==e.getCenter()&&e.setCenter(t.getPosition())});var n=google.maps.event.addListener(e,"center_changed",function(){t.setPosition(e.getCenter()),google.maps.event.removeListener(n)})})};return{restrict:"E",require:["?^map","?^ngMap"],link:i}};e.$inject=["Attr2MapOptions","NgMap"],angular.module("ngMap").directive("streetViewPanorama",e)}(),function(){"use strict";angular.module("ngMap").directive("trafficLayer",["Attr2MapOptions",function(e){var t=e,n=function(e,t){var n=new google.maps.TrafficLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n};return{restrict:"E",require:["?^map","?^ngMap"]
 ,link:function(e,o,i,a){a=a[0]||a[1];var r=t.orgAttributes(o),s=t.filter(i),p=t.getOptions(s,{scope:e}),c=t.getEvents(e,s),u=n(p,c);a.addObject("trafficLayers",u),a.observeAttrSetObj(r,i,u),o.bind("$destroy",function(){a.deleteObject("trafficLayers",u)})}}}])}(),function(){"use strict";angular.module("ngMap").directive("transitLayer",["Attr2MapOptions",function(e){var t=e,n=function(e,t){var n=new google.maps.TransitLayer(e);for(var o in t)google.maps.event.addListener(n,o,t[o]);return n};return{restrict:"E",require:["?^map","?^ngMap"],link:function(e,o,i,a){a=a[0]||a[1];var r=t.orgAttributes(o),s=t.filter(i),p=t.getOptions(s,{scope:e}),c=t.getEvents(e,s),u=n(p,c);a.addObject("transitLayers",u),a.observeAttrSetObj(r,i,u),o.bind("$destroy",function(){a.deleteObject("transitLayers",u)})}}}])}(),function(){"use strict";var e=/([\:\-\_]+(.))/g,t=/^moz([A-Z])/,n=function(){return function(n){return n.replace(e,function(e,t,n,o){return o?n.toUpperCase():n}).replace(t,"Moz$1")}};angular.mo
 dule("ngMap").filter("camelCase",n)}(),function(){"use strict";var e=function(){return function(e){try{return JSON.parse(e),e}catch(t){return e.replace(/([\$\w]+)\s*:/g,function(e,t){return'"'+t+'":'}).replace(/'([^']+)'/g,function(e,t){return'"'+t+'"'})}}};angular.module("ngMap").filter("jsonize",e)}(),function(){"use strict";var isoDateRE=/^(\d{4}\-\d\d\-\d\d([tT][\d:\.]*)?)([zZ]|([+\-])(\d\d):?(\d\d))?$/,Attr2MapOptions=function($parse,$timeout,$log,NavigatorGeolocation,GeoCoder,camelCaseFilter,jsonizeFilter){var orgAttributes=function(e){e.length>0&&(e=e[0]);for(var t={},n=0;n<e.attributes.length;n++){var o=e.attributes[n];t[o.name]=o.value}return t},getJSON=function(e){var t=/^[\+\-]?[0-9\.]+,[ ]*\ ?[\+\-]?[0-9\.]+$/;return e.match(t)&&(e="["+e+"]"),JSON.parse(jsonizeFilter(e))},getLatLng=function(e){var t=e;return e[0].constructor==Array?t=e.map(function(e){return new google.maps.LatLng(e[0],e[1])}):!isNaN(parseFloat(e[0]))&&isFinite(e[0])&&(t=new google.maps.LatLng(t[0],t[1])
 ),t},toOptionValue=function(input,options){var output;try{output=getNumber(input)}catch(err){try{var output=getJSON(input);if(output instanceof Array)output=output[0].constructor==Object?output:getLatLng(output);else if(output===Object(output)){var newOptions=options;newOptions.doNotConverStringToNumber=!0,output=getOptions(output,newOptions)}}catch(err2){if(input.match(/^[A-Z][a-zA-Z0-9]+\(.*\)$/))try{var exp="new google.maps."+input;output=eval(exp)}catch(e){output=input}else if(input.match(/^([A-Z][a-zA-Z0-9]+)\.([A-Z]+)$/))try{var matches=input.match(/^([A-Z][a-zA-Z0-9]+)\.([A-Z]+)$/);output=google.maps[matches[1]][matches[2]]}catch(e){output=input}else if(input.match(/^[A-Z]+$/))try{var capitalizedKey=options.key.charAt(0).toUpperCase()+options.key.slice(1);options.key.match(/temperatureUnit|windSpeedUnit|labelColor/)?(capitalizedKey=capitalizedKey.replace(/s$/,""),output=google.maps.weather[capitalizedKey][input]):output=google.maps[capitalizedKey][input]}catch(e){output=input
 }else if(input.match(isoDateRE))try{output=new Date(input)}catch(e){output=input}else if(input.match(/^{/)&&options.scope)try{var expr=input.replace(/{{/,"").replace(/}}/g,"");output=options.scope.$eval(expr)}catch(err){output=input}else output=input}}if(("center"==options.key||"center"==options.key)&&output instanceof Array&&(output=new google.maps.LatLng(output[0],output[1])),"bounds"==options.key&&output instanceof Array&&(output=new google.maps.LatLngBounds(output[0],output[1])),"icons"==options.key&&output instanceof Array)for(var i=0;i<output.length;i++){var el=output[i];el.icon.path.match(/^[A-Z_]+$/)&&(el.icon.path=google.maps.SymbolPath[el.icon.path])}if("icon"==options.key&&output instanceof Object){(""+output.path).match(/^[A-Z_]+$/)&&(output.path=google.maps.SymbolPath[output.path]);for(var key in output){var arr=output[key];"anchor"==key||"origin"==key||"labelOrigin"==key?output[key]=new google.maps.Point(arr[0],arr[1]):("size"==key||"scaledSize"==key)&&(output[key]=new
  google.maps.Size(arr[0],arr[1]))}}return output},getAttrsToObserve=function(e){var t=[];if(!e.noWatcher)for(var n in e){var o=e[n];o&&o.match(/\{\{.*\}\}/)&&t.push(camelCaseFilter(n))}return t},filter=function(e){var t={};for(var n in e)n.match(/^\$/)||n.match(/^ng[A-Z]/)||(t[n]=e[n]);return t},getOptions=function(e,t){t=t||{};var n={};for(var o in e)if(e[o]||0===e[o]){if(o.match(/^on[A-Z]/))continue;if(o.match(/ControlOptions$/))continue;n[o]="string"!=typeof e[o]?e[o]:t.doNotConverStringToNumber&&e[o].match(/^[0-9]+$/)?e[o]:toOptionValue(e[o],{key:o,scope:t.scope})}return n},getEvents=function(e,t){var n={},o=function(e){return"_"+e.toLowerCase()},i=function(t){var n=t.match(/([^\(]+)\(([^\)]*)\)/),o=n[1],i=n[2].replace(/event[ ,]*/,""),a=$parse("["+i+"]");return function(t){function n(e,t){return e[t]}var i=a(e),r=o.split(".").reduce(n,e);r&&r.apply(this,[t].concat(i)),$timeout(function(){e.$apply()})}};for(var a in t)if(t[a]){if(!a.match(/^on[A-Z]/))continue;var r=a.replace(/^o
 n/,"");r=r.charAt(0).toLowerCase()+r.slice(1),r=r.replace(/([A-Z])/g,o);var s=t[a];n[r]=new i(s)}return n},getControlOptions=function(e){var t={};if("object"!=typeof e)return!1;for(var n in e)if(e[n]){if(!n.match(/(.*)ControlOptions$/))continue;var o=e[n],i=o.replace(/'/g,'"');i=i.replace(/([^"]+)|("[^"]+")/g,function(e,t,n){return t?t.replace(/([a-zA-Z0-9]+?):/g,'"$1":'):n});try{var a=JSON.parse(i);for(var r in a)if(a[r]){var s=a[r];if("string"==typeof s?s=s.toUpperCase():"mapTypeIds"===r&&(s=s.map(function(e){return e.match(/^[A-Z]+$/)?google.maps.MapTypeId[e.toUpperCase()]:e})),"style"===r){var p=n.charAt(0).toUpperCase()+n.slice(1),c=p.replace(/Options$/,"")+"Style";a[r]=google.maps[c][s]}else a[r]="position"===r?google.maps.ControlPosition[s]:s}t[n]=a}catch(u){}}return t};return{filter:filter,getOptions:getOptions,getEvents:getEvents,getControlOptions:getControlOptions,toOptionValue:toOptionValue,getAttrsToObserve:getAttrsToObserve,orgAttributes:orgAttributes}};Attr2MapOptions.
 $inject=["$parse","$timeout","$log","NavigatorGeolocation","GeoCoder","camelCaseFilter","jsonizeFilter"],angular.module("ngMap").service("Attr2MapOptions",Attr2MapOptions)}(),function(){"use strict";var e,t=function(t){var n=e.defer(),o=new google.maps.Geocoder;return o.geocode(t,function(e,t){t==google.maps.GeocoderStatus.OK?n.resolve(e):n.reject(t)}),n.promise},n=function(n){return e=n,{geocode:t}};n.$inject=["$q"],angular.module("ngMap").service("GeoCoder",n)}(),function(){"use strict";var e,t=function(t){var n=e.defer();return navigator.geolocation?(void 0===t?t={timeout:5e3}:void 0===t.timeout&&(t.timeout=5e3),navigator.geolocation.getCurrentPosition(function(e){n.resolve(e)},function(e){n.reject(e)},t)):n.reject("Browser Geolocation service failed."),n.promise},n=function(n){return e=n,{getCurrentPosition:t}};n.$inject=["$q"],angular.module("ngMap").service("NavigatorGeolocation",n)}(),function(){"use strict";var e,t,n,o=[],i=function(n){var i=t.createElement("div");i.style.wi
 dth="100%",i.style.height="100%",n.appendChild(i);var a=new e.google.maps.Map(i,{});return o.push(a),a},a=function(e,t){for(var n,i=0;i<o.length;i++){var a=o[i];if(a.id==t&&!a.inUse){var r=a.getDiv();e.appendChild(r),n=a;break}}return n},r=function(e){for(var t,n=0;n<o.length;n++){var i=o[n];if(!i.id&&!i.inUse){var a=i.getDiv();e.appendChild(a),t=i;break}}return t},s=function(e){var t=a(e,e.id)||r(e);return t?n(function(){google.maps.event.trigger(t,"idle")},100):t=i(e),t.inUse=!0,t},p=function(e){e.inUse=!1},c=function(){for(var e=0;e<o.length;e++)o[e]=null;o=[]},u=function(i,a,r){return t=i[0],e=a,n=r,{mapInstances:o,resetMapInstances:c,getMapInstance:s,returnMapInstance:p}};u.$inject=["$document","$window","$timeout"],angular.module("ngMap").factory("NgMapPool",u)}(),function(){"use strict";var e,t,n,o,i,a,r,s={},p=function(n,o){var i;return n.currentStyle?i=n.currentStyle[o]:e.getComputedStyle&&(i=t.defaultView.getComputedStyle(n,null).getPropertyValue(o)),i},c=function(e){var t
 =s[e||0];return t.map instanceof google.maps.Map?void 0:(t.initializeMap(),t.map)},u=function(t){function o(n){s[t]?i.resolve(s[t].map):n>a?i.reject("could not find map"):e.setTimeout(function(){o(n+100)},100)}t="object"==typeof t?t.id:t,t=t||0;var i=n.defer(),a=2e3;return o(0),i.promise},l=function(e){if(e.map){var t=Object.keys(s).length;s[e.map.id||t]=e}},g=function(e){var t=Object.keys(s).length-1,n=e.map.id||t;if(e.map){for(var o in e.eventListeners){var i=e.eventListeners[o];google.maps.event.removeListener(i)}e.map.controls&&e.map.controls.forEach(function(e){e.clear()})}e.map.heatmapLayers&&Object.keys(e.map.heatmapLayers).forEach(function(t){e.deleteObject("heatmapLayers",e.map.heatmapLayers[t])}),delete s[n]},d=function(e,t){var i=n.defer();return!e||e.match(/^current/i)?o.getCurrentPosition(t).then(function(e){var t=e.coords.latitude,n=e.coords.longitude,o=new google.maps.LatLng(t,n);i.resolve(o)},function(e){i.reject(e)}):a.geocode({address:e}).then(function(e){i.resolve
 (e[0].geometry.location)},function(e){i.reject(e)}),i.promise},m=function(e,t){return function(n){if(n){var o=r("set-"+e),a=i.toOptionValue(n,{key:e});t[o]&&(e.match(/center|position/)&&"string"==typeof a?d(a).then(function(e){t[o](e)}):t[o](a))}}},f=function(e){var t=e.getAttribute("default-style");"true"==t?(e.style.display="block",e.style.height="300px"):("block"!=p(e,"display")&&(e.style.display="block"),p(e,"height").match(/^(0|auto)/)&&(e.style.height="300px"))};angular.module("ngMap").provider("NgMap",function(){var s={};this.setDefaultOptions=function(e){s=e};var p=function(p,v,y,h,M,b,O){return e=p,t=v[0],n=y,o=h,i=M,a=b,r=O,{defaultOptions:s,addMap:l,deleteMap:g,getMap:u,initMap:c,setStyle:f,getGeoLocation:d,observeAndSet:m}};p.$inject=["$window","$document","$q","NavigatorGeolocation","Attr2MapOptions","GeoCoder","camelCaseFilter"],this.$get=p})}(),function(){"use strict";var e,t=function(t,n){n=n||t.getCenter();var o=e.defer(),i=new google.maps.StreetViewService;return i
 .getPanoramaByLocation(n||t.getCenter,100,function(e,t){t===google.maps.StreetViewStatus.OK?o.resolve(e.location.pano):o.resolve(!1)
-}),o.promise},n=function(e,t){var n=new google.maps.StreetViewPanorama(e.getDiv(),{enableCloseButton:!0});n.setPano(t)},o=function(o){return e=o,{getPanorama:t,setPanorama:n}};o.$inject=["$q"],angular.module("ngMap").service("StreetView",o)}(),"ngMap"});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/js/underscore-min_1.8.3.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/js/underscore-min_1.8.3.js b/traffic_ops/experimental/ui/app/src/assets/js/underscore-min_1.8.3.js
deleted file mode 100644
index f01025b..0000000
--- a/traffic_ops/experimental/ui/app/src/assets/js/underscore-min_1.8.3.js
+++ /dev/null
@@ -1,6 +0,0 @@
-//     Underscore.js 1.8.3
-//     http://underscorejs.org
-//     (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
-//     Underscore may be freely distributed under the MIT license.
-(function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if("number"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.h
 asOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):u._=m,m.VERSION="1.8.3";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}}
 ,j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w("length"),k=function(n){var t=O(n);return"number"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)
 &&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),("number"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var
  a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.c
 all(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,
 r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])<u?i=a+1:o=a}return i},m.i
 ndexOf=r(1,m.findIndex,m.sortedIndex),m.lastIndexOf=r(-1,m.findLastIndex),m.range=function(n,t,r){null==t&&(t=n||0,n=0),r=r||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=Array(e),i=0;e>i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e<arguments.length;)i.push(arguments[e++]);return E(n,r,this,this,i)};return r},m.bindAll=function(n){var t,r,e=arguments.length;if(1>=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.
 memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return func
 tion(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e
 ,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=
 function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t)
 ,i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return"[object Array]"===s.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return s.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))}
 ,m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n)
 .join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var K=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,L=function(n){return"\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i
 ="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||"obj";return c.source="function("+f+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each(["concat","join","slice"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=f
 unction(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this);
-//# sourceMappingURL=underscore-min.map
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/ASNService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/ASNService.js b/traffic_ops/experimental/ui/app/src/common/api/ASNService.js
deleted file mode 100644
index 9cc604a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/ASNService.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ASNService = function(Restangular, locationUtils, messageModel) {
-
-    this.getASNs = function(queryParams) {
-        return Restangular.all('asns').getList(queryParams);
-    };
-
-    this.getASN = function(id) {
-        return Restangular.one("asns", id).get();
-    };
-
-    this.createASN = function(asn) {
-        return Restangular.service('asns').post(asn)
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'ASN created' } ], true);
-                    locationUtils.navigateToPath('/admin/asns');
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.updateASN = function(asn) {
-        return asn.put()
-            .then(
-            function() {
-                messageModel.setMessages([ { level: 'success', text: 'ASN updated' } ], false);
-            },
-            function(fault) {
-                messageModel.setMessages(fault.data.alerts, false);
-            }
-        );
-    };
-
-    this.deleteASN = function(id) {
-        return Restangular.one("asns", id).remove()
-            .then(
-            function() {
-                messageModel.setMessages([ { level: 'success', text: 'ASN deleted' } ], true);
-            },
-            function(fault) {
-                messageModel.setMessages(fault.data.alerts, true);
-            }
-        );
-    };
-
-};
-
-ASNService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
-module.exports = ASNService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/AuthService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/AuthService.js b/traffic_ops/experimental/ui/app/src/common/api/AuthService.js
deleted file mode 100644
index aa8536e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/AuthService.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var AuthService = function($rootScope, $http, $state, $location, $q, $state, httpService, userModel, messageModel, ENV) {
-
-    this.login = function(username, password) {
-        userModel.resetUser();
-        return httpService.post(ENV.api['root'] + 'user/login', { u: username, p: password })
-            .then(
-                function(result) {
-                    $rootScope.$broadcast('authService::login');
-                    var redirect = decodeURIComponent($location.search().redirect);
-                    if (redirect !== 'undefined') {
-                        $location.search('redirect', null); // remove the redirect query param
-                        $location.url(redirect);
-                    } else {
-                        $location.url('/monitor/dashboard');
-                    }
-                },
-                function(fault) {
-                    // do nothing
-                }
-            );
-    };
-
-    this.tokenLogin = function(token) {
-        userModel.resetUser();
-        return httpService.post(ENV.api['root'] + 'user/login/token', { t: token });
-    };
-
-    this.logout = function() {
-        userModel.resetUser();
-        httpService.post(ENV.api['root'] + 'user/logout').
-            then(
-                function(result) {
-                    $rootScope.$broadcast('authService::logout');
-                    if ($state.current.name == 'trafficPortal.public.login') {
-                        messageModel.setMessages(result.alerts, false);
-                    } else {
-                        messageModel.setMessages(result.alerts, true);
-                        $state.go('trafficPortal.public.login');
-                    }
-                    return result;
-                }
-        );
-    };
-
-    this.resetPassword = function(email) {
-        // Todo: api endpoint not implemented yet
-    };
-
-};
-
-AuthService.$inject = ['$rootScope', '$http', '$state', '$location', '$q', '$state', 'httpService', 'userModel', 'messageModel', 'ENV'];
-module.exports = AuthService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/CDNService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/CDNService.js b/traffic_ops/experimental/ui/app/src/common/api/CDNService.js
deleted file mode 100644
index e9221d0..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/CDNService.js
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var CDNService = function($http, $q, Restangular, locationUtils, messageModel, ENV) {
-
-    this.getCDNs = function(all) {
-        var request = $q.defer();
-
-        $http.get(ENV.api['root'] + "cdns")
-            .then(
-                function(result) {
-                    var response;
-                    if (all) { // there is a CDN called "ALL" that is not really a CDN but you might want it...
-                        response = result.data.response;
-                    } else {
-                        response = _.filter(result.data.response, function(cdn) {
-                            return cdn.name != 'ALL';
-                        });
-                    }
-                    request.resolve(response);
-                },
-                function(fault) {
-                    request.reject();
-                }
-            );
-
-        return request.promise;
-    };
-
-
-    this.getCDN = function(id) {
-        return Restangular.one("cdns", id).get();
-    };
-
-    this.createCDN = function(cdn) {
-        return Restangular.service('cdns').post(cdn)
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'CDN created' } ], true);
-                    locationUtils.navigateToPath('/admin/cdns');
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.updateCDN = function(cdn) {
-        return cdn.put()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'CDN updated' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.deleteCDN = function(id) {
-        return Restangular.one("cdns", id).remove()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'CDN deleted' } ], true);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-            );
-    };
-
-    this.queueServerUpdates = function(id) {
-        return Restangular.one("cdns", id).customPOST( { action: "queue"}, "queue_update" )
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Queued CDN server updates' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.clearServerUpdates = function(id) {
-        return Restangular.one("cdns", id).customPOST( { action: "dequeue"}, "queue_update" )
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Cleared CDN server updates' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.getCapacity = function() {
-        var request = $q.defer();
-
-        $http.get(ENV.api['root'] + "cdns/capacity")
-            .then(
-                function(result) {
-                    request.resolve(result.data.response);
-                },
-                function(fault) {
-                    request.reject();
-                }
-            );
-
-        return request.promise;
-    };
-
-    this.getRoutingMethods = function() {
-        var request = $q.defer();
-
-        $http.get(ENV.api['root'] + "cdns/routing")
-            .then(
-                function(result) {
-                    request.resolve(result.data.response);
-                },
-                function(fault) {
-                    request.reject();
-                }
-            );
-
-        return request.promise;
-    };
-
-    this.getCurrentStats = function() {
-        var request = $q.defer();
-
-        $http.get(ENV.api['root'] + "current_stats")
-            .then(
-                function(result) {
-                    request.resolve(result.data.response);
-                },
-                function(fault) {
-                    request.reject();
-                }
-            );
-
-        return request.promise;
-    };
-
-    this.getCurrentSnapshot = function(cdnName) {
-        var request = $q.defer();
-
-        $http.get(ENV.api['root'] + "cdns/" + cdnName + "/snapshot")
-            .then(
-                function(result) {
-                    request.resolve(result.data.response);
-                },
-                function(fault) {
-                    request.reject();
-                }
-            );
-
-        return request.promise;
-    };
-
-    this.getNewSnapshot = function(cdnName) {
-        var request = $q.defer();
-
-        $http.get(ENV.api['root'] + "cdns/" + cdnName + "/snapshot/new")
-            .then(
-                function(result) {
-                    request.resolve(result.data.response);
-                },
-                function(fault) {
-                    request.reject();
-                }
-            );
-
-        return request.promise;
-    };
-
-    this.snapshot = function(cdn) {
-        var request = $q.defer();
-
-        $http.put(ENV.api['root'] + "cdns/" + cdn.id + "/snapshot")
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Snapshot performed' } ], true);
-                    locationUtils.navigateToPath('/admin/cdns/' + cdn.id);
-
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-
-        return request.promise;
-    };
-
-
-
-
-};
-
-CDNService.$inject = ['$http', '$q', 'Restangular', 'locationUtils', 'messageModel', 'ENV'];
-module.exports = CDNService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/CacheGroupParameterService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/CacheGroupParameterService.js b/traffic_ops/experimental/ui/app/src/common/api/CacheGroupParameterService.js
deleted file mode 100644
index ee1da69..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/CacheGroupParameterService.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var CacheGroupParameterService = function(Restangular, messageModel, httpService, ENV) {
-
-	this.getCacheGroupParameters = function(cachegroupId) {
-		return Restangular.one('cachegroups', cachegroupId).getList('parameters')
-	};
-
-	this.unlinkCacheGroupParameter = function(cgId, paramId) {
-		return httpService.delete(ENV.api['root'] + 'cachegroupparameters/' + cgId + '/' + paramId)
-			.then(
-				function() {
-					messageModel.setMessages([ { level: 'success', text: 'Cachegroup and parameter were unlinked.' } ], false);
-				},
-				function(fault) {
-					messageModel.setMessages(fault.data.alerts, true);
-				}
-			);
-	};
-
-	this.linkCacheGroupParameters = function(cgParamMappings) {
-		return Restangular.service('cachegroupparameters').post(cgParamMappings)
-			.then(
-				function() {
-					messageModel.setMessages([ { level: 'success', text: 'Parameters linked to cache group' } ], false);
-				},
-				function(fault) {
-					messageModel.setMessages(fault.data.alerts, false);
-				}
-			);
-	};
-
-};
-
-CacheGroupParameterService.$inject = ['Restangular', 'messageModel', 'httpService', 'ENV'];
-module.exports = CacheGroupParameterService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/CacheGroupService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/CacheGroupService.js b/traffic_ops/experimental/ui/app/src/common/api/CacheGroupService.js
deleted file mode 100644
index cec928e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/CacheGroupService.js
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var CacheGroupService = function($http, $q, Restangular, locationUtils, messageModel, ENV) {
-
-    this.getCacheGroups = function(queryParams) {
-        return Restangular.all('cachegroups').getList(queryParams);
-    };
-
-    this.getCacheGroup = function(id) {
-        return Restangular.one("cachegroups", id).get();
-    };
-
-    this.createCacheGroup = function(cacheGroup) {
-        return Restangular.service('cachegroups').post(cacheGroup)
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'CacheGroup created' } ], true);
-                    locationUtils.navigateToPath('/configure/cache-groups');
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.updateCacheGroup = function(cacheGroup) {
-        return cacheGroup.put()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Cache group updated' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.deleteCacheGroup = function(id) {
-        return Restangular.one("cachegroups", id).remove()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Cache group deleted' } ], true);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-            );
-    };
-
-    this.queueServerUpdates = function(cgId, cdnId) {
-        return Restangular.one("cachegroups", cgId).customPOST( { action: "queue", cdnId: cdnId }, "queue_update" )
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Queued cache group server updates' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.clearServerUpdates = function(cgId, cdnId) {
-        return Restangular.one("cachegroups", cgId).customPOST( { action: "dequeue", cdnId: cdnId}, "queue_update" )
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Cleared cache group server updates' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.getParameterCacheGroups = function(paramId) {
-        // todo: this needs an api: /parameters/:id/cachegroups
-        return Restangular.one('parameters', paramId).getList('cachegroups');
-    };
-
-    this.getCacheGroupHealth = function() {
-        var deferred = $q.defer();
-
-        $http.get(ENV.api['root'] + "cdns/health")
-            .then(
-                function(result) {
-                    deferred.resolve(result.data.response);
-                },
-                function(fault) {
-                    deferred.reject(fault);
-                }
-            );
-
-        return deferred.promise;
-    };
-
-};
-
-CacheGroupService.$inject = ['$http', '$q', 'Restangular', 'locationUtils', 'messageModel', 'ENV'];
-module.exports = CacheGroupService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/CacheStatsService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/CacheStatsService.js b/traffic_ops/experimental/ui/app/src/common/api/CacheStatsService.js
deleted file mode 100644
index 3bcd97a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/CacheStatsService.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var CacheStatsService = function($http, $q, httpService, ENV) {
-
-	this.getBandwidth = function(cdnName, start, end) {
-		var request = $q.defer();
-
-		var url = ENV.api['root'] + "cache_stats",
-			params = { cdnName: cdnName, metricType: 'bandwidth', startDate: start.seconds(00).format(), endDate: end.seconds(00).format()};
-
-		$http.get(url, { params: params })
-			.then(
-				function(result) {
-					request.resolve(result.data.response);
-				},
-				function(fault) {
-					request.reject();
-				}
-			);
-
-		return request.promise;
-	};
-
-	this.getConnections = function(cdnName, start, end) {
-		var request = $q.defer();
-
-		var url = ENV.api['root'] + "cache_stats",
-			params = { cdnName: cdnName, metricType: 'connections', startDate: start.seconds(00).format(), endDate: end.seconds(00).format()};
-
-		$http.get(url, { params: params })
-			.then(
-				function(result) {
-					request.resolve(result.data.response);
-				},
-				function(fault) {
-					request.reject();
-				}
-			);
-
-		return request.promise;
-	};
-
-};
-
-CacheStatsService.$inject = ['$http', '$q', 'httpService', 'ENV'];
-module.exports = CacheStatsService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/ChangeLogService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/ChangeLogService.js b/traffic_ops/experimental/ui/app/src/common/api/ChangeLogService.js
deleted file mode 100644
index 133438e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/ChangeLogService.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ChangeLogService = function(Restangular, $rootScope, httpService, ENV) {
-
-	this.getNewLogCount = function() {
-		return httpService.get(ENV.api['root'] + 'logs/newcount', { ignoreLoadingBar: true });
-	};
-
-	this.getChangeLogs = function(queryParams) {
-		// broadcast an event that will zero out the change log count immediately
-		$rootScope.$broadcast('changeLogService::getChangeLogs');
-		return Restangular.all('logs').getList(queryParams);
-	};
-
-};
-
-ChangeLogService.$inject = ['Restangular', '$rootScope', 'httpService', 'ENV'];
-module.exports = ChangeLogService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/DeliveryServiceRegexService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/DeliveryServiceRegexService.js b/traffic_ops/experimental/ui/app/src/common/api/DeliveryServiceRegexService.js
deleted file mode 100644
index 8276a3c..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/DeliveryServiceRegexService.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var DeliveryServiceRegexService = function(Restangular, locationUtils, messageModel) {
-
-	this.getDeliveryServiceRegexes = function(dsId) {
-		return Restangular.one('deliveryservices', dsId).getList('regexes');
-	};
-
-	this.getDeliveryServiceRegex = function(dsId, regexId) {
-		return Restangular.one('deliveryservices', dsId).one('regexes', regexId).get();
-	};
-
-	this.createDeliveryServiceRegex = function(dsId, regex) {
-		return Restangular.one('deliveryservices', dsId).all('regexes').post(regex)
-			.then(
-				function() {
-					messageModel.setMessages([ { level: 'success', text: 'Regex created' } ], true);
-					locationUtils.navigateToPath('/configure/delivery-services/' + dsId + '/regexes');
-				},
-				function(fault) {
-					messageModel.setMessages(fault.data.alerts, false);
-				}
-			);
-	};
-
-	this.updateDeliveryServiceRegex = function(regex) {
-		return regex.put()
-			.then(
-				function() {
-					messageModel.setMessages([ { level: 'success', text: 'Regex updated' } ], false);
-				},
-				function(fault) {
-					messageModel.setMessages(fault.data.alerts, false);
-				}
-			);
-	};
-
-	this.deleteDeliveryServiceRegex = function(dsId, regexId) {
-		return Restangular.one('deliveryservices', dsId).one('regexes', regexId).remove()
-			.then(
-				function() {
-					messageModel.setMessages([ { level: 'success', text: 'Regex deleted' } ], true);
-				},
-				function(fault) {
-					messageModel.setMessages(fault.data.alerts, true);
-				}
-			);
-	};
-
-};
-
-DeliveryServiceRegexService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
-module.exports = DeliveryServiceRegexService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/DeliveryServiceService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/DeliveryServiceService.js b/traffic_ops/experimental/ui/app/src/common/api/DeliveryServiceService.js
deleted file mode 100644
index b653f06..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/DeliveryServiceService.js
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var DeliveryServiceService = function(Restangular, locationUtils, httpService, messageModel, ENV) {
-
-    this.getDeliveryServices = function(queryParams) {
-        return Restangular.all('deliveryservices').getList(queryParams);
-    };
-
-    this.getDeliveryService = function(id) {
-        return Restangular.one("deliveryservices", id).get();
-    };
-
-    this.createDeliveryService = function(deliveryService) {
-        return Restangular.service('deliveryservices').post(deliveryService)
-            .then(
-                function(response) {
-                    messageModel.setMessages([ { level: 'success', text: 'DeliveryService created' } ], true);
-                    locationUtils.navigateToPath('/configure/delivery-services/' + response.id + '?type=' + response.type);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.updateDeliveryService = function(deliveryService) {
-        return deliveryService.put()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Delivery service updated' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.deleteDeliveryService = function(id) {
-        return Restangular.one("deliveryservices", id).remove()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Delivery service deleted' } ], true);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-            );
-    };
-
-    this.getServerDeliveryServices = function(serverId) {
-        return Restangular.one('servers', serverId).getList('deliveryservices');
-    };
-
-    this.getUserDeliveryServices = function(userId) {
-        return Restangular.one('users', userId).getList('deliveryservices');
-    };
-
-    this.deleteDeliveryServiceServer = function(dsId, serverId) {
-        return httpService.delete(ENV.api['root'] + 'deliveryservice_server/' + dsId + '/' + serverId)
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Delivery service and server were unlinked.' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-            );
-    };
-
-    this.assignDeliveryServiceServers = function(dsId, servers) {
-        return Restangular.service('deliveryserviceserver').post( { dsId: dsId, servers: servers, replace: true } )
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Servers linked to delivery service' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-
-};
-
-DeliveryServiceService.$inject = ['Restangular', 'locationUtils', 'httpService', 'messageModel', 'ENV'];
-module.exports = DeliveryServiceService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/DivisionService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/DivisionService.js b/traffic_ops/experimental/ui/app/src/common/api/DivisionService.js
deleted file mode 100644
index 6ffc6ee..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/DivisionService.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var DivisionService = function(Restangular, locationUtils, messageModel) {
-
-    this.getDivisions = function(queryParams) {
-        return Restangular.all('divisions').getList(queryParams);
-    };
-
-    this.getDivision = function(id) {
-        return Restangular.one("divisions", id).get();
-    };
-
-    this.createDivision = function(division) {
-        return Restangular.service('divisions').post(division)
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Division created' } ], true);
-                    locationUtils.navigateToPath('/admin/divisions');
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.updateDivision = function(division) {
-        return division.put()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Division updated' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.deleteDivision = function(id) {
-        return Restangular.one("divisions", id).remove()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Division deleted' } ], true);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-            );
-    };
-
-};
-
-DivisionService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
-module.exports = DivisionService;


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html
new file mode 100644
index 0000000..5f67348
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html
@@ -0,0 +1,200 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
+            <li class="active">{{deliveryServiceName}}</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <div class="btn-group" role="group" uib-dropdown is-open="keys.isopen">
+                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    <i class="fa fa-key"></i>&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="manageSslKeys()">Manage SSL Keys</a></li>
+                    <li role="menuitem"><a ng-click="manageUrlSigKeys()">Manage URL Sig Keys</a></li>
+                </ul>
+            </div>
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="viewServers()">View Servers</a></li>
+                    <li role="menuitem"><a ng-click="viewRegexes()">View Regexes</a></li>
+                    <li role="menuitem"><a ng-click="viewJobs()">View Invalidate Content Jobs</a></li>
+                    <li role="menuitem"><a ng-click="viewStaticDnsEntries()">View Static DNS Entries</a></li>
+                </ul>
+            </div>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="deliveryServiceForm" class="form-horizontal form-label-left" novalidate>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.type.id), 'has-feedback': hasError(deliveryServiceForm.type.id)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Content Routing Type *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="type" name="type" class="form-control" ng-model="deliveryService.typeId" ng-options="type.id as type.name for type in types" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.type, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.xmlId), 'has-feedback': hasError(deliveryServiceForm.xmlId)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">XML ID *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="xmlId" name="xmlId" type="text" class="form-control" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">No spaces</small>
+                    <span ng-show="hasError(deliveryServiceForm.xmlId)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.displayName), 'has-feedback': hasError(deliveryServiceForm.displayName)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Display Name *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="displayName" name="displayName" type="text" class="form-control" ng-model="deliveryService.displayName" ng-required="true" ng-maxlength="48" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.displayName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.active), 'has-feedback': hasError(deliveryServiceForm.active)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Active *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="active" name="active" class="form-control" ng-model="deliveryService.active" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.active, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cdn), 'has-feedback': hasError(deliveryServiceForm.cdn)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="cdn" name="cdn" class="form-control" ng-model="deliveryService.cdnId" ng-options="cdn.id as cdn.name for cdn in cdns" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cdn, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.protocol), 'has-feedback': hasError(deliveryServiceForm.protocol)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Protocol *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="protocol" name="protocol" class="form-control" ng-model="deliveryService.protocol" ng-options="protocol.value as protocol.label for protocol in protocols" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.protocol, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ipv6RoutingEnabled), 'has-feedback': hasError(deliveryServiceForm.ipv6RoutingEnabled)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">IPv6 Routing Enabled *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="ipv6RoutingEnabled" name="ipv6RoutingEnabled" class="form-control" ng-model="deliveryService.ipv6RoutingEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ipv6RoutingEnabled, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.profile), 'has-feedback': hasError(deliveryServiceForm.profile)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Profile</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="profile" name="profile" class="form-control" ng-model="deliveryService.profileId" ng-options="profile.id as profile.name for profile in profiles">
+                        <option value="">Select...</option>
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc), 'has-feedback': hasError(deliveryServiceForm.longDesc)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="longDesc" name="longDesc" type="text" class="form-control" ng-model="deliveryService.longDesc" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.longDesc)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc1), 'has-feedback': hasError(deliveryServiceForm.longDesc1)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 1</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="longDesc1" name="longDesc1" type="text" class="form-control" ng-model="deliveryService.longDesc1" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc1, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.longDesc1)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc2), 'has-feedback': hasError(deliveryServiceForm.longDesc2)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 2</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="longDesc2" name="longDesc2" type="text" class="form-control" ng-model="deliveryService.longDesc2" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc2, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.longDesc2)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.infoUrl), 'has-feedback': hasError(deliveryServiceForm.infoUrl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Info URL</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="infoUrl" name="infoUrl" type="text" class="form-control" ng-model="deliveryService.infoUrl" ng-maxlength="255" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.infoUrl, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.infoUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.checkPath), 'has-feedback': hasError(deliveryServiceForm.checkPath)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Check Path</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="checkPath" name="checkPath" type="text" class="form-control" ng-model="deliveryService.checkPath" ng-maxlength="255" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.checkPath, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.checkPath)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.sslKeyVersion), 'has-feedback': hasError(deliveryServiceForm.sslKeyVersion)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">SSL Key Version</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="sslKeyVersion" name="sslKeyVersion" type="text" class="form-control" ng-model="deliveryService.sslKeyVersion" ng-maxlength="11" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.sslKeyVersion, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.sslKeyVersion)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.logsEnabled), 'has-feedback': hasError(deliveryServiceForm.logsEnabled)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Logs Enabled *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="logsEnabled" name="logsEnabled" class="form-control" ng-model="deliveryService.logsEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.logsEnabled, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(deliveryService)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html
new file mode 100644
index 0000000..ca04ef2
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html
@@ -0,0 +1,225 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
+            <li class="active">{{deliveryServiceName}}</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <div class="btn-group" role="group" uib-dropdown is-open="keys.isopen">
+                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    <i class="fa fa-key"></i>&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="manageSslKeys()">Manage SSL Keys</a></li>
+                    <li role="menuitem"><a ng-click="manageUrlSigKeys()">Manage URL Sig Keys</a></li>
+                </ul>
+            </div>
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="viewServers()">View Servers</a></li>
+                    <li role="menuitem"><a ng-click="viewRegexes()">View Regexes</a></li>
+                    <li role="menuitem"><a ng-click="viewJobs()">View Invalidate Content Jobs</a></li>
+                    <li role="menuitem"><a ng-click="viewStaticDnsEntries()">View Static DNS Entries</a></li>
+                </ul>
+            </div>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="deliveryServiceForm" class="form-horizontal form-label-left" novalidate>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.type.id), 'has-feedback': hasError(deliveryServiceForm.type.id)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Content Routing Type *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="type" name="type" class="form-control" ng-model="deliveryService.typeId" ng-options="type.id as type.name for type in types" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.type, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.xmlId), 'has-feedback': hasError(deliveryServiceForm.xmlId)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">XML ID *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="xmlId" name="xmlId" type="text" class="form-control" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">No spaces</small>
+                    <span ng-show="hasError(deliveryServiceForm.xmlId)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.displayName), 'has-feedback': hasError(deliveryServiceForm.displayName)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Display Name *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="displayName" name="displayName" type="text" class="form-control" ng-model="deliveryService.displayName" ng-required="true" ng-maxlength="48" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.displayName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.active), 'has-feedback': hasError(deliveryServiceForm.active)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Active *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="active" name="active" class="form-control" ng-model="deliveryService.active" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.active, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cdn), 'has-feedback': hasError(deliveryServiceForm.cdn)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="cdn" name="cdn" class="form-control" ng-model="deliveryService.cdnId" ng-options="cdn.id as cdn.name for cdn in cdns" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cdn, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoProvider), 'has-feedback': hasError(deliveryServiceForm.geoProvider)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Provider *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="geoProvider" name="geoProvider" class="form-control" ng-model="deliveryService.geoProvider" ng-options="gp.value as gp.label for gp in geoProviders" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoProvider, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.profile), 'has-feedback': hasError(deliveryServiceForm.profile)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Profile</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="profile" name="profile" class="form-control" ng-model="deliveryService.profileId" ng-options="profile.id as profile.name for profile in profiles">
+                        <option value="">Select...</option>
+                    </select>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trRequestHeaders), 'has-feedback': hasError(deliveryServiceForm.trRequestHeaders)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Log Request Headers</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="trRequestHeaders" name="trRequestHeaders" type="text" class="form-control" ng-model="deliveryService.trRequestHeaders" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trRequestHeaders, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.trRequestHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cacheurl), 'has-feedback': hasError(deliveryServiceForm.cacheurl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Cache URL expression</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="cacheurl" name="cacheurl" type="text" class="form-control" ng-model="deliveryService.cacheurl" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cacheurl, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.cacheurl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.remapText), 'has-feedback': hasError(deliveryServiceForm.remapText)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Raw remap text</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="remapText" name="remapText" type="text" class="form-control" ng-model="deliveryService.remapText" ng-maxlength="2048" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.remapText, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.remapText)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc), 'has-feedback': hasError(deliveryServiceForm.longDesc)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="longDesc" name="longDesc" type="text" class="form-control" ng-model="deliveryService.longDesc" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.longDesc)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc1), 'has-feedback': hasError(deliveryServiceForm.longDesc1)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 1</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="longDesc1" name="longDesc1" type="text" class="form-control" ng-model="deliveryService.longDesc1" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc1, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.longDesc1)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc2), 'has-feedback': hasError(deliveryServiceForm.longDesc2)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 2</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="longDesc2" name="longDesc2" type="text" class="form-control" ng-model="deliveryService.longDesc2" ng-maxlength="1024" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc2, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.longDesc2)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.infoUrl), 'has-feedback': hasError(deliveryServiceForm.infoUrl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Info URL</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="infoUrl" name="infoUrl" type="text" class="form-control" ng-model="deliveryService.infoUrl" ng-maxlength="255" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.infoUrl, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.infoUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.checkPath), 'has-feedback': hasError(deliveryServiceForm.checkPath)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Check Path</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="checkPath" name="checkPath" type="text" class="form-control" ng-model="deliveryService.checkPath" ng-maxlength="255" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.checkPath, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.checkPath)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.sslKeyVersion), 'has-feedback': hasError(deliveryServiceForm.sslKeyVersion)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">SSL Key Version</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="sslKeyVersion" name="sslKeyVersion" type="text" class="form-control" ng-model="deliveryService.sslKeyVersion" ng-maxlength="11" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.sslKeyVersion, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(deliveryServiceForm.sslKeyVersion)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.regionalGeoBlocking), 'has-feedback': hasError(deliveryServiceForm.regionalGeoBlocking)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Regional Geoblocking *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="regionalGeoBlocking" name="regionalGeoBlocking" class="form-control" ng-model="deliveryService.regionalGeoBlocking" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.regionalGeoBlocking, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.logsEnabled), 'has-feedback': hasError(deliveryServiceForm.logsEnabled)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Logs Enabled *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="logsEnabled" name="logsEnabled" class="form-control" ng-model="deliveryService.logsEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.logsEnabled, 'required')">Required</small>
+                </div>
+            </div>
+
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(deliveryService)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryService/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/index.js b/traffic_portal/app/src/common/modules/form/deliveryService/index.js
new file mode 100644
index 0000000..4a08c54
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.deliveryService', [])
+    .controller('FormDeliveryServiceController', require('./FormDeliveryServiceController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryService/new/FormNewDeliveryServiceController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/new/FormNewDeliveryServiceController.js b/traffic_portal/app/src/common/modules/form/deliveryService/new/FormNewDeliveryServiceController.js
new file mode 100644
index 0000000..01b764b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/new/FormNewDeliveryServiceController.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.
+ */
+
+var FormNewDeliveryServiceController = function(deliveryService, type, types, $scope, $controller, deliveryServiceService) {
+
+	var filteredTypes = _.filter(types, function(currentType) {
+		return currentType.name.indexOf(type) != -1;
+	});
+
+	// extends the FormDeliveryServiceController to inherit common methods
+	angular.extend(this, $controller('FormDeliveryServiceController', { deliveryService: deliveryService, types: filteredTypes, $scope: $scope }));
+
+	$scope.deliveryServiceName = 'New';
+
+	$scope.settings = {
+		isNew: true,
+		saveLabel: 'Create'
+	};
+
+	$scope.save = function(deliveryService) {
+		deliveryServiceService.createDeliveryService(deliveryService);
+	};
+
+};
+
+FormNewDeliveryServiceController.$inject = ['deliveryService', 'type', 'types', '$scope', '$controller', 'deliveryServiceService'];
+module.exports = FormNewDeliveryServiceController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryService/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/new/index.js b/traffic_portal/app/src/common/modules/form/deliveryService/new/index.js
new file mode 100644
index 0000000..ed659ba
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.deliveryService.new', [])
+	.controller('FormNewDeliveryServiceController', require('./FormNewDeliveryServiceController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryServiceJob/FormDeliveryServiceJobController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryServiceJob/FormDeliveryServiceJobController.js b/traffic_portal/app/src/common/modules/form/deliveryServiceJob/FormDeliveryServiceJobController.js
new file mode 100644
index 0000000..a672874
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryServiceJob/FormDeliveryServiceJobController.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.
+ */
+
+var FormDeliveryServiceJobController = function(deliveryService, job, $scope, formUtils, locationUtils) {
+
+	$scope.deliveryService = deliveryService;
+
+	$scope.job = job;
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	$scope.hasError = formUtils.hasError;
+
+	$scope.hasPropertyError = formUtils.hasPropertyError;
+
+};
+
+FormDeliveryServiceJobController.$inject = ['deliveryService', 'job', '$scope', 'formUtils', 'locationUtils'];
+module.exports = FormDeliveryServiceJobController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html b/traffic_portal/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html
new file mode 100644
index 0000000..3b735d5
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html
@@ -0,0 +1,58 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
+            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{deliveryService.displayName}}</a></li>
+            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '/jobs')">Invalidate Content Jobs</a></li>
+            <li class="active">{{jobName}}</li>
+        </ol>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="jobForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(jobForm.regex), 'has-feedback': hasError(jobForm.regex)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Path Regex *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="regex" name="regex" type="text" class="form-control" placeholder="eg. /path/to/content/.*\.jpg" ng-model="job.regex" ng-required="true" ng-maxlength="255" ng-pattern="/^\//" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(jobForm.regex, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(jobForm.regex, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(jobForm.regex, 'pattern')">Must Start with /</small>
+                    <span ng-show="hasError(jobForm.regex)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(jobForm.ttl), 'has-feedback': hasError(jobForm.ttl)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">TTL (hours) *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="ttl" name="ttl" type="text" class="form-control" ng-model="job.ttl" ng-required="true" ng-maxlength="1000" ng-pattern="/^\d+$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(jobForm.ttl, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(jobForm.ttl, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(jobForm.ttl, 'pattern')">Number</small>
+                    <span ng-show="hasError(jobForm.ttl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-success" ng-disabled="jobForm.$pristine || jobForm.$invalid" ng-click="save(job)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryServiceJob/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryServiceJob/index.js b/traffic_portal/app/src/common/modules/form/deliveryServiceJob/index.js
new file mode 100644
index 0000000..f1cbba8
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryServiceJob/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.deliveryServiceJob', [])
+	.controller('FormDeliveryServiceJobController', require('./FormDeliveryServiceJobController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryServiceJob/new/FormNewDeliveryServiceJobController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryServiceJob/new/FormNewDeliveryServiceJobController.js b/traffic_portal/app/src/common/modules/form/deliveryServiceJob/new/FormNewDeliveryServiceJobController.js
new file mode 100644
index 0000000..bace310
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryServiceJob/new/FormNewDeliveryServiceJobController.js
@@ -0,0 +1,48 @@
+/*
+ * 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 FormNewDeliveryServiceJobController = function(deliveryService, job, $scope, $controller, jobService, messageModel, locationUtils) {
+
+	// extends the FormDeliveryServiceJobController to inherit common methods
+	angular.extend(this, $controller('FormDeliveryServiceJobController', { deliveryService: deliveryService, job: job, $scope: $scope }));
+
+	$scope.jobName = 'New';
+
+	$scope.settings = {
+		isNew: true,
+		saveLabel: 'Create'
+	};
+
+	$scope.save = function(job) {
+		jobService.createJob(job)
+			.then(
+				function() {
+					messageModel.setMessages([ { level: 'success', text: 'Delivery Service Invalidate Content Job Created' } ], true);
+					locationUtils.navigateToPath('/configure/delivery-services/' + deliveryService.id + '/jobs');
+				},
+				function(fault) {
+					messageModel.setMessages(fault.data.alerts, false);
+				}
+			);
+	};
+
+};
+
+FormNewDeliveryServiceJobController.$inject = ['deliveryService', 'job', '$scope', '$controller', 'jobService', 'messageModel', 'locationUtils'];
+module.exports = FormNewDeliveryServiceJobController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryServiceJob/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryServiceJob/new/index.js b/traffic_portal/app/src/common/modules/form/deliveryServiceJob/new/index.js
new file mode 100644
index 0000000..a06c4d9
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryServiceJob/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.deliveryServiceJob.new', [])
+	.controller('FormNewDeliveryServiceJobController', require('./FormNewDeliveryServiceJobController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/FormDeliveryServiceRegexController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/FormDeliveryServiceRegexController.js b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/FormDeliveryServiceRegexController.js
new file mode 100644
index 0000000..8494256
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/FormDeliveryServiceRegexController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 FormDeliveryServiceRegexController = function(deliveryService, regex, $scope, formUtils, locationUtils, typeService) {
+
+	var getTypes = function() {
+		typeService.getTypes({ useInTable: 'regex' })
+			.then(function(result) {
+				$scope.types = result;
+			});
+	};
+
+	$scope.deliveryService = deliveryService;
+
+	$scope.regex = regex;
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	$scope.hasError = formUtils.hasError;
+
+	$scope.hasPropertyError = formUtils.hasPropertyError;
+
+	var init = function () {
+		getTypes();
+	};
+	init();
+
+};
+
+FormDeliveryServiceRegexController.$inject = ['deliveryService', 'regex', '$scope', 'formUtils', 'locationUtils', 'typeService'];
+module.exports = FormDeliveryServiceRegexController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/edit/FormEditDeliveryServiceRegexController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/edit/FormEditDeliveryServiceRegexController.js b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/edit/FormEditDeliveryServiceRegexController.js
new file mode 100644
index 0000000..bcfab5c
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/edit/FormEditDeliveryServiceRegexController.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.
+ */
+
+var FormEditDeliveryServiceRegexController = function(deliveryService, regex, $scope, $controller, $uibModal, $anchorScroll, locationUtils, deliveryServiceRegexService) {
+
+	// extends the FormDeliveryServiceController to inherit common methods
+	angular.extend(this, $controller('FormDeliveryServiceRegexController', { deliveryService: deliveryService, regex: regex, $scope: $scope }));
+
+	var deleteDeliveryServiceRegex = function(dsId, regexId) {
+		deliveryServiceRegexService.deleteDeliveryServiceRegex(dsId, regexId)
+			.then(function() {
+				locationUtils.navigateToPath('/configure/delivery-services/' + dsId + '/regexes');
+			});
+	};
+
+	$scope.regexPattern = angular.copy(regex.pattern);
+
+	$scope.settings = {
+		isNew: false,
+		saveLabel: 'Update'
+	};
+
+	$scope.save = function(dsId, regex) {
+		deliveryServiceRegexService.updateDeliveryServiceRegex(regex).
+			then(function() {
+				$scope.regexPattern = angular.copy(regex.pattern);
+				$anchorScroll(); // scrolls window to top
+			});
+	};
+
+	$scope.confirmDelete = function(regex) {
+		var params = {
+			title: 'Delete Delivery Service Regex: ' + regex.pattern,
+			key: regex.pattern
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+			controller: 'DialogDeleteController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				}
+			}
+		});
+		modalInstance.result.then(function() {
+			deleteDeliveryServiceRegex(deliveryService.id, regex.id);
+		}, function () {
+			// do nothing
+		});
+	};
+
+};
+
+FormEditDeliveryServiceRegexController.$inject = ['deliveryService', 'regex', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'deliveryServiceRegexService'];
+module.exports = FormEditDeliveryServiceRegexController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/edit/index.js b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/edit/index.js
new file mode 100644
index 0000000..fcd723a
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.deliveryServiceRegex.edit', [])
+	.controller('FormEditDeliveryServiceRegexController', require('./FormEditDeliveryServiceRegexController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html
new file mode 100644
index 0000000..77a0802
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html
@@ -0,0 +1,68 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
+            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{deliveryService.displayName}}</a></li>
+            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '/regexes')">Regexes</a></li>
+            <li class="active">{{regexPattern}}</li>
+        </ol>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="dsRegexForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(dsRegexForm.pattern), 'has-feedback': hasError(dsRegexForm.pattern)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Pattern *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="pattern" name="pattern" type="text" class="form-control" ng-model="regex.pattern" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(dsRegexForm.pattern, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(dsRegexForm.pattern, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(dsRegexForm.pattern, 'pattern')">No spaces</small>
+                    <span ng-show="hasError(dsRegexForm.pattern)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(dsRegexForm.type), 'has-feedback': hasError(dsRegexForm.type)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Type *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="type" name="type" class="form-control" ng-model="regex.type" ng-options="type.id as type.name for type in types" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(dsRegexForm.type, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(dsRegexForm.setNumber), 'has-feedback': hasError(dsRegexForm.setNumber)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Order *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="setNumber" name="setNumber" type="text" class="form-control" ng-model="regex.setNumber" ng-required="true" ng-maxlength="3" ng-pattern="/^\d+$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(dsRegexForm.setNumber, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(dsRegexForm.setNumber, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(dsRegexForm.setNumber, 'pattern')">Number</small>
+                    <span ng-show="hasError(dsRegexForm.setNumber)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(regex)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="dsRegexForm.$pristine || dsRegexForm.$invalid" ng-click="save(deliveryService.id, regex)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/index.js b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/index.js
new file mode 100644
index 0000000..7bf4ab0
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.deliveryServiceRegex', [])
+	.controller('FormDeliveryServiceRegexController', require('./FormDeliveryServiceRegexController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/new/FormNewDeliveryServiceRegexController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/new/FormNewDeliveryServiceRegexController.js b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/new/FormNewDeliveryServiceRegexController.js
new file mode 100644
index 0000000..5b314b7
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/new/FormNewDeliveryServiceRegexController.js
@@ -0,0 +1,39 @@
+/*
+ * 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 FormNewDeliveryServiceRegexController = function(deliveryService, regex, $scope, $controller, deliveryServiceRegexService) {
+
+	// extends the FormDeliveryServiceRegexController to inherit common methods
+	angular.extend(this, $controller('FormDeliveryServiceRegexController', { deliveryService: deliveryService, regex: regex, $scope: $scope }));
+
+	$scope.regexPattern = 'New';
+
+	$scope.settings = {
+		isNew: true,
+		saveLabel: 'Create'
+	};
+
+	$scope.save = function(dsId, regex) {
+		deliveryServiceRegexService.createDeliveryServiceRegex(dsId, regex);
+	};
+
+};
+
+FormNewDeliveryServiceRegexController.$inject = ['deliveryService', 'regex', '$scope', '$controller', 'deliveryServiceRegexService'];
+module.exports = FormNewDeliveryServiceRegexController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/new/index.js b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/new/index.js
new file mode 100644
index 0000000..8e69467
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryServiceRegex/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.deliveryServiceRegex.new', [])
+	.controller('FormNewDeliveryServiceRegexController', require('./FormNewDeliveryServiceRegexController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/division/FormDivisionController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/division/FormDivisionController.js b/traffic_portal/app/src/common/modules/form/division/FormDivisionController.js
new file mode 100644
index 0000000..b977a1b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/division/FormDivisionController.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.
+ */
+
+var FormDivisionController = function(division, $scope, $location, formUtils, stringUtils, locationUtils) {
+
+    $scope.division = division;
+
+    $scope.props = [
+        { name: 'name', type: 'text', required: true, maxLength: 45 }
+    ];
+
+    $scope.labelize = stringUtils.labelize;
+
+    $scope.viewRegions = function() {
+        $location.path($location.path() + '/regions');
+    };
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
+    $scope.hasError = formUtils.hasError;
+
+    $scope.hasPropertyError = formUtils.hasPropertyError;
+
+};
+
+FormDivisionController.$inject = ['division', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils'];
+module.exports = FormDivisionController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/division/edit/FormEditDivisionController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/division/edit/FormEditDivisionController.js b/traffic_portal/app/src/common/modules/form/division/edit/FormEditDivisionController.js
new file mode 100644
index 0000000..883f43d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/division/edit/FormEditDivisionController.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.
+ */
+
+var FormEditDivisionController = function(division, $scope, $controller, $uibModal, $anchorScroll, locationUtils, divisionService) {
+
+    // extends the FormDivisionController to inherit common methods
+    angular.extend(this, $controller('FormDivisionController', { division: division, $scope: $scope }));
+
+    var deleteDivision = function(division) {
+        divisionService.deleteDivision(division.id)
+            .then(function() {
+                locationUtils.navigateToPath('/admin/divisions');
+            });
+    };
+
+    $scope.divisionName = angular.copy(division.name);
+
+    $scope.settings = {
+        isNew: false,
+        saveLabel: 'Update'
+    };
+
+    $scope.save = function(division) {
+        divisionService.updateDivision(division).
+            then(function() {
+                $scope.divisionName = angular.copy(division.name);
+                $anchorScroll(); // scrolls window to top
+            });
+    };
+
+    $scope.confirmDelete = function(division) {
+        var params = {
+            title: 'Delete Division: ' + division.name,
+            key: division.name
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+            controller: 'DialogDeleteController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                }
+            }
+        });
+        modalInstance.result.then(function() {
+            deleteDivision(division);
+        }, function () {
+            // do nothing
+        });
+    };
+
+};
+
+FormEditDivisionController.$inject = ['division', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'divisionService'];
+module.exports = FormEditDivisionController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/division/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/division/edit/index.js b/traffic_portal/app/src/common/modules/form/division/edit/index.js
new file mode 100644
index 0000000..f87106d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/division/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.division.edit', [])
+    .controller('FormEditDivisionController', require('./FormEditDivisionController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/division/form.division.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/division/form.division.tpl.html b/traffic_portal/app/src/common/modules/form/division/form.division.tpl.html
new file mode 100644
index 0000000..bd87a3c
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/division/form.division.tpl.html
@@ -0,0 +1,49 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/divisions')">Divisions</a></li>
+            <li class="active">{{divisionName}}</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-primary" title="View Regions" ng-click="viewRegions()">View Regions</button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="divisionForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(divisionForm[prop.name]), 'has-feedback': hasError(divisionForm[prop.name])}" ng-repeat="prop in props">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">{{labelize(prop.name)}} <span ng-show="prop.required">*</span></label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="{{prop.name}}" name="{{prop.name}}" type="{{prop.type}}" class="form-control" ng-model="division[prop.name]" ng-readonly="prop.readonly" ng-required="prop.required" ng-maxlength="prop.maxLength" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(divisionForm[prop.name], 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(divisionForm[prop.name], 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(divisionForm[prop.name])" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(division)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="divisionForm.$pristine || divisionForm.$invalid" ng-click="save(division)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/division/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/division/index.js b/traffic_portal/app/src/common/modules/form/division/index.js
new file mode 100644
index 0000000..6cc20d8
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/division/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.division', [])
+    .controller('FormDivisionController', require('./FormDivisionController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/division/new/FormNewDivisionController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/division/new/FormNewDivisionController.js b/traffic_portal/app/src/common/modules/form/division/new/FormNewDivisionController.js
new file mode 100644
index 0000000..077bf06
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/division/new/FormNewDivisionController.js
@@ -0,0 +1,39 @@
+/*
+ * 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 FormNewDivisionController = function(division, $scope, $controller, divisionService) {
+
+    // extends the FormDivisionController to inherit common methods
+    angular.extend(this, $controller('FormDivisionController', { division: division, $scope: $scope }));
+
+    $scope.divisionName = 'New';
+
+    $scope.settings = {
+        isNew: true,
+        saveLabel: 'Create'
+    };
+
+    $scope.save = function(division) {
+        divisionService.createDivision(division)
+    };
+
+};
+
+FormNewDivisionController.$inject = ['division', '$scope', '$controller', 'divisionService'];
+module.exports = FormNewDivisionController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/division/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/division/new/index.js b/traffic_portal/app/src/common/modules/form/division/new/index.js
new file mode 100644
index 0000000..c1b28de
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/division/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.division.new', [])
+    .controller('FormNewDivisionController', require('./FormNewDivisionController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/job/FormJobController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/job/FormJobController.js b/traffic_portal/app/src/common/modules/form/job/FormJobController.js
new file mode 100644
index 0000000..7bf157b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/job/FormJobController.js
@@ -0,0 +1,45 @@
+/*
+ * 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 FormJobController = function(job, $scope, formUtils, locationUtils, deliveryServiceService) {
+
+	var getDeliveryServices = function() {
+		deliveryServiceService.getDeliveryServices()
+			.then(function(result) {
+				$scope.deliveryservices = result;
+			});
+	};
+
+	$scope.job = job;
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	$scope.hasError = formUtils.hasError;
+
+	$scope.hasPropertyError = formUtils.hasPropertyError;
+
+	var init = function () {
+		getDeliveryServices();
+	};
+	init();
+
+};
+
+FormJobController.$inject = ['job', '$scope', 'formUtils', 'locationUtils', 'deliveryServiceService'];
+module.exports = FormJobController;


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/configure/_configure.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/_configure.scss b/traffic_ops/experimental/ui/app/src/modules/private/configure/_configure.scss
deleted file mode 100644
index d57b9c6..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/_configure.scss
+++ /dev/null
@@ -1,16 +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_ops/experimental/ui/app/src/modules/private/configure/cacheGroups/CacheGroupsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/cacheGroups/CacheGroupsController.js b/traffic_ops/experimental/ui/app/src/modules/private/configure/cacheGroups/CacheGroupsController.js
deleted file mode 100644
index f541f60..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/cacheGroups/CacheGroupsController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var CacheGroupsController = function() {
-};
-
-CacheGroupsController.$inject = [];
-module.exports = CacheGroupsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/configure/cacheGroups/_cacheGroups.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/cacheGroups/_cacheGroups.scss b/traffic_ops/experimental/ui/app/src/modules/private/configure/cacheGroups/_cacheGroups.scss
deleted file mode 100644
index d57b9c6..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/cacheGroups/_cacheGroups.scss
+++ /dev/null
@@ -1,16 +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_ops/experimental/ui/app/src/modules/private/configure/cacheGroups/asns/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/cacheGroups/asns/index.js b/traffic_ops/experimental/ui/app/src/modules/private/configure/cacheGroups/asns/index.js
deleted file mode 100644
index 86c3807..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/cacheGroups/asns/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.private.configure.cacheGroups.asns', [])
-	.config(function($stateProvider, $urlRouterProvider) {
-		$stateProvider
-			.state('trafficPortal.private.configure.cacheGroups.asns', {
-				url: '/{cacheGroupId}/asns',
-				views: {
-					cacheGroupsContent: {
-						templateUrl: 'common/modules/table/cacheGroupAsns/table.cacheGroupAsns.tpl.html',
-						controller: 'TableCacheGroupAsnsController',
-						resolve: {
-							cacheGroup: function($stateParams, cacheGroupService) {
-								return cacheGroupService.getCacheGroup($stateParams.cacheGroupId);
-							},
-							asns: function($stateParams, asnService) {
-								return asnService.getASNs({ cachegroup: $stateParams.cacheGroupId });
-							}
-						}
-					}
-				}
-			})
-		;
-		$urlRouterProvider.otherwise('/');
-	});

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

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

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

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

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/DeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/DeliveryServicesController.js b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/DeliveryServicesController.js
deleted file mode 100644
index b472032..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/DeliveryServicesController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var DeliveryServicesController = function() {
-};
-
-DeliveryServicesController.$inject = [];
-module.exports = DeliveryServicesController;

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/edit/index.js b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/edit/index.js
deleted file mode 100644
index 40f29bf..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/edit/index.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.private.configure.deliveryServices.edit', [])
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.configure.deliveryServices.edit', {
-                url: '/{deliveryServiceId:[0-9]{1,8}}?type',
-                views: {
-                    deliveryServicesContent: {
-                        templateUrl: function ($stateParams) {
-                            var type = $stateParams.type,
-                                template;
-
-                            if (type.indexOf('ANY_MAP') != -1) {
-                                template = 'common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html'
-                            } else if (type.indexOf('DNS') != -1) {
-                                template = 'common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html'
-                            } else if (type.indexOf('HTTP') != -1) {
-                                template = 'common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html'
-                            } else if (type.indexOf('STEERING') != -1) {
-                                template = 'common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html'
-                            } else {
-
-                            }
-
-                            return template;
-                        },
-                        controller: 'FormEditDeliveryServiceController',
-                        resolve: {
-                            deliveryService: function($stateParams, deliveryServiceService) {
-                                return deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
-                            },
-                            type: function($stateParams) {
-                                return $stateParams.type;
-                            },
-                            types: function(typeService) {
-                                return typeService.getTypes({ useInTable: 'deliveryservice' });
-                            }
-                        }
-                    }
-                }
-            })
-        ;
-        $urlRouterProvider.otherwise('/');
-    });

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/DeliveryServiceJobsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/DeliveryServiceJobsController.js b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/DeliveryServiceJobsController.js
deleted file mode 100644
index f4d085d..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/DeliveryServiceJobsController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var DeliveryServiceJobsController = function() {
-};
-
-DeliveryServiceJobsController.$inject = [];
-module.exports = DeliveryServiceJobsController;

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/list/index.js b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/list/index.js
deleted file mode 100644
index 43fc35d..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/list/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.private.configure.deliveryServices.jobs.list', [])
-	.config(function($stateProvider, $urlRouterProvider) {
-		$stateProvider
-			.state('trafficPortal.private.configure.deliveryServices.jobs.list', {
-				url: '',
-				views: {
-					deliveryServiceJobsContent: {
-						templateUrl: 'common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html',
-						controller: 'TableDeliveryServiceJobsController',
-						resolve: {
-							deliveryService: function($stateParams, deliveryServiceService) {
-								return deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
-							},
-							jobs: function($stateParams, jobService) {
-								return jobService.getJobs({ dsId: $stateParams.deliveryServiceId });
-							}
-						}
-					}
-				}
-			})
-		;
-		$urlRouterProvider.otherwise('/');
-	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/new/index.js b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/new/index.js
deleted file mode 100644
index 8427e79..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/jobs/new/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.private.configure.deliveryServices.jobs.new', [])
-	.config(function($stateProvider, $urlRouterProvider) {
-		$stateProvider
-			.state('trafficPortal.private.configure.deliveryServices.jobs.new', {
-				url: '/new',
-				views: {
-					deliveryServiceJobsContent: {
-						templateUrl: 'common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html',
-						controller: 'FormNewDeliveryServiceJobController',
-						resolve: {
-							deliveryService: function($stateParams, deliveryServiceService) {
-								return deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
-							},
-							job: function($stateParams) {
-								return { dsId: $stateParams.deliveryServiceId, startTime: moment().format('YYYY-MM-DD HH:mm:ss') };
-							}
-						}
-					}
-				}
-			})
-		;
-		$urlRouterProvider.otherwise('/');
-	});

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/new/index.js b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/new/index.js
deleted file mode 100644
index f99a8b0..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/new/index.js
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.private.configure.deliveryServices.new', [])
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.configure.deliveryServices.new', {
-                url: '/new?type',
-                views: {
-                    deliveryServicesContent: {
-                        templateUrl: function ($stateParams) {
-                            var type = $stateParams.type,
-                                template;
-
-                            if (type.indexOf('ANY_MAP') != -1) {
-                                template = 'common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html'
-                            } else if (type.indexOf('DNS') != -1) {
-                                template = 'common/modules/form/deliveryService/form.deliveryService.DNS.tpl.html'
-                            } else if (type.indexOf('HTTP') != -1) {
-                                template = 'common/modules/form/deliveryService/form.deliveryService.HTTP.tpl.html'
-                            } else if (type.indexOf('STEERING') != -1) {
-                                template = 'common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html'
-                            } else {
-
-                            }
-
-                            return template;
-                        },
-                        controller: 'FormNewDeliveryServiceController',
-                        resolve: {
-                            deliveryService: function() {
-                                return {
-                                    active: false,
-                                    dscp: 0,
-                                    geoLimit: 0,
-                                    geoProvider: 0,
-                                    initialDispersion: 1,
-                                    ipv6RoutingEnabled: false,
-                                    logsEnabled: false,
-                                    multiSiteOrigin: false,
-                                    protocol: 0,
-                                    qstringIgnore: 0,
-                                    rangeRequestHandling: 0,
-                                    regionalGeoBlocking: false,
-                                    signed: false
-                                };
-                            },
-                            type: function($stateParams) {
-                                return $stateParams.type;
-                            },
-                            types: function(typeService) {
-                                return typeService.getTypes({ useInTable: 'deliveryservice' });
-                            }
-                        }
-                    }
-                }
-            })
-        ;
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/regexes/DeliveryServiceRegexesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/regexes/DeliveryServiceRegexesController.js b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/regexes/DeliveryServiceRegexesController.js
deleted file mode 100644
index ea723a1..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/regexes/DeliveryServiceRegexesController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var DeliveryServiceRegexesController = function() {
-};
-
-DeliveryServiceRegexesController.$inject = [];
-module.exports = DeliveryServiceRegexesController;

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/regexes/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/regexes/edit/index.js b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/regexes/edit/index.js
deleted file mode 100644
index 8f52637..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/regexes/edit/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.private.configure.deliveryServices.regexes.edit', [])
-	.config(function($stateProvider, $urlRouterProvider) {
-		$stateProvider
-			.state('trafficPortal.private.configure.deliveryServices.regexes.edit', {
-				url: '/{regexId:[0-9]{1,8}}',
-				views: {
-					deliveryServiceRegexesContent: {
-						templateUrl: 'common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html',
-						controller: 'FormEditDeliveryServiceRegexController',
-						resolve: {
-							deliveryService: function($stateParams, deliveryServiceService) {
-								return deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
-							},
-							regex: function($stateParams, deliveryServiceRegexService) {
-								return deliveryServiceRegexService.getDeliveryServiceRegex($stateParams.deliveryServiceId, $stateParams.regexId);
-							}
-						}
-					}
-				}
-			})
-		;
-		$urlRouterProvider.otherwise('/');
-	});

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

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

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/staticDnsEntries/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/staticDnsEntries/index.js b/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/staticDnsEntries/index.js
deleted file mode 100644
index c90d81c..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/deliveryServices/staticDnsEntries/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.private.configure.deliveryServices.staticDnsEntries', [])
-	.config(function($stateProvider, $urlRouterProvider) {
-		$stateProvider
-			.state('trafficPortal.private.configure.deliveryServices.staticDnsEntries', {
-				url: '/{deliveryServiceId}/static-dns-entries',
-				views: {
-					deliveryServicesContent: {
-						templateUrl: 'common/modules/table/deliveryServiceStaticDnsEntries/table.deliveryServiceStaticDnsEntries.tpl.html',
-						controller: 'TableDeliveryServiceStaticDnsEntriesController',
-						resolve: {
-							deliveryService: function($stateParams, deliveryServiceService) {
-								return deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
-							},
-							staticDnsEntries: function($stateParams, staticDnsEntryService) {
-								return staticDnsEntryService.getStaticDnsEntries($stateParams.deliveryServiceId);
-							}
-						}
-					}
-				}
-			})
-		;
-		$urlRouterProvider.otherwise('/');
-	});

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

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/configure/servers/ServersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/servers/ServersController.js b/traffic_ops/experimental/ui/app/src/modules/private/configure/servers/ServersController.js
deleted file mode 100644
index a015b09..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/servers/ServersController.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ServersController = function() {
-};
-
-ServersController.$inject = [];
-module.exports = ServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/modules/private/configure/servers/_servers.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/servers/_servers.scss b/traffic_ops/experimental/ui/app/src/modules/private/configure/servers/_servers.scss
deleted file mode 100644
index d57b9c6..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/servers/_servers.scss
+++ /dev/null
@@ -1,16 +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_ops/experimental/ui/app/src/modules/private/configure/servers/deliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/modules/private/configure/servers/deliveryServices/index.js b/traffic_ops/experimental/ui/app/src/modules/private/configure/servers/deliveryServices/index.js
deleted file mode 100644
index bd2d42f..0000000
--- a/traffic_ops/experimental/ui/app/src/modules/private/configure/servers/deliveryServices/index.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.private.configure.servers.deliveryServices', [])
-	.config(function($stateProvider, $urlRouterProvider) {
-		$stateProvider
-			.state('trafficPortal.private.configure.servers.deliveryServices', {
-				url: '/{serverId}/delivery-services',
-				views: {
-					serversContent: {
-						templateUrl: 'common/modules/table/serverDeliveryServices/table.serverDeliveryServices.tpl.html',
-						controller: 'TableServerDeliveryServicesController',
-						resolve: {
-							server: function($stateParams, serverService) {
-								return serverService.getServer($stateParams.serverId);
-							},
-							serverDeliveryServices: function($stateParams, deliveryServiceService) {
-								return deliveryServiceService.getServerDeliveryServices($stateParams.serverId);
-							}
-						}
-					}
-				}
-			})
-		;
-		$urlRouterProvider.otherwise('/');
-	});

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

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

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

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



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/assets/js/dataTables.tableTools.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/assets/js/dataTables.tableTools.js b/traffic_ops/experimental/ui/app/src/assets/js/dataTables.tableTools.js
deleted file mode 100755
index f5c361d..0000000
--- a/traffic_ops/experimental/ui/app/src/assets/js/dataTables.tableTools.js
+++ /dev/null
@@ -1,3084 +0,0 @@
-/*! TableTools 2.2.1
- * 2009-2014 SpryMedia Ltd - datatables.net/license
- *
- * ZeroClipboard 1.0.4
- * Author: Joseph Huckaby - MIT licensed
- */
-
-/**
- * @summary     TableTools
- * @description Tools and buttons for DataTables
- * @version     2.2.1
- * @file        dataTables.tableTools.js
- * @author      SpryMedia Ltd (www.sprymedia.co.uk)
- * @contact     www.sprymedia.co.uk/contact
- * @copyright   Copyright 2009-2014 SpryMedia Ltd.
- *
- * This source file is free software, available under the following license:
- *   MIT license - http://datatables.net/license/mit
- *
- * This source file is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
- *
- * For details please refer to: http://www.datatables.net
- */
-
-
-/* Global scope for TableTools for backwards compatibility.
- * Will be removed in 2.3
- */
-var TableTools;
-
-(function(window, document, undefined) {
-
-
-var factory = function( $, DataTable ) {
-"use strict";
-
-
-//include ZeroClipboard.js
-/* ZeroClipboard 1.0.4
- * Author: Joseph Huckaby
- */
-
-var ZeroClipboard_TableTools = {
-
-	version: "1.0.4-TableTools2",
-	clients: {}, // registered upload clients on page, indexed by id
-	moviePath: '', // URL to movie
-	nextId: 1, // ID of next movie
-
-	$: function(thingy) {
-		// simple DOM lookup utility function
-		if (typeof(thingy) == 'string') {
-			thingy = document.getElementById(thingy);
-		}
-		if (!thingy.addClass) {
-			// extend element with a few useful methods
-			thingy.hide = function() { this.style.display = 'none'; };
-			thingy.show = function() { this.style.display = ''; };
-			thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
-			thingy.removeClass = function(name) {
-				this.className = this.className.replace( new RegExp("\\s*" + name + "\\s*"), " ").replace(/^\s+/, '').replace(/\s+$/, '');
-			};
-			thingy.hasClass = function(name) {
-				return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
-			};
-		}
-		return thingy;
-	},
-
-	setMoviePath: function(path) {
-		// set path to ZeroClipboard.swf
-		this.moviePath = path;
-	},
-
-	dispatch: function(id, eventName, args) {
-		// receive event from flash movie, send to client
-		var client = this.clients[id];
-		if (client) {
-			client.receiveEvent(eventName, args);
-		}
-	},
-
-	register: function(id, client) {
-		// register new client to receive events
-		this.clients[id] = client;
-	},
-
-	getDOMObjectPosition: function(obj) {
-		// get absolute coordinates for dom element
-		var info = {
-			left: 0,
-			top: 0,
-			width: obj.width ? obj.width : obj.offsetWidth,
-			height: obj.height ? obj.height : obj.offsetHeight
-		};
-
-		if ( obj.style.width !== "" ) {
-			info.width = obj.style.width.replace("px","");
-		}
-
-		if ( obj.style.height !== "" ) {
-			info.height = obj.style.height.replace("px","");
-		}
-
-		while (obj) {
-			info.left += obj.offsetLeft;
-			info.top += obj.offsetTop;
-			obj = obj.offsetParent;
-		}
-
-		return info;
-	},
-
-	Client: function(elem) {
-		// constructor for new simple upload client
-		this.handlers = {};
-
-		// unique ID
-		this.id = ZeroClipboard_TableTools.nextId++;
-		this.movieId = 'ZeroClipboard_TableToolsMovie_' + this.id;
-
-		// register client with singleton to receive flash events
-		ZeroClipboard_TableTools.register(this.id, this);
-
-		// create movie
-		if (elem) {
-			this.glue(elem);
-		}
-	}
-};
-
-ZeroClipboard_TableTools.Client.prototype = {
-
-	id: 0, // unique ID for us
-	ready: false, // whether movie is ready to receive events or not
-	movie: null, // reference to movie object
-	clipText: '', // text to copy to clipboard
-	fileName: '', // default file save name
-	action: 'copy', // action to perform
-	handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor
-	cssEffects: true, // enable CSS mouse effects on dom container
-	handlers: null, // user event handlers
-	sized: false,
-
-	glue: function(elem, title) {
-		// glue to DOM element
-		// elem can be ID or actual DOM element object
-		this.domElement = ZeroClipboard_TableTools.$(elem);
-
-		// float just above object, or zIndex 99 if dom element isn't set
-		var zIndex = 99;
-		if (this.domElement.style.zIndex) {
-			zIndex = parseInt(this.domElement.style.zIndex, 10) + 1;
-		}
-
-		// find X/Y position of domElement
-		var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
-
-		// create floating DIV above element
-		this.div = document.createElement('div');
-		var style = this.div.style;
-		style.position = 'absolute';
-		style.left = '0px';
-		style.top = '0px';
-		style.width = (box.width) + 'px';
-		style.height = box.height + 'px';
-		style.zIndex = zIndex;
-
-		if ( typeof title != "undefined" && title !== "" ) {
-			this.div.title = title;
-		}
-		if ( box.width !== 0 && box.height !== 0 ) {
-			this.sized = true;
-		}
-
-		// style.backgroundColor = '#f00'; // debug
-		if ( this.domElement ) {
-			this.domElement.appendChild(this.div);
-			this.div.innerHTML = this.getHTML( box.width, box.height ).replace(/&/g, '&amp;');
-		}
-	},
-
-	positionElement: function() {
-		var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
-		var style = this.div.style;
-
-		style.position = 'absolute';
-		//style.left = (this.domElement.offsetLeft)+'px';
-		//style.top = this.domElement.offsetTop+'px';
-		style.width = box.width + 'px';
-		style.height = box.height + 'px';
-
-		if ( box.width !== 0 && box.height !== 0 ) {
-			this.sized = true;
-		} else {
-			return;
-		}
-
-		var flash = this.div.childNodes[0];
-		flash.width = box.width;
-		flash.height = box.height;
-	},
-
-	getHTML: function(width, height) {
-		// return HTML for movie
-		var html = '';
-		var flashvars = 'id=' + this.id +
-			'&width=' + width +
-			'&height=' + height;
-
-		if (navigator.userAgent.match(/MSIE/)) {
-			// IE gets an OBJECT tag
-			var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
-			html += '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="'+protocol+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="'+width+'" height="'+height+'" id="'+this.movieId+'" align="middle"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+ZeroClipboard_TableTools.moviePath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashvars+'"/><param name="wmode" value="transparent"/></object>';
-		}
-		else {
-			// all other browsers get an EMBED tag
-			html += '<embed id="'+this.movieId+'" src="'+ZeroClipboard_TableTools.moviePath+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="'+width+'" height="'+height+'" name="'+this.movieId+'" align="middle" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+flashvars+'" wmode="transparent" />';
-		}
-		return html;
-	},
-
-	hide: function() {
-		// temporarily hide floater offscreen
-		if (this.div) {
-			this.div.style.left = '-2000px';
-		}
-	},
-
-	show: function() {
-		// show ourselves after a call to hide()
-		this.reposition();
-	},
-
-	destroy: function() {
-		// destroy control and floater
-		if (this.domElement && this.div) {
-			this.hide();
-			this.div.innerHTML = '';
-
-			var body = document.getElementsByTagName('body')[0];
-			try { body.removeChild( this.div ); } catch(e) {}
-
-			this.domElement = null;
-			this.div = null;
-		}
-	},
-
-	reposition: function(elem) {
-		// reposition our floating div, optionally to new container
-		// warning: container CANNOT change size, only position
-		if (elem) {
-			this.domElement = ZeroClipboard_TableTools.$(elem);
-			if (!this.domElement) {
-				this.hide();
-			}
-		}
-
-		if (this.domElement && this.div) {
-			var box = ZeroClipboard_TableTools.getDOMObjectPosition(this.domElement);
-			var style = this.div.style;
-			style.left = '' + box.left + 'px';
-			style.top = '' + box.top + 'px';
-		}
-	},
-
-	clearText: function() {
-		// clear the text to be copy / saved
-		this.clipText = '';
-		if (this.ready) {
-			this.movie.clearText();
-		}
-	},
-
-	appendText: function(newText) {
-		// append text to that which is to be copied / saved
-		this.clipText += newText;
-		if (this.ready) { this.movie.appendText(newText) ;}
-	},
-
-	setText: function(newText) {
-		// set text to be copied to be copied / saved
-		this.clipText = newText;
-		if (this.ready) { this.movie.setText(newText) ;}
-	},
-
-	setCharSet: function(charSet) {
-		// set the character set (UTF16LE or UTF8)
-		this.charSet = charSet;
-		if (this.ready) { this.movie.setCharSet(charSet) ;}
-	},
-
-	setBomInc: function(bomInc) {
-		// set if the BOM should be included or not
-		this.incBom = bomInc;
-		if (this.ready) { this.movie.setBomInc(bomInc) ;}
-	},
-
-	setFileName: function(newText) {
-		// set the file name
-		this.fileName = newText;
-		if (this.ready) {
-			this.movie.setFileName(newText);
-		}
-	},
-
-	setAction: function(newText) {
-		// set action (save or copy)
-		this.action = newText;
-		if (this.ready) {
-			this.movie.setAction(newText);
-		}
-	},
-
-	addEventListener: function(eventName, func) {
-		// add user event listener for event
-		// event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
-		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
-		if (!this.handlers[eventName]) {
-			this.handlers[eventName] = [];
-		}
-		this.handlers[eventName].push(func);
-	},
-
-	setHandCursor: function(enabled) {
-		// enable hand cursor (true), or default arrow cursor (false)
-		this.handCursorEnabled = enabled;
-		if (this.ready) {
-			this.movie.setHandCursor(enabled);
-		}
-	},
-
-	setCSSEffects: function(enabled) {
-		// enable or disable CSS effects on DOM container
-		this.cssEffects = !!enabled;
-	},
-
-	receiveEvent: function(eventName, args) {
-		var self;
-
-		// receive event from flash
-		eventName = eventName.toString().toLowerCase().replace(/^on/, '');
-
-		// special behavior for certain events
-		switch (eventName) {
-			case 'load':
-				// movie claims it is ready, but in IE this isn't always the case...
-				// bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
-				this.movie = document.getElementById(this.movieId);
-				if (!this.movie) {
-					self = this;
-					setTimeout( function() { self.receiveEvent('load', null); }, 1 );
-					return;
-				}
-
-				// firefox on pc needs a "kick" in order to set these in certain cases
-				if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
-					self = this;
-					setTimeout( function() { self.receiveEvent('load', null); }, 100 );
-					this.ready = true;
-					return;
-				}
-
-				this.ready = true;
-				this.movie.clearText();
-				this.movie.appendText( this.clipText );
-				this.movie.setFileName( this.fileName );
-				this.movie.setAction( this.action );
-				this.movie.setCharSet( this.charSet );
-				this.movie.setBomInc( this.incBom );
-				this.movie.setHandCursor( this.handCursorEnabled );
-				break;
-
-			case 'mouseover':
-				if (this.domElement && this.cssEffects) {
-					//this.domElement.addClass('hover');
-					if (this.recoverActive) {
-						this.domElement.addClass('active');
-					}
-				}
-				break;
-
-			case 'mouseout':
-				if (this.domElement && this.cssEffects) {
-					this.recoverActive = false;
-					if (this.domElement.hasClass('active')) {
-						this.domElement.removeClass('active');
-						this.recoverActive = true;
-					}
-					//this.domElement.removeClass('hover');
-				}
-				break;
-
-			case 'mousedown':
-				if (this.domElement && this.cssEffects) {
-					this.domElement.addClass('active');
-				}
-				break;
-
-			case 'mouseup':
-				if (this.domElement && this.cssEffects) {
-					this.domElement.removeClass('active');
-					this.recoverActive = false;
-				}
-				break;
-		} // switch eventName
-
-		if (this.handlers[eventName]) {
-			for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
-				var func = this.handlers[eventName][idx];
-
-				if (typeof(func) == 'function') {
-					// actual function reference
-					func(this, args);
-				}
-				else if ((typeof(func) == 'object') && (func.length == 2)) {
-					// PHP style object + method, i.e. [myObject, 'myMethod']
-					func[0][ func[1] ](this, args);
-				}
-				else if (typeof(func) == 'string') {
-					// name of function
-					window[func](this, args);
-				}
-			} // foreach event handler defined
-		} // user defined handler for event
-	}
-
-};
-
-// For the Flash binding to work, ZeroClipboard_TableTools must be on the global
-// object list
-window.ZeroClipboard_TableTools = ZeroClipboard_TableTools;
-//include TableTools.js
-/* TableTools
- * 2009-2014 SpryMedia Ltd - datatables.net/license
- */
-
-/*globals TableTools,ZeroClipboard_TableTools*/
-
-
-(function($, window, document) {
-
-/** 
- * TableTools provides flexible buttons and other tools for a DataTables enhanced table
- * @class TableTools
- * @constructor
- * @param {Object} oDT DataTables instance. When using DataTables 1.10 this can
- *   also be a jQuery collection, jQuery selector, table node, DataTables API
- *   instance or DataTables settings object.
- * @param {Object} oOpts TableTools options
- * @param {String} oOpts.sSwfPath ZeroClipboard SWF path
- * @param {String} oOpts.sRowSelect Row selection options - 'none', 'single', 'multi' or 'os'
- * @param {Function} oOpts.fnPreRowSelect Callback function just prior to row selection
- * @param {Function} oOpts.fnRowSelected Callback function just after row selection
- * @param {Function} oOpts.fnRowDeselected Callback function when row is deselected
- * @param {Array} oOpts.aButtons List of buttons to be used
- */
-TableTools = function( oDT, oOpts )
-{
-	/* Santiy check that we are a new instance */
-	if ( ! this instanceof TableTools )
-	{
-		alert( "Warning: TableTools must be initialised with the keyword 'new'" );
-	}
-
-	// In 1.10 we can use the API to get the settings object from a number of
-	// sources
-	var dtSettings = $.fn.dataTable.Api ?
-		new $.fn.dataTable.Api( oDT ).settings()[0] :
-		oDT.fnSettings();
-
-
-	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-	 * Public class variables
-	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-	/**
-	 * @namespace Settings object which contains customisable information for TableTools instance
-	 */
-	this.s = {
-		/**
-		 * Store 'this' so the instance can be retrieved from the settings object
-		 * @property that
-		 * @type	 object
-		 * @default  this
-		 */
-		"that": this,
-
-		/** 
-		 * DataTables settings objects
-		 * @property dt
-		 * @type	 object
-		 * @default  <i>From the oDT init option</i>
-		 */
-		"dt": dtSettings,
-
-		/**
-		 * @namespace Print specific information
-		 */
-		"print": {
-			/** 
-			 * DataTables draw 'start' point before the printing display was shown
-			 *  @property saveStart
-			 *  @type	 int
-			 *  @default  -1
-			 */
-			"saveStart": -1,
-
-			/** 
-			 * DataTables draw 'length' point before the printing display was shown
-			 *  @property saveLength
-			 *  @type	 int
-			 *  @default  -1
-			 */
-			"saveLength": -1,
-
-			/** 
-			 * Page scrolling point before the printing display was shown so it can be restored
-			 *  @property saveScroll
-			 *  @type	 int
-			 *  @default  -1
-			 */
-			"saveScroll": -1,
-
-			/** 
-			 * Wrapped function to end the print display (to maintain scope)
-			 *  @property funcEnd
-			 *  @type	 Function
-			 *  @default  function () {}
-			 */
-			"funcEnd": function () {}
-		},
-
-		/**
-		 * A unique ID is assigned to each button in each instance
-		 * @property buttonCounter
-		 *  @type	 int
-		 * @default  0
-		 */
-		"buttonCounter": 0,
-
-		/**
-		 * @namespace Select rows specific information
-		 */
-		"select": {
-			/**
-			 * Select type - can be 'none', 'single' or 'multi'
-			 * @property type
-			 *  @type	 string
-			 * @default  ""
-			 */
-			"type": "",
-
-			/**
-			 * Array of nodes which are currently selected
-			 *  @property selected
-			 *  @type	 array
-			 *  @default  []
-			 */
-			"selected": [],
-
-			/**
-			 * Function to run before the selection can take place. Will cancel the select if the
-			 * function returns false
-			 *  @property preRowSelect
-			 *  @type	 Function
-			 *  @default  null
-			 */
-			"preRowSelect": null,
-
-			/**
-			 * Function to run when a row is selected
-			 *  @property postSelected
-			 *  @type	 Function
-			 *  @default  null
-			 */
-			"postSelected": null,
-
-			/**
-			 * Function to run when a row is deselected
-			 *  @property postDeselected
-			 *  @type	 Function
-			 *  @default  null
-			 */
-			"postDeselected": null,
-
-			/**
-			 * Indicate if all rows are selected (needed for server-side processing)
-			 *  @property all
-			 *  @type	 boolean
-			 *  @default  false
-			 */
-			"all": false,
-
-			/**
-			 * Class name to add to selected TR nodes
-			 *  @property selectedClass
-			 *  @type	 String
-			 *  @default  ""
-			 */
-			"selectedClass": ""
-		},
-
-		/**
-		 * Store of the user input customisation object
-		 *  @property custom
-		 *  @type	 object
-		 *  @default  {}
-		 */
-		"custom": {},
-
-		/**
-		 * SWF movie path
-		 *  @property swfPath
-		 *  @type	 string
-		 *  @default  ""
-		 */
-		"swfPath": "",
-
-		/**
-		 * Default button set
-		 *  @property buttonSet
-		 *  @type	 array
-		 *  @default  []
-		 */
-		"buttonSet": [],
-
-		/**
-		 * When there is more than one TableTools instance for a DataTable, there must be a 
-		 * master which controls events (row selection etc)
-		 *  @property master
-		 *  @type	 boolean
-		 *  @default  false
-		 */
-		"master": false,
-
-		/**
-		 * Tag names that are used for creating collections and buttons
-		 *  @namesapce
-		 */
-		"tags": {}
-	};
-
-
-	/**
-	 * @namespace Common and useful DOM elements for the class instance
-	 */
-	this.dom = {
-		/**
-		 * DIV element that is create and all TableTools buttons (and their children) put into
-		 *  @property container
-		 *  @type	 node
-		 *  @default  null
-		 */
-		"container": null,
-
-		/**
-		 * The table node to which TableTools will be applied
-		 *  @property table
-		 *  @type	 node
-		 *  @default  null
-		 */
-		"table": null,
-
-		/**
-		 * @namespace Nodes used for the print display
-		 */
-		"print": {
-			/**
-			 * Nodes which have been removed from the display by setting them to display none
-			 *  @property hidden
-			 *  @type	 array
-			 *  @default  []
-			 */
-			"hidden": [],
-
-			/**
-			 * The information display saying telling the user about the print display
-			 *  @property message
-			 *  @type	 node
-			 *  @default  null
-			 */
-			"message": null
-	  },
-
-		/**
-		 * @namespace Nodes used for a collection display. This contains the currently used collection
-		 */
-		"collection": {
-			/**
-			 * The div wrapper containing the buttons in the collection (i.e. the menu)
-			 *  @property collection
-			 *  @type	 node
-			 *  @default  null
-			 */
-			"collection": null,
-
-			/**
-			 * Background display to provide focus and capture events
-			 *  @property background
-			 *  @type	 node
-			 *  @default  null
-			 */
-			"background": null
-		}
-	};
-
-	/**
-	 * @namespace Name space for the classes that this TableTools instance will use
-	 * @extends TableTools.classes
-	 */
-	this.classes = $.extend( true, {}, TableTools.classes );
-	if ( this.s.dt.bJUI )
-	{
-		$.extend( true, this.classes, TableTools.classes_themeroller );
-	}
-
-
-	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-	 * Public class methods
-	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-	/**
-	 * Retreieve the settings object from an instance
-	 *  @method fnSettings
-	 *  @returns {object} TableTools settings object
-	 */
-	this.fnSettings = function () {
-		return this.s;
-	};
-
-
-	/* Constructor logic */
-	if ( typeof oOpts == 'undefined' )
-	{
-		oOpts = {};
-	}
-
-	this._fnConstruct( oOpts );
-
-	return this;
-};
-
-
-
-TableTools.prototype = {
-	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-	 * Public methods
-	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-	/**
-	 * Retreieve the settings object from an instance
-	 *  @returns {array} List of TR nodes which are currently selected
-	 *  @param {boolean} [filtered=false] Get only selected rows which are  
-	 *    available given the filtering applied to the table. By default
-	 *    this is false -  i.e. all rows, regardless of filtering are 
-	      selected.
-	 */
-	"fnGetSelected": function ( filtered )
-	{
-		var
-			out = [],
-			data = this.s.dt.aoData,
-			displayed = this.s.dt.aiDisplay,
-			i, iLen;
-
-		if ( filtered )
-		{
-			// Only consider filtered rows
-			for ( i=0, iLen=displayed.length ; i<iLen ; i++ )
-			{
-				if ( data[ displayed[i] ]._DTTT_selected )
-				{
-					out.push( data[ displayed[i] ].nTr );
-				}
-			}
-		}
-		else
-		{
-			// Use all rows
-			for ( i=0, iLen=data.length ; i<iLen ; i++ )
-			{
-				if ( data[i]._DTTT_selected )
-				{
-					out.push( data[i].nTr );
-				}
-			}
-		}
-
-		return out;
-	},
-
-
-	/**
-	 * Get the data source objects/arrays from DataTables for the selected rows (same as
-	 * fnGetSelected followed by fnGetData on each row from the table)
-	 *  @returns {array} Data from the TR nodes which are currently selected
-	 */
-	"fnGetSelectedData": function ()
-	{
-		var out = [];
-		var data=this.s.dt.aoData;
-		var i, iLen;
-
-		for ( i=0, iLen=data.length ; i<iLen ; i++ )
-		{
-			if ( data[i]._DTTT_selected )
-			{
-				out.push( this.s.dt.oInstance.fnGetData(i) );
-			}
-		}
-
-		return out;
-	},
-
-
-	/**
-	 * Check to see if a current row is selected or not
-	 *  @param {Node} n TR node to check if it is currently selected or not
-	 *  @returns {Boolean} true if select, false otherwise
-	 */
-	"fnIsSelected": function ( n )
-	{
-		var pos = this.s.dt.oInstance.fnGetPosition( n );
-		return (this.s.dt.aoData[pos]._DTTT_selected===true) ? true : false;
-	},
-
-
-	/**
-	 * Select all rows in the table
-	 *  @param {boolean} [filtered=false] Select only rows which are available 
-	 *    given the filtering applied to the table. By default this is false - 
-	 *    i.e. all rows, regardless of filtering are selected.
-	 */
-	"fnSelectAll": function ( filtered )
-	{
-		var s = this._fnGetMasterSettings();
-
-		this._fnRowSelect( (filtered === true) ?
-			s.dt.aiDisplay :
-			s.dt.aoData
-		);
-	},
-
-
-	/**
-	 * Deselect all rows in the table
-	 *  @param {boolean} [filtered=false] Deselect only rows which are available 
-	 *    given the filtering applied to the table. By default this is false - 
-	 *    i.e. all rows, regardless of filtering are deselected.
-	 */
-	"fnSelectNone": function ( filtered )
-	{
-		var s = this._fnGetMasterSettings();
-
-		this._fnRowDeselect( this.fnGetSelected(filtered) );
-	},
-
-
-	/**
-	 * Select row(s)
-	 *  @param {node|object|array} n The row(s) to select. Can be a single DOM
-	 *    TR node, an array of TR nodes or a jQuery object.
-	 */
-	"fnSelect": function ( n )
-	{
-		if ( this.s.select.type == "single" )
-		{
-			this.fnSelectNone();
-			this._fnRowSelect( n );
-		}
-		else
-		{
-			this._fnRowSelect( n );
-		}
-	},
-
-
-	/**
-	 * Deselect row(s)
-	 *  @param {node|object|array} n The row(s) to deselect. Can be a single DOM
-	 *    TR node, an array of TR nodes or a jQuery object.
-	 */
-	"fnDeselect": function ( n )
-	{
-		this._fnRowDeselect( n );
-	},
-
-
-	/**
-	 * Get the title of the document - useful for file names. The title is retrieved from either
-	 * the configuration object's 'title' parameter, or the HTML document title
-	 *  @param   {Object} oConfig Button configuration object
-	 *  @returns {String} Button title
-	 */
-	"fnGetTitle": function( oConfig )
-	{
-		var sTitle = "";
-		if ( typeof oConfig.sTitle != 'undefined' && oConfig.sTitle !== "" ) {
-			sTitle = oConfig.sTitle;
-		} else {
-			var anTitle = document.getElementsByTagName('title');
-			if ( anTitle.length > 0 )
-			{
-				sTitle = anTitle[0].innerHTML;
-			}
-		}
-
-		/* Strip characters which the OS will object to - checking for UTF8 support in the scripting
-		 * engine
-		 */
-		if ( "\u00A1".toString().length < 4 ) {
-			return sTitle.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g, "");
-		} else {
-			return sTitle.replace(/[^a-zA-Z0-9_\.,\-_ !\(\)]/g, "");
-		}
-	},
-
-
-	/**
-	 * Calculate a unity array with the column width by proportion for a set of columns to be
-	 * included for a button. This is particularly useful for PDF creation, where we can use the
-	 * column widths calculated by the browser to size the columns in the PDF.
-	 *  @param   {Object} oConfig Button configuration object
-	 *  @returns {Array} Unity array of column ratios
-	 */
-	"fnCalcColRatios": function ( oConfig )
-	{
-		var
-			aoCols = this.s.dt.aoColumns,
-			aColumnsInc = this._fnColumnTargets( oConfig.mColumns ),
-			aColWidths = [],
-			iWidth = 0, iTotal = 0, i, iLen;
-
-		for ( i=0, iLen=aColumnsInc.length ; i<iLen ; i++ )
-		{
-			if ( aColumnsInc[i] )
-			{
-				iWidth = aoCols[i].nTh.offsetWidth;
-				iTotal += iWidth;
-				aColWidths.push( iWidth );
-			}
-		}
-
-		for ( i=0, iLen=aColWidths.length ; i<iLen ; i++ )
-		{
-			aColWidths[i] = aColWidths[i] / iTotal;
-		}
-
-		return aColWidths.join('\t');
-	},
-
-
-	/**
-	 * Get the information contained in a table as a string
-	 *  @param   {Object} oConfig Button configuration object
-	 *  @returns {String} Table data as a string
-	 */
-	"fnGetTableData": function ( oConfig )
-	{
-		/* In future this could be used to get data from a plain HTML source as well as DataTables */
-		if ( this.s.dt )
-		{
-			return this._fnGetDataTablesData( oConfig );
-		}
-	},
-
-
-	/**
-	 * Pass text to a flash button instance, which will be used on the button's click handler
-	 *  @param   {Object} clip Flash button object
-	 *  @param   {String} text Text to set
-	 */
-	"fnSetText": function ( clip, text )
-	{
-		this._fnFlashSetText( clip, text );
-	},
-
-
-	/**
-	 * Resize the flash elements of the buttons attached to this TableTools instance - this is
-	 * useful for when initialising TableTools when it is hidden (display:none) since sizes can't
-	 * be calculated at that time.
-	 */
-	"fnResizeButtons": function ()
-	{
-		for ( var cli in ZeroClipboard_TableTools.clients )
-		{
-			if ( cli )
-			{
-				var client = ZeroClipboard_TableTools.clients[cli];
-				if ( typeof client.domElement != 'undefined' &&
-					 client.domElement.parentNode )
-				{
-					client.positionElement();
-				}
-			}
-		}
-	},
-
-
-	/**
-	 * Check to see if any of the ZeroClipboard client's attached need to be resized
-	 */
-	"fnResizeRequired": function ()
-	{
-		for ( var cli in ZeroClipboard_TableTools.clients )
-		{
-			if ( cli )
-			{
-				var client = ZeroClipboard_TableTools.clients[cli];
-				if ( typeof client.domElement != 'undefined' &&
-					 client.domElement.parentNode == this.dom.container &&
-					 client.sized === false )
-				{
-					return true;
-				}
-			}
-		}
-		return false;
-	},
-
-
-	/**
-	 * Programmatically enable or disable the print view
-	 *  @param {boolean} [bView=true] Show the print view if true or not given. If false, then
-	 *    terminate the print view and return to normal.
-	 *  @param {object} [oConfig={}] Configuration for the print view
-	 *  @param {boolean} [oConfig.bShowAll=false] Show all rows in the table if true
-	 *  @param {string} [oConfig.sInfo] Information message, displayed as an overlay to the
-	 *    user to let them know what the print view is.
-	 *  @param {string} [oConfig.sMessage] HTML string to show at the top of the document - will
-	 *    be included in the printed document.
-	 */
-	"fnPrint": function ( bView, oConfig )
-	{
-		if ( oConfig === undefined )
-		{
-			oConfig = {};
-		}
-
-		if ( bView === undefined || bView )
-		{
-			this._fnPrintStart( oConfig );
-		}
-		else
-		{
-			this._fnPrintEnd();
-		}
-	},
-
-
-	/**
-	 * Show a message to the end user which is nicely styled
-	 *  @param {string} message The HTML string to show to the user
-	 *  @param {int} time The duration the message is to be shown on screen for (mS)
-	 */
-	"fnInfo": function ( message, time ) {
-		var info = $('<div/>')
-			.addClass( this.classes.print.info )
-			.html( message )
-			.appendTo( 'body' );
-
-		setTimeout( function() {
-			info.fadeOut( "normal", function() {
-				info.remove();
-			} );
-		}, time );
-	},
-
-
-
-	/**
-	 * Get the container element of the instance for attaching to the DOM
-	 *   @returns {node} DOM node
-	 */
-	"fnContainer": function () {
-		return this.dom.container;
-	},
-
-
-
-	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-	 * Private methods (they are of course public in JS, but recommended as private)
-	 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-	/**
-	 * Constructor logic
-	 *  @method  _fnConstruct
-	 *  @param   {Object} oOpts Same as TableTools constructor
-	 *  @returns void
-	 *  @private 
-	 */
-	"_fnConstruct": function ( oOpts )
-	{
-		var that = this;
-
-		this._fnCustomiseSettings( oOpts );
-
-		/* Container element */
-		this.dom.container = document.createElement( this.s.tags.container );
-		this.dom.container.className = this.classes.container;
-
-		/* Row selection config */
-		if ( this.s.select.type != 'none' )
-		{
-			this._fnRowSelectConfig();
-		}
-
-		/* Buttons */
-		this._fnButtonDefinations( this.s.buttonSet, this.dom.container );
-
-		/* Destructor */
-		this.s.dt.aoDestroyCallback.push( {
-			"sName": "TableTools",
-			"fn": function () {
-				$(that.s.dt.nTBody).off( 'click.DTTT_Select', 'tr' );
-				$(that.dom.container).empty();
-
-				// Remove the instance
-				var idx = $.inArray( that, TableTools._aInstances );
-				if ( idx !== -1 ) {
-					TableTools._aInstances.splice( idx, 1 );
-				}
-			}
-		} );
-	},
-
-
-	/**
-	 * Take the user defined settings and the default settings and combine them.
-	 *  @method  _fnCustomiseSettings
-	 *  @param   {Object} oOpts Same as TableTools constructor
-	 *  @returns void
-	 *  @private 
-	 */
-	"_fnCustomiseSettings": function ( oOpts )
-	{
-		/* Is this the master control instance or not? */
-		if ( typeof this.s.dt._TableToolsInit == 'undefined' )
-		{
-			this.s.master = true;
-			this.s.dt._TableToolsInit = true;
-		}
-
-		/* We can use the table node from comparisons to group controls */
-		this.dom.table = this.s.dt.nTable;
-
-		/* Clone the defaults and then the user options */
-		this.s.custom = $.extend( {}, TableTools.DEFAULTS, oOpts );
-
-		/* Flash file location */
-		this.s.swfPath = this.s.custom.sSwfPath;
-		if ( typeof ZeroClipboard_TableTools != 'undefined' )
-		{
-			ZeroClipboard_TableTools.moviePath = this.s.swfPath;
-		}
-
-		/* Table row selecting */
-		this.s.select.type = this.s.custom.sRowSelect;
-		this.s.select.preRowSelect = this.s.custom.fnPreRowSelect;
-		this.s.select.postSelected = this.s.custom.fnRowSelected;
-		this.s.select.postDeselected = this.s.custom.fnRowDeselected;
-
-		// Backwards compatibility - allow the user to specify a custom class in the initialiser
-		if ( this.s.custom.sSelectedClass )
-		{
-			this.classes.select.row = this.s.custom.sSelectedClass;
-		}
-
-		this.s.tags = this.s.custom.oTags;
-
-		/* Button set */
-		this.s.buttonSet = this.s.custom.aButtons;
-	},
-
-
-	/**
-	 * Take the user input arrays and expand them to be fully defined, and then add them to a given
-	 * DOM element
-	 *  @method  _fnButtonDefinations
-	 *  @param {array} buttonSet Set of user defined buttons
-	 *  @param {node} wrapper Node to add the created buttons to
-	 *  @returns void
-	 *  @private 
-	 */
-	"_fnButtonDefinations": function ( buttonSet, wrapper )
-	{
-		var buttonDef;
-
-		for ( var i=0, iLen=buttonSet.length ; i<iLen ; i++ )
-		{
-			if ( typeof buttonSet[i] == "string" )
-			{
-				if ( typeof TableTools.BUTTONS[ buttonSet[i] ] == 'undefined' )
-				{
-					alert( "TableTools: Warning - unknown button type: "+buttonSet[i] );
-					continue;
-				}
-				buttonDef = $.extend( {}, TableTools.BUTTONS[ buttonSet[i] ], true );
-			}
-			else
-			{
-				if ( typeof TableTools.BUTTONS[ buttonSet[i].sExtends ] == 'undefined' )
-				{
-					alert( "TableTools: Warning - unknown button type: "+buttonSet[i].sExtends );
-					continue;
-				}
-				var o = $.extend( {}, TableTools.BUTTONS[ buttonSet[i].sExtends ], true );
-				buttonDef = $.extend( o, buttonSet[i], true );
-			}
-
-			wrapper.appendChild( this._fnCreateButton(
-				buttonDef,
-				$(wrapper).hasClass(this.classes.collection.container)
-			) );
-		}
-	},
-
-
-	/**
-	 * Create and configure a TableTools button
-	 *  @method  _fnCreateButton
-	 *  @param   {Object} oConfig Button configuration object
-	 *  @returns {Node} Button element
-	 *  @private 
-	 */
-	"_fnCreateButton": function ( oConfig, bCollectionButton )
-	{
-	  var nButton = this._fnButtonBase( oConfig, bCollectionButton );
-
-		if ( oConfig.sAction.match(/flash/) )
-		{
-			this._fnFlashConfig( nButton, oConfig );
-		}
-		else if ( oConfig.sAction == "text" )
-		{
-			this._fnTextConfig( nButton, oConfig );
-		}
-		else if ( oConfig.sAction == "div" )
-		{
-			this._fnTextConfig( nButton, oConfig );
-		}
-		else if ( oConfig.sAction == "collection" )
-		{
-			this._fnTextConfig( nButton, oConfig );
-			this._fnCollectionConfig( nButton, oConfig );
-		}
-
-		return nButton;
-	},
-
-
-	/**
-	 * Create the DOM needed for the button and apply some base properties. All buttons start here
-	 *  @method  _fnButtonBase
-	 *  @param   {o} oConfig Button configuration object
-	 *  @returns {Node} DIV element for the button
-	 *  @private
-	 */
-	"_fnButtonBase": function ( o, bCollectionButton )
-	{
-		var sTag, sLiner, sClass;
-
-		if ( bCollectionButton )
-		{
-			sTag = o.sTag && o.sTag !== "default" ? o.sTag : this.s.tags.collection.button;
-			sLiner = o.sLinerTag && o.sLinerTag !== "default" ? o.sLiner : this.s.tags.collection.liner;
-			sClass = this.classes.collection.buttons.normal;
-		}
-		else
-		{
-			sTag = o.sTag && o.sTag !== "default" ? o.sTag : this.s.tags.button;
-			sLiner = o.sLinerTag && o.sLinerTag !== "default" ? o.sLiner : this.s.tags.liner;
-			sClass = this.classes.buttons.normal;
-		}
-
-		var
-		  nButton = document.createElement( sTag ),
-		  nSpan = document.createElement( sLiner ),
-		  masterS = this._fnGetMasterSettings();
-
-		nButton.className = sClass+" "+o.sButtonClass;
-		nButton.setAttribute('id', "ToolTables_"+this.s.dt.sInstance+"_"+masterS.buttonCounter );
-		nButton.appendChild( nSpan );
-		nSpan.innerHTML = o.sButtonText;
-
-		masterS.buttonCounter++;
-
-		return nButton;
-	},
-
-
-	/**
-	 * Get the settings object for the master instance. When more than one TableTools instance is
-	 * assigned to a DataTable, only one of them can be the 'master' (for the select rows). As such,
-	 * we will typically want to interact with that master for global properties.
-	 *  @method  _fnGetMasterSettings
-	 *  @returns {Object} TableTools settings object
-	 *  @private 
-	 */
-	"_fnGetMasterSettings": function ()
-	{
-		if ( this.s.master )
-		{
-			return this.s;
-		}
-		else
-		{
-			/* Look for the master which has the same DT as this one */
-			var instances = TableTools._aInstances;
-			for ( var i=0, iLen=instances.length ; i<iLen ; i++ )
-			{
-				if ( this.dom.table == instances[i].s.dt.nTable )
-				{
-					return instances[i].s;
-				}
-			}
-		}
-	},
-
-
-
-	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-	 * Button collection functions
-	 */
-
-	/**
-	 * Create a collection button, when activated will present a drop down list of other buttons
-	 *  @param   {Node} nButton Button to use for the collection activation
-	 *  @param   {Object} oConfig Button configuration object
-	 *  @returns void
-	 *  @private
-	 */
-	"_fnCollectionConfig": function ( nButton, oConfig )
-	{
-		var nHidden = document.createElement( this.s.tags.collection.container );
-		nHidden.style.display = "none";
-		nHidden.className = this.classes.collection.container;
-		oConfig._collection = nHidden;
-		document.body.appendChild( nHidden );
-
-		this._fnButtonDefinations( oConfig.aButtons, nHidden );
-	},
-
-
-	/**
-	 * Show a button collection
-	 *  @param   {Node} nButton Button to use for the collection
-	 *  @param   {Object} oConfig Button configuration object
-	 *  @returns void
-	 *  @private
-	 */
-	"_fnCollectionShow": function ( nButton, oConfig )
-	{
-		var
-			that = this,
-			oPos = $(nButton).offset(),
-			nHidden = oConfig._collection,
-			iDivX = oPos.left,
-			iDivY = oPos.top + $(nButton).outerHeight(),
-			iWinHeight = $(window).height(), iDocHeight = $(document).height(),
-			iWinWidth = $(window).width(), iDocWidth = $(document).width();
-
-		nHidden.style.position = "absolute";
-		nHidden.style.left = iDivX+"px";
-		nHidden.style.top = iDivY+"px";
-		nHidden.style.display = "block";
-		$(nHidden).css('opacity',0);
-
-		var nBackground = document.createElement('div');
-		nBackground.style.position = "absolute";
-		nBackground.style.left = "0px";
-		nBackground.style.top = "0px";
-		nBackground.style.height = ((iWinHeight>iDocHeight)? iWinHeight : iDocHeight) +"px";
-		nBackground.style.width = ((iWinWidth>iDocWidth)? iWinWidth : iDocWidth) +"px";
-		nBackground.className = this.classes.collection.background;
-		$(nBackground).css('opacity',0);
-
-		document.body.appendChild( nBackground );
-		document.body.appendChild( nHidden );
-
-		/* Visual corrections to try and keep the collection visible */
-		var iDivWidth = $(nHidden).outerWidth();
-		var iDivHeight = $(nHidden).outerHeight();
-
-		if ( iDivX + iDivWidth > iDocWidth )
-		{
-			nHidden.style.left = (iDocWidth-iDivWidth)+"px";
-		}
-
-		if ( iDivY + iDivHeight > iDocHeight )
-		{
-			nHidden.style.top = (iDivY-iDivHeight-$(nButton).outerHeight())+"px";
-		}
-
-		this.dom.collection.collection = nHidden;
-		this.dom.collection.background = nBackground;
-
-		/* This results in a very small delay for the end user but it allows the animation to be
-		 * much smoother. If you don't want the animation, then the setTimeout can be removed
-		 */
-		setTimeout( function () {
-			$(nHidden).animate({"opacity": 1}, 500);
-			$(nBackground).animate({"opacity": 0.25}, 500);
-		}, 10 );
-
-		/* Resize the buttons to the Flash contents fit */
-		this.fnResizeButtons();
-
-		/* Event handler to remove the collection display */
-		$(nBackground).click( function () {
-			that._fnCollectionHide.call( that, null, null );
-		} );
-	},
-
-
-	/**
-	 * Hide a button collection
-	 *  @param   {Node} nButton Button to use for the collection
-	 *  @param   {Object} oConfig Button configuration object
-	 *  @returns void
-	 *  @private
-	 */
-	"_fnCollectionHide": function ( nButton, oConfig )
-	{
-		if ( oConfig !== null && oConfig.sExtends == 'collection' )
-		{
-			return;
-		}
-
-		if ( this.dom.collection.collection !== null )
-		{
-			$(this.dom.collection.collection).animate({"opacity": 0}, 500, function (e) {
-				this.style.display = "none";
-			} );
-
-			$(this.dom.collection.background).animate({"opacity": 0}, 500, function (e) {
-				this.parentNode.removeChild( this );
-			} );
-
-			this.dom.collection.collection = null;
-			this.dom.collection.background = null;
-		}
-	},
-
-
-
-	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-	 * Row selection functions
-	 */
-
-	/**
-	 * Add event handlers to a table to allow for row selection
-	 *  @method  _fnRowSelectConfig
-	 *  @returns void
-	 *  @private 
-	 */
-	"_fnRowSelectConfig": function ()
-	{
-		if ( this.s.master )
-		{
-			var
-				that = this,
-				i, iLen,
-				dt = this.s.dt,
-				aoOpenRows = this.s.dt.aoOpenRows;
-
-			$(dt.nTable).addClass( this.classes.select.table );
-
-			// When using OS style selection, we want to cancel the shift text
-			// selection, but only when the shift key is used (so you can
-			// actually still select text in the table)
-			if ( this.s.select.type === 'os' ) {
-				$(dt.nTBody).on( 'mousedown.DTTT_Select', 'tr', function(e) {
-					if ( e.shiftKey ) {
-
-						$(dt.nTBody)
-							.css( '-moz-user-select', 'none' )
-							.one('selectstart.DTTT_Select', 'tr', function () {
-								return false;
-							} );
-					}
-				} );
-
-				$(dt.nTBody).on( 'mouseup.DTTT_Select', 'tr', function(e) {
-					$(dt.nTBody).css( '-moz-user-select', '' );
-				} );
-			}
-
-			// Row selection
-			$(dt.nTBody).on( 'click.DTTT_Select', this.s.custom.sRowSelector, function(e) {
-				var row = this.nodeName.toLowerCase() === 'tr' ?
-					this :
-					$(this).parents('tr')[0];
-
-				var select = that.s.select;
-				var pos = that.s.dt.oInstance.fnGetPosition( row );
-
-				/* Sub-table must be ignored (odd that the selector won't do this with >) */
-				if ( row.parentNode != dt.nTBody ) {
-					return;
-				}
-
-				/* Check that we are actually working with a DataTables controlled row */
-				if ( dt.oInstance.fnGetData(row) === null ) {
-				    return;
-				}
-
-				// Shift click, ctrl click and simple click handling to make
-				// row selection a lot like a file system in desktop OSs
-				if ( select.type == 'os' ) {
-					if ( e.ctrlKey || e.metaKey ) {
-						// Add or remove from the selection
-						if ( that.fnIsSelected( row ) ) {
-							that._fnRowDeselect( row, e );
-						}
-						else {
-							that._fnRowSelect( row, e );
-						}
-					}
-					else if ( e.shiftKey ) {
-						// Add a range of rows, from the last selected row to
-						// this one
-						var rowIdxs = that.s.dt.aiDisplay.slice(); // visible rows
-						var idx1 = $.inArray( select.lastRow, rowIdxs );
-						var idx2 = $.inArray( pos, rowIdxs );
-
-						if ( that.fnGetSelected().length === 0 || idx1 === -1 ) {
-							// select from top to here - slightly odd, but both
-							// Windows and Mac OS do this
-							rowIdxs.splice( $.inArray( pos, rowIdxs )+1, rowIdxs.length );
-						}
-						else {
-							// reverse so we can shift click 'up' as well as down
-							if ( idx1 > idx2 ) {
-								var tmp = idx2;
-								idx2 = idx1;
-								idx1 = tmp;
-							}
-
-							rowIdxs.splice( idx2+1, rowIdxs.length );
-							rowIdxs.splice( 0, idx1 );
-						}
-
-						if ( ! that.fnIsSelected( row ) ) {
-							// Select range
-							that._fnRowSelect( rowIdxs, e );
-						}
-						else {
-							// Deselect range - need to keep the clicked on row selected
-							rowIdxs.splice( $.inArray( pos, rowIdxs ), 1 );
-							that._fnRowDeselect( rowIdxs, e );
-						}
-					}
-					else {
-						// No cmd or shift click. Deselect current if selected,
-						// or select this row only
-						if ( that.fnIsSelected( row ) && that.fnGetSelected().length === 1 ) {
-							that._fnRowDeselect( row, e );
-						}
-						else {
-							that.fnSelectNone();
-							that._fnRowSelect( row, e );
-						}
-					}
-				}
-				else if ( that.fnIsSelected( row ) ) {
-					that._fnRowDeselect( row, e );
-				}
-				else if ( select.type == "single" ) {
-					that.fnSelectNone();
-					that._fnRowSelect( row, e );
-				}
-				else if ( select.type == "multi" ) {
-					that._fnRowSelect( row, e );
-				}
-
-				select.lastRow = pos;
-			} );//.on('selectstart', function () { return false; } );
-
-			// Bind a listener to the DataTable for when new rows are created.
-			// This allows rows to be visually selected when they should be and
-			// deferred rendering is used.
-			dt.oApi._fnCallbackReg( dt, 'aoRowCreatedCallback', function (tr, data, index) {
-				if ( dt.aoData[index]._DTTT_selected ) {
-					$(tr).addClass( that.classes.select.row );
-				}
-			}, 'TableTools-SelectAll' );
-		}
-	},
-
-	/**
-	 * Select rows
-	 *  @param   {*} src Rows to select - see _fnSelectData for a description of valid inputs
-	 *  @private 
-	 */
-	"_fnRowSelect": function ( src, e )
-	{
-		var
-			that = this,
-			data = this._fnSelectData( src ),
-			firstTr = data.length===0 ? null : data[0].nTr,
-			anSelected = [],
-			i, len;
-
-		// Get all the rows that will be selected
-		for ( i=0, len=data.length ; i<len ; i++ )
-		{
-			if ( data[i].nTr )
-			{
-				anSelected.push( data[i].nTr );
-			}
-		}
-
-		// User defined pre-selection function
-		if ( this.s.select.preRowSelect !== null && !this.s.select.preRowSelect.call(this, e, anSelected, true) )
-		{
-			return;
-		}
-
-		// Mark them as selected
-		for ( i=0, len=data.length ; i<len ; i++ )
-		{
-			data[i]._DTTT_selected = true;
-
-			if ( data[i].nTr )
-			{
-				$(data[i].nTr).addClass( that.classes.select.row );
-			}
-		}
-
-		// Post-selection function
-		if ( this.s.select.postSelected !== null )
-		{
-			this.s.select.postSelected.call( this, anSelected );
-		}
-
-		TableTools._fnEventDispatch( this, 'select', anSelected, true );
-	},
-
-	/**
-	 * Deselect rows
-	 *  @param   {*} src Rows to deselect - see _fnSelectData for a description of valid inputs
-	 *  @private 
-	 */
-	"_fnRowDeselect": function ( src, e )
-	{
-		var
-			that = this,
-			data = this._fnSelectData( src ),
-			firstTr = data.length===0 ? null : data[0].nTr,
-			anDeselectedTrs = [],
-			i, len;
-
-		// Get all the rows that will be deselected
-		for ( i=0, len=data.length ; i<len ; i++ )
-		{
-			if ( data[i].nTr )
-			{
-				anDeselectedTrs.push( data[i].nTr );
-			}
-		}
-
-		// User defined pre-selection function
-		if ( this.s.select.preRowSelect !== null && !this.s.select.preRowSelect.call(this, e, anDeselectedTrs, false) )
-		{
-			return;
-		}
-
-		// Mark them as deselected
-		for ( i=0, len=data.length ; i<len ; i++ )
-		{
-			data[i]._DTTT_selected = false;
-
-			if ( data[i].nTr )
-			{
-				$(data[i].nTr).removeClass( that.classes.select.row );
-			}
-		}
-
-		// Post-deselection function
-		if ( this.s.select.postDeselected !== null )
-		{
-			this.s.select.postDeselected.call( this, anDeselectedTrs );
-		}
-
-		TableTools._fnEventDispatch( this, 'select', anDeselectedTrs, false );
-	},
-
-	/**
-	 * Take a data source for row selection and convert it into aoData points for the DT
-	 *   @param {*} src Can be a single DOM TR node, an array of TR nodes (including a
-	 *     a jQuery object), a single aoData point from DataTables, an array of aoData
-	 *     points or an array of aoData indexes
-	 *   @returns {array} An array of aoData points
-	 */
-	"_fnSelectData": function ( src )
-	{
-		var out = [], pos, i, iLen;
-
-		if ( src.nodeName )
-		{
-			// Single node
-			pos = this.s.dt.oInstance.fnGetPosition( src );
-			out.push( this.s.dt.aoData[pos] );
-		}
-		else if ( typeof src.length !== 'undefined' )
-		{
-			// jQuery object or an array of nodes, or aoData points
-			for ( i=0, iLen=src.length ; i<iLen ; i++ )
-			{
-				if ( src[i].nodeName )
-				{
-					pos = this.s.dt.oInstance.fnGetPosition( src[i] );
-					out.push( this.s.dt.aoData[pos] );
-				}
-				else if ( typeof src[i] === 'number' )
-				{
-					out.push( this.s.dt.aoData[ src[i] ] );
-				}
-				else
-				{
-					out.push( src[i] );
-				}
-			}
-
-			return out;
-		}
-		else
-		{
-			// A single aoData point
-			out.push( src );
-		}
-
-		return out;
-	},
-
-
-	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-	 * Text button functions
-	 */
-
-	/**
-	 * Configure a text based button for interaction events
-	 *  @method  _fnTextConfig
-	 *  @param   {Node} nButton Button element which is being considered
-	 *  @param   {Object} oConfig Button configuration object
-	 *  @returns void
-	 *  @private 
-	 */
-	"_fnTextConfig": function ( nButton, oConfig )
-	{
-		var that = this;
-
-		if ( oConfig.fnInit !== null )
-		{
-			oConfig.fnInit.call( this, nButton, oConfig );
-		}
-
-		if ( oConfig.sToolTip !== "" )
-		{
-			nButton.title = oConfig.sToolTip;
-		}
-
-		$(nButton).hover( function () {
-			if ( oConfig.fnMouseover !== null )
-			{
-				oConfig.fnMouseover.call( this, nButton, oConfig, null );
-			}
-		}, function () {
-			if ( oConfig.fnMouseout !== null )
-			{
-				oConfig.fnMouseout.call( this, nButton, oConfig, null );
-			}
-		} );
-
-		if ( oConfig.fnSelect !== null )
-		{
-			TableTools._fnEventListen( this, 'select', function (n) {
-				oConfig.fnSelect.call( that, nButton, oConfig, n );
-			} );
-		}
-
-		$(nButton).click( function (e) {
-			//e.preventDefault();
-
-			if ( oConfig.fnClick !== null )
-			{
-				oConfig.fnClick.call( that, nButton, oConfig, null, e );
-			}
-
-			/* Provide a complete function to match the behaviour of the flash elements */
-			if ( oConfig.fnComplete !== null )
-			{
-				oConfig.fnComplete.call( that, nButton, oConfig, null, null );
-			}
-
-			that._fnCollectionHide( nButton, oConfig );
-		} );
-	},
-
-
-
-	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-	 * Flash button functions
-	 */
-
-	/**
-	 * Configure a flash based button for interaction events
-	 *  @method  _fnFlashConfig
-	 *  @param   {Node} nButton Button element which is being considered
-	 *  @param   {o} oConfig Button configuration object
-	 *  @returns void
-	 *  @private 
-	 */
-	"_fnFlashConfig": function ( nButton, oConfig )
-	{
-		var that = this;
-		var flash = new ZeroClipboard_TableTools.Client();
-
-		if ( oConfig.fnInit !== null )
-		{
-			oConfig.fnInit.call( this, nButton, oConfig );
-		}
-
-		flash.setHandCursor( true );
-
-		if ( oConfig.sAction == "flash_save" )
-		{
-			flash.setAction( 'save' );
-			flash.setCharSet( (oConfig.sCharSet=="utf16le") ? 'UTF16LE' : 'UTF8' );
-			flash.setBomInc( oConfig.bBomInc );
-			flash.setFileName( oConfig.sFileName.replace('*', this.fnGetTitle(oConfig)) );
-		}
-		else if ( oConfig.sAction == "flash_pdf" )
-		{
-			flash.setAction( 'pdf' );
-			flash.setFileName( oConfig.sFileName.replace('*', this.fnGetTitle(oConfig)) );
-		}
-		else
-		{
-			flash.setAction( 'copy' );
-		}
-
-		flash.addEventListener('mouseOver', function(client) {
-			if ( oConfig.fnMouseover !== null )
-			{
-				oConfig.fnMouseover.call( that, nButton, oConfig, flash );
-			}
-		} );
-
-		flash.addEventListener('mouseOut', function(client) {
-			if ( oConfig.fnMouseout !== null )
-			{
-				oConfig.fnMouseout.call( that, nButton, oConfig, flash );
-			}
-		} );
-
-		flash.addEventListener('mouseDown', function(client) {
-			if ( oConfig.fnClick !== null )
-			{
-				oConfig.fnClick.call( that, nButton, oConfig, flash );
-			}
-		} );
-
-		flash.addEventListener('complete', function (client, text) {
-			if ( oConfig.fnComplete !== null )
-			{
-				oConfig.fnComplete.call( that, nButton, oConfig, flash, text );
-			}
-			that._fnCollectionHide( nButton, oConfig );
-		} );
-
-		this._fnFlashGlue( flash, nButton, oConfig.sToolTip );
-	},
-
-
-	/**
-	 * Wait until the id is in the DOM before we "glue" the swf. Note that this function will call
-	 * itself (using setTimeout) until it completes successfully
-	 *  @method  _fnFlashGlue
-	 *  @param   {Object} clip Zero clipboard object
-	 *  @param   {Node} node node to glue swf to
-	 *  @param   {String} text title of the flash movie
-	 *  @returns void
-	 *  @private 
-	 */
-	"_fnFlashGlue": function ( flash, node, text )
-	{
-		var that = this;
-		var id = node.getAttribute('id');
-
-		if ( document.getElementById(id) )
-		{
-			flash.glue( node, text );
-		}
-		else
-		{
-			setTimeout( function () {
-				that._fnFlashGlue( flash, node, text );
-			}, 100 );
-		}
-	},
-
-
-	/**
-	 * Set the text for the flash clip to deal with
-	 * 
-	 * This function is required for large information sets. There is a limit on the 
-	 * amount of data that can be transferred between Javascript and Flash in a single call, so
-	 * we use this method to build up the text in Flash by sending over chunks. It is estimated
-	 * that the data limit is around 64k, although it is undocumented, and appears to be different
-	 * between different flash versions. We chunk at 8KiB.
-	 *  @method  _fnFlashSetText
-	 *  @param   {Object} clip the ZeroClipboard object
-	 *  @param   {String} sData the data to be set
-	 *  @returns void
-	 *  @private 
-	 */
-	"_fnFlashSetText": function ( clip, sData )
-	{
-		var asData = this._fnChunkData( sData, 8192 );
-
-		clip.clearText();
-		for ( var i=0, iLen=asData.length ; i<iLen ; i++ )
-		{
-			clip.appendText( asData[i] );
-		}
-	},
-
-
-
-	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-	 * Data retrieval functions
-	 */
-
-	/**
-	 * Convert the mixed columns variable into a boolean array the same size as the columns, which
-	 * indicates which columns we want to include
-	 *  @method  _fnColumnTargets
-	 *  @param   {String|Array} mColumns The columns to be included in data retrieval. If a string
-	 *			 then it can take the value of "visible" or "hidden" (to include all visible or
-	 *			 hidden columns respectively). Or an array of column indexes
-	 *  @returns {Array} A boolean array the length of the columns of the table, which each value
-	 *			 indicating if the column is to be included or not
-	 *  @private 
-	 */
-	"_fnColumnTargets": function ( mColumns )
-	{
-		var aColumns = [];
-		var dt = this.s.dt;
-		var i, iLen;
-
-		if ( typeof mColumns == "object" )
-		{
-			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
-			{
-				aColumns.push( false );
-			}
-
-			for ( i=0, iLen=mColumns.length ; i<iLen ; i++ )
-			{
-				aColumns[ mColumns[i] ] = true;
-			}
-		}
-		else if ( mColumns == "visible" )
-		{
-			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
-			{
-				aColumns.push( dt.aoColumns[i].bVisible ? true : false );
-			}
-		}
-		else if ( mColumns == "hidden" )
-		{
-			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
-			{
-				aColumns.push( dt.aoColumns[i].bVisible ? false : true );
-			}
-		}
-		else if ( mColumns == "sortable" )
-		{
-			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
-			{
-				aColumns.push( dt.aoColumns[i].bSortable ? true : false );
-			}
-		}
-		else /* all */
-		{
-			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
-			{
-				aColumns.push( true );
-			}
-		}
-
-		return aColumns;
-	},
-
-
-	/**
-	 * New line character(s) depend on the platforms
-	 *  @method  method
-	 *  @param   {Object} oConfig Button configuration object - only interested in oConfig.sNewLine
-	 *  @returns {String} Newline character
-	 */
-	"_fnNewline": function ( oConfig )
-	{
-		if ( oConfig.sNewLine == "auto" )
-		{
-			return navigator.userAgent.match(/Windows/) ? "\r\n" : "\n";
-		}
-		else
-		{
-			return oConfig.sNewLine;
-		}
-	},
-
-
-	/**
-	 * Get data from DataTables' internals and format it for output
-	 *  @method  _fnGetDataTablesData
-	 *  @param   {Object} oConfig Button configuration object
-	 *  @param   {String} oConfig.sFieldBoundary Field boundary for the data cells in the string
-	 *  @param   {String} oConfig.sFieldSeperator Field separator for the data cells
-	 *  @param   {String} oConfig.sNewline New line options
-	 *  @param   {Mixed} oConfig.mColumns Which columns should be included in the output
-	 *  @param   {Boolean} oConfig.bHeader Include the header
-	 *  @param   {Boolean} oConfig.bFooter Include the footer
-	 *  @param   {Boolean} oConfig.bSelectedOnly Include only the selected rows in the output
-	 *  @returns {String} Concatenated string of data
-	 *  @private 
-	 */
-	"_fnGetDataTablesData": function ( oConfig )
-	{
-		var i, iLen, j, jLen;
-		var aRow, aData=[], sLoopData='', arr;
-		var dt = this.s.dt, tr, child;
-		var regex = new RegExp(oConfig.sFieldBoundary, "g"); /* Do it here for speed */
-		var aColumnsInc = this._fnColumnTargets( oConfig.mColumns );
-		var bSelectedOnly = (typeof oConfig.bSelectedOnly != 'undefined') ? oConfig.bSelectedOnly : false;
-
-		/*
-		 * Header
-		 */
-		if ( oConfig.bHeader )
-		{
-			aRow = [];
-
-			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
-			{
-				if ( aColumnsInc[i] )
-				{
-					sLoopData = dt.aoColumns[i].sTitle.replace(/\n/g," ").replace( /<.*?>/g, "" ).replace(/^\s+|\s+$/g,"");
-					sLoopData = this._fnHtmlDecode( sLoopData );
-
-					aRow.push( this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) );
-				}
-			}
-
-			aData.push( aRow.join(oConfig.sFieldSeperator) );
-		}
-
-		/*
-		 * Body
-		 */
-		var aSelected = this.fnGetSelected();
-		bSelectedOnly = this.s.select.type !== "none" && bSelectedOnly && aSelected.length !== 0;
-
-		var aDataIndex = dt.oInstance
-			.$('tr', oConfig.oSelectorOpts)
-			.map( function (id, row) {
-				// If "selected only", then ensure that the row is in the selected list
-				return bSelectedOnly && $.inArray( row, aSelected ) === -1 ?
-					null :
-					dt.oInstance.fnGetPosition( row );
-			} )
-			.get();
-
-		for ( j=0, jLen=aDataIndex.length ; j<jLen ; j++ )
-		{
-			tr = dt.aoData[ aDataIndex[j] ].nTr;
-			aRow = [];
-
-			/* Columns */
-			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
-			{
-				if ( aColumnsInc[i] )
-				{
-					/* Convert to strings (with small optimisation) */
-					var mTypeData = dt.oApi._fnGetCellData( dt, aDataIndex[j], i, 'display' );
-					if ( oConfig.fnCellRender )
-					{
-						sLoopData = oConfig.fnCellRender( mTypeData, i, tr, aDataIndex[j] )+"";
-					}
-					else if ( typeof mTypeData == "string" )
-					{
-						/* Strip newlines, replace img tags with alt attr. and finally strip html... */
-						sLoopData = mTypeData.replace(/\n/g," ");
-						sLoopData =
-						    sLoopData.replace(/<img.*?\s+alt\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s>]+)).*?>/gi,
-						        '$1$2$3');
-						sLoopData = sLoopData.replace( /<.*?>/g, "" );
-					}
-					else
-					{
-						sLoopData = mTypeData+"";
-					}
-
-					/* Trim and clean the data */
-					sLoopData = sLoopData.replace(/^\s+/, '').replace(/\s+$/, '');
-					sLoopData = this._fnHtmlDecode( sLoopData );
-
-					/* Bound it and add it to the total data */
-					aRow.push( this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) );
-				}
-			}
-
-			aData.push( aRow.join(oConfig.sFieldSeperator) );
-
-			/* Details rows from fnOpen */
-			if ( oConfig.bOpenRows )
-			{
-				arr = $.grep(dt.aoOpenRows, function(o) { return o.nParent === tr; });
-
-				if ( arr.length === 1 )
-				{
-					sLoopData = this._fnBoundData( $('td', arr[0].nTr).html(), oConfig.sFieldBoundary, regex );
-					aData.push( sLoopData );
-				}
-			}
-		}
-
-		/*
-		 * Footer
-		 */
-		if ( oConfig.bFooter && dt.nTFoot !== null )
-		{
-			aRow = [];
-
-			for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
-			{
-				if ( aColumnsInc[i] && dt.aoColumns[i].nTf !== null )
-				{
-					sLoopData = dt.aoColumns[i].nTf.innerHTML.replace(/\n/g," ").replace( /<.*?>/g, "" );
-					sLoopData = this._fnHtmlDecode( sLoopData );
-
-					aRow.push( this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) );
-				}
-			}
-
-			aData.push( aRow.join(oConfig.sFieldSeperator) );
-		}
-
-		var _sLastData = aData.join( this._fnNewline(oConfig) );
-		return _sLastData;
-	},
-
-
-	/**
-	 * Wrap data up with a boundary string
-	 *  @method  _fnBoundData
-	 *  @param   {String} sData data to bound
-	 *  @param   {String} sBoundary bounding char(s)
-	 *  @param   {RegExp} regex search for the bounding chars - constructed outside for efficiency
-	 *			 in the loop
-	 *  @returns {String} bound data
-	 *  @private 
-	 */
-	"_fnBoundData": function ( sData, sBoundary, regex )
-	{
-		if ( sBoundary === "" )
-		{
-			return sData;
-		}
-		else
-		{
-			return sBoundary + sData.replace(regex, sBoundary+sBoundary) + sBoundary;
-		}
-	},
-
-
-	/**
-	 * Break a string up into an array of smaller strings
-	 *  @method  _fnChunkData
-	 *  @param   {String} sData data to be broken up
-	 *  @param   {Int} iSize chunk size
-	 *  @returns {Array} String array of broken up text
-	 *  @private 
-	 */
-	"_fnChunkData": function ( sData, iSize )
-	{
-		var asReturn = [];
-		var iStrlen = sData.length;
-
-		for ( var i=0 ; i<iStrlen ; i+=iSize )
-		{
-			if ( i+iSize < iStrlen )
-			{
-				asReturn.push( sData.substring( i, i+iSize ) );
-			}
-			else
-			{
-				asReturn.push( sData.substring( i, iStrlen ) );
-			}
-		}
-
-		return asReturn;
-	},
-
-
-	/**
-	 * Decode HTML entities
-	 *  @method  _fnHtmlDecode
-	 *  @param   {String} sData encoded string
-	 *  @returns {String} decoded string
-	 *  @private 
-	 */
-	"_fnHtmlDecode": function ( sData )
-	{
-		if ( sData.indexOf('&') === -1 )
-		{
-			return sData;
-		}
-
-		var n = document.createElement('div');
-
-		return sData.replace( /&([^\s]*);/g, function( match, match2 ) {
-			if ( match.substr(1, 1) === '#' )
-			{
-				return String.fromCharCode( Number(match2.substr(1)) );
-			}
-			else
-			{
-				n.innerHTML = match;
-				return n.childNodes[0].nodeValue;
-			}
-		} );
-	},
-
-
-
-	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-	 * Printing functions
-	 */
-
-	/**
-	 * Show print display
-	 *  @method  _fnPrintStart
-	 *  @param   {Event} e Event object
-	 *  @param   {Object} oConfig Button configuration object
-	 *  @returns void
-	 *  @private 
-	 */
-	"_fnPrintStart": function ( oConfig )
-	{
-	  var that = this;
-	  var oSetDT = this.s.dt;
-
-		/* Parse through the DOM hiding everything that isn't needed for the table */
-		this._fnPrintHideNodes( oSetDT.nTable );
-
-		/* Show the whole table */
-		this.s.print.saveStart = oSetDT._iDisplayStart;
-		this.s.print.saveLength = oSetDT._iDisplayLength;
-
-		if ( oConfig.bShowAll )
-		{
-			oSetDT._iDisplayStart = 0;
-			oSetDT._iDisplayLength = -1;
-			if ( oSetDT.oApi._fnCalculateEnd ) {
-				oSetDT.oApi._fnCalculateEnd( oSetDT );
-			}
-			oSetDT.oApi._fnDraw( oSetDT );
-		}
-
-		/* Adjust the display for scrolling which might be done by DataTables */
-		if ( oSetDT.oScroll.sX !== "" || oSetDT.oScroll.sY !== "" )
-		{
-			this._fnPrintScrollStart( oSetDT );
-
-			// If the table redraws while in print view, the DataTables scrolling
-			// setup would hide the header, so we need to readd it on draw
-			$(this.s.dt.nTable).bind('draw.DTTT_Print', function () {
-				that._fnPrintScrollStart( oSetDT );
-			} );
-		}
-
-		/* Remove the other DataTables feature nodes - but leave the table! and info div */
-		var anFeature = oSetDT.aanFeatures;
-		for ( var cFeature in anFeature )
-		{
-			if ( cFeature != 'i' && cFeature != 't' && cFeature.length == 1 )
-			{
-				for ( var i=0, iLen=anFeature[cFeature].length ; i<iLen ; i++ )
-				{
-					this.dom.print.hidden.push( {
-						"node": anFeature[cFeature][i],
-						"display": "block"
-					} );
-					anFeature[cFeature][i].style.display = "none";
-				}
-			}
-		}
-
-		/* Print class can be used for styling */
-		$(document.body).addClass( this.classes.print.body );
-
-		/* Show information message to let the user know what is happening */
-		if ( oConfig.sInfo !== "" )
-		{
-			this.fnInfo( oConfig.sInfo, 3000 );
-		}
-
-		/* Add a message at the top of the page */
-		if ( oConfig.sMessage )
-		{
-			$('<div/>')
-				.addClass( this.classes.print.message )
-				.html( oConfig.sMessage )
-				.prependTo( 'body' );
-		}
-
-		/* Cache the scrolling and the jump to the top of the page */
-		this.s.print.saveScroll = $(window).scrollTop();
-		window.scrollTo( 0, 0 );
-
-		/* Bind a key event listener to the document for the escape key -
-		 * it is removed in the callback
-		 */
-		$(document).bind( "keydown.DTTT", function(e) {
-			/* Only interested in the escape key */
-			if ( e.keyCode == 27 )
-			{
-				e.preventDefault();
-				that._fnPrintEnd.call( that, e );
-			}
-		} );
-	},
-
-
-	/**
-	 * Printing is finished, resume normal display
-	 *  @method  _fnPrintEnd
-	 *  @param   {Event} e Event object
-	 *  @returns void
-	 *  @private 
-	 */
-	"_fnPrintEnd": function ( e )
-	{
-		var that = this;
-		var oSetDT = this.s.dt;
-		var oSetPrint = this.s.print;
-		var oDomPrint = this.dom.print;
-
-		/* Show all hidden nodes */
-		this._fnPrintShowNodes();
-
-		/* Restore DataTables' scrolling */
-		if ( oSetDT.oScroll.sX !== "" || oSetDT.oScroll.sY !== "" )
-		{
-			$(this.s.dt.nTable).unbind('draw.DTTT_Print');
-
-			this._fnPrintScrollEnd();
-		}
-
-		/* Restore the scroll */
-		window.scrollTo( 0, oSetPrint.saveScroll );
-
-		/* Drop the print message */
-		$('div.'+this.classes.print.message).remove();
-
-		/* Styling class */
-		$(document.body).removeClass( 'DTTT_Print' );
-
-		/* Restore the table length */
-		oSetDT._iDisplayStart = oSetPrint.saveStart;
-		oSetDT._iDisplayLength = oSetPrint.saveLength;
-		if ( oSetDT.oApi._fnCalculateEnd ) {
-			oSetDT.oApi._fnCalculateEnd( oSetDT );
-		}
-		oSetDT.oApi._fnDraw( oSetDT );
-
-		$(document).unbind( "keydown.DTTT" );
-	},
-
-
-	/**
-	 * Take account of scrolling in DataTables by showing the full table
-	 *  @returns void
-	 *  @private 
-	 */
-	"_fnPrintScrollStart": function ()
-	{
-		var
-			oSetDT = this.s.dt,
-			nScrollHeadInner = oSetDT.nScrollHead.getElementsByTagName('div')[0],
-			nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0],
-			nScrollBody = oSetDT.nTable.parentNode,
-			nTheadSize, nTfootSize;
-
-		/* Copy the header in the thead in the body table, this way we show one single table when
-		 * in print view. Note that this section of code is more or less verbatim from DT 1.7.0
-		 */
-		nTheadSize = oSetDT.nTable.getElementsByTagName('thead');
-		if ( nTheadSize.length > 0 )
-		{
-			oSetDT.nTable.removeChild( nTheadSize[0] );
-		}
-
-		if ( oSetDT.nTFoot !== null )
-		{
-			nTfootSize = oSetDT.nTable.getElementsByTagName('tfoot');
-			if ( nTfootSize.length > 0 )
-			{
-				oSetDT.nTable.removeChild( nTfootSize[0] );
-			}
-		}
-
-		nTheadSize = oSetDT.nTHead.cloneNode(true);
-		oSetDT.nTable.insertBefore( nTheadSize, oSetDT.nTable.childNodes[0] );
-
-		if ( oSetDT.nTFoot !== null )
-		{
-			nTfootSize = oSetDT.nTFoot.cloneNode(true);
-			oSetDT.nTable.insertBefore( nTfootSize, oSetDT.nTable.childNodes[1] );
-		}
-
-		/* Now adjust the table's viewport so we can actually see it */
-		if ( oSetDT.oScroll.sX !== "" )
-		{
-			oSetDT.nTable.style.width = $(oSetDT.nTable).outerWidth()+"px";
-			nScrollBody.style.width = $(oSetDT.nTable).outerWidth()+"px";
-			nScrollBody.style.overflow = "visible";
-		}
-
-		if ( oSetDT.oScroll.sY !== "" )
-		{
-			nScrollBody.style.height = $(oSetDT.nTable).outerHeight()+"px";
-			nScrollBody.style.overflow = "visible";
-		}
-	},
-
-
-	/**
-	 * Take account of scrolling in DataTables by showing the full table. Note that the redraw of
-	 * the DataTable that we do will actually deal with the majority of the hard work here
-	 *  @returns void
-	 *  @private 
-	 */
-	"_fnPrintScrollEnd": function ()
-	{
-		var
-			oSetDT = this.s.dt,
-			nScrollBody = oSetDT.nTable.parentNode;
-
-		if ( oSetDT.oScroll.sX !== "" )
-		{
-			nScrollBody.style.width = oSetDT.oApi._fnStringToCss( oSetDT.oScroll.sX );
-			nScrollBody.style.overflow = "auto";
-		}
-
-		if ( oSetDT.oScroll.sY !== "" )
-		{
-			nScrollBody.style.height = oSetDT.oApi._fnStringToCss( oSetDT.oScroll.sY );
-			nScrollBody.style.overflow = "auto";
-		}
-	},
-
-
-	/**
-	 * Resume the display of all TableTools hidden nodes
-	 *  @method  _fnPrintShowNodes
-	 *  @returns void
-	 *  @private 
-	 */
-	"_fnPrintShowNodes": function ( )
-	{
-	  var anHidden = this.dom.print.hidden;
-
-		for ( var i=0, iLen=anHidden.length ; i<iLen ; i++ )
-		{
-			anHidden[i].node.style.display = anHidden[i].display;
-		}
-		anHidden.splice( 0, anHidden.length );
-	},
-
-
-	/**
-	 * Hide nodes which are not needed in order to display the table. Note that this function is
-	 * recursive
-	 *  @method  _fnPrintHideNodes
-	 *  @param   {Node} nNode Element which should be showing in a 'print' display
-	 *  @returns void
-	 *  @private 
-	 */
-	"_fnPrintHideNodes": function ( nNode )
-	{
-		var anHidden = this.dom.print.hidden;
-
-		var nParent = nNode.parentNode;
-		var nChildren = nParent.childNodes;
-		for ( var i=0, iLen=nChildren.length ; i<iLen ; i++ )
-		{
-			if ( nChildren[i] != nNode && nChildren[i].nodeType == 1 )
-			{
-				/* If our node is shown (don't want to show nodes which were previously hidden) */
-				var sDisplay = $(nChildren[i]).css("display");
-				if ( sDisplay != "none" )
-				{
-					/* Cache the node and it's previous state so we can restore it */
-					anHidden.push( {
-						"node": nChildren[i],
-						"display": sDisplay
-					} );
-					nChildren[i].style.display = "none";
-				}
-			}
-		}
-
-		if ( nParent.nodeName.toUpperCase() != "BODY" )
-		{
-			this._fnPrintHideNodes( nParent );
-		}
-	}
-};
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Static variables
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/**
- * Store of all instances that have been created of TableTools, so one can look up other (when
- * there is need of a master)
- *  @property _aInstances
- *  @type	 Array
- *  @default  []
- *  @private
- */
-TableTools._aInstances = [];
-
-
-/**
- * Store of all listeners and their callback functions
- *  @property _aListeners
- *  @type	 Array
- *  @default  []
- */
-TableTools._aListeners = [];
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Static methods
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/**
- * Get an array of all the master instances
- *  @method  fnGetMasters
- *  @returns {Array} List of master TableTools instances
- *  @static
- */
-TableTools.fnGetMasters = function ()
-{
-	var a = [];
-	for ( var i=0, iLen=TableTools._aInstances.length ; i<iLen ; i++ )
-	{
-		if ( TableTools._aInstances[i].s.master )
-		{
-			a.push( TableTools._aInstances[i] );
-		}
-	}
-	return a;
-};
-
-/**
- * Get the master instance for a table node (or id if a string is given)
- *  @method  fnGetInstance
- *  @returns {Object} ID of table OR table node, for which we want the TableTools instance
- *  @static
- */
-TableTools.fnGetInstance = function ( node )
-{
-	if ( typeof node != 'object' )
-	{
-		node = document.getElementById(node);
-	}
-
-	for ( var i=0, iLen=TableTools._aInstances.length ; i<iLen ; i++ )
-	{
-		if ( TableTools._aInstances[i].s.master && TableTools._aInstances[i].dom.table == node )
-		{
-			return TableTools._aInstances[i];
-		}
-	}
-	return null;
-};
-
-
-/**
- * Add a listener for a specific event
- *  @method  _fnEventListen
- *  @param   {Object} that Scope of the listening function (i.e. 'this' in the caller)
- *  @param   {String} type Event type
- *  @param   {Function} fn Function
- *  @returns void
- *  @private
- *  @static
- */
-TableTools._fnEventListen = function ( that, type, fn )
-{
-	TableTools._aListeners.push( {
-		"that": that,
-		"type": type,
-		"fn": fn
-	} );
-};
-
-
-/**
- * An event has occurred - look up every listener and fire it off. We check that the event we are
- * going to fire is attached to the same table (using the table node as reference) before firing
- *  @method  _fnEventDispatch
- *  @param   {Object} that Scope of the listening function (i.e. 'this' in the caller)
- *  @param   {String} type Event type
- *  @param   {Node} node Element that the event occurred on (may be null)
- *  @param   {boolean} [selected] Indicate if the node was selected (true) or deselected (false)
- *  @returns void
- *  @private
- *  @static
- */
-TableTools._fnEventDispatch = function ( that, type, node, selected )
-{
-	var listeners = TableTools._aListeners;
-	for ( var i=0, iLen=listeners.length ; i<iLen ; i++ )
-	{
-		if ( that.dom.table == listeners[i].that.dom.table && listeners[i].type == type )
-		{
-			listeners[i].fn( node, selected );
-		}
-	}
-};
-
-
-
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Constants
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-
-
-TableTools.buttonBase = {
-	// Button base
-	"sAction": "text",
-	"sTag": "default",
-	"sLinerTag": "default",
-	"sButtonClass": "DTTT_button_text",
-	"sButtonText": "Button text",
-	"sTitle": "",
-	"sToolTip": "",
-
-	// Common button specific options
-	"sCharSet": "utf8",
-	"bBomInc": false,
-	"sFileName": "*.csv",
-	"sFieldBoundary": "",
-	"sFieldSeperator": "\t",
-	"sNewLine": "auto",
-	"mColumns": "all", /* "all", "visible", "hidden" or array of column integers */
-	"bHeader": true,
-	"bFooter": true,
-	"bOpenRows": false,
-	"bSelectedOnly": false,
-	"oSelectorOpts": undefined, // See http://datatables.net/docs/DataTables/1.9.4/#$ for full options
-
-	// Callbacks
-	"fnMouseover": null,
-	"fnMouseout": null,
-	"fnClick": null,
-	"fnSelect": null,
-	"fnComplete": null,
-	"fnInit": null,
-	"fnCellRender": null
-};
-
-
-/**
- * @namespace Default button configurations
- */
-TableTools.BUTTONS = {
-	"csv": $.extend( {}, TableTools.buttonBase, {
-		"sAction": "flash_save",
-		"sButtonClass": "DTTT_button_csv",
-		"sButtonText": "CSV",
-		"sFieldBoundary": '"',
-		"sFieldSeperator": ",",
-		"fnClick": function( nButton, oConfig, flash ) {
-			this.fnSetText( flash, this.fnGetTableData(oConfig) );
-		}
-	} ),
-
-	"xls": $.extend( {}, TableTools.buttonBase, {
-		"sAction": "flash_save",
-		"sCharSet": "utf16le",
-		"bBomInc": true,
-		"sButtonClass": "DTTT_button_xls",
-		"sButtonText": "Excel",
-		"fnClick": function( nButton, oConfig, flash ) {
-			this.fnSetText( flash, this.fnGetTableData(oConfig) );
-		}
-	} ),
-
-	"copy": $.extend( {}, TableTools.buttonBase, {
-		"sAction": "flash_copy",
-		"sButtonClass": "DTTT_button_copy",
-		"sButtonText": "Copy",
-		"fnClick": function( nButton, oConfig, flash ) {
-			this.fnSetText( flash, this.fnGetTableData(oConfig) );
-		},
-		"fnComplete": function(nButton, oConfig, flash, text) {
-			var
-				lines = text.split('\n').length,
-				len = this.s.dt.nTFoot === null ? lines-1 : lines-2,
-				plural = (len==1) ? "" : "s";
-			this.fnInfo( '<h6>Table copied</h6>'+
-				'<p>Copied '+len+' row'+plural+' to the clipboard.</p>',
-				1500
-			);
-		}
-	} ),
-
-	"pdf": $.extend( {}, TableTools.buttonBase, {
-		"sAction": "flash_pdf",
-		"sNewLine": "\n",
-		"sFileName": "*.pdf",
-		"sButtonClass": "DTTT_button_pdf",
-		"sButtonText": "PDF",
-		"sPdfOrientation": "portrait",
-		"sPdfSize": "A4",
-		"sPdfMessage": "",
-		"fnClick": function( nButton, oConfig, flash ) {
-			this.fnSetText( flash,
-				"title:"+ this.fnGetTitle(oConfig) +"\n"+
-				"message:"+ oConfig.sPdfMessage +"\n"+
-				"colWidth:"+ this.fnCalcColRatios(oConfig) +"\n"+
-				"orientation:"+ oConfig.sPdfOrientation +"\n"+
-				"size:"+ oConfig.sPdfSize +"\n"+
-				"--/TableToolsOpts--\n" +
-				this.fnGetTableData(oConfig)
-			);
-		}
-	} ),
-
-	"print": $.extend( {}, TableTools.buttonBase, {
-		"sInfo": "<h6>Print view</h6><p>Please use your browser's print function to "+
-		  "print this table. Press escape when finished.</p>",
-		"sMessage": null,
-		"bShowAll": true,
-		"sToolTip": "View print view",
-		"sButtonClass": "DTTT_button_print",
-		"sButtonText": "Print",
-		"fnClick": function ( nButton, oConfig ) {
-			this.fnPrint( true, oConfig );
-		}
-	} ),
-
-	"text": $.extend( {}, TableTools.buttonBase ),
-
-	"select": $.extend( {}, TableTools.buttonBase, {
-		"sButtonText": "Select button",
-		"fnSelect": function( nButton, oConfig ) {
-			if ( this.fnGetSelected().length !== 0 ) {
-				$(nButton).removeClass( this.classes.buttons.disabled );
-			} else {
-				$(nButton).addClass( this.classes.buttons.disabled );
-			}
-		},
-		"fnInit": function( nButton, oConfig ) {
-			$(nButton).addClass( this.classes.buttons.disabled );
-		}
-	} ),
-
-	"select_single": $.extend( {}, TableTools.buttonBase, {
-		"sButtonText": "Select button",
-		"fnSelect": function( nButton, oConfig ) {
-			var iSelected = this.fnGetSelected().length;
-			if ( iSelected == 1 ) {
-				$(nButton).removeClass( this.classes.buttons.disabled );
-			} else {
-				$(nButton).addClass( this.classes.buttons.disabled );
-			}
-		},
-		"fnInit": function( nButton, oConfig ) {
-			$(nButton).addClass( this.classes.buttons.disabled );
-		}
-	} ),
-
-	"select_all": $.extend( {}, TableTools.buttonBase, {
-		"sButtonText": "Select all",
-		"fnClick": function( nButton, oConfig ) {
-			this.fnSelectAll();
-		},
-		"fnSelect": function( nButton, oConfig ) {
-			if ( this.fnGetSelected().length == this.s.dt.fnRecordsDisplay() ) {
-				$(nButton).addClass( this.classes.buttons.disabled );
-			} else {
-				$(nButton).removeClass( this.classes.buttons.disabled );
-			}
-		}
-	} ),
-
-	"select_none": $.extend( {}, TableTools.buttonBase, {
-		"sButtonText": "Deselect all",
-		"fnClick": function( nButton, oConfig ) {
-			this.fnSelectNone();
-		},
-		"fnSelect": function( nButton, oConfig ) {
-			if ( this.fnGetSelected().length !== 0 ) {
-				$(nButton).removeClass( this.classes.buttons.disabled );
-			} else {
-				$(nButton).addClass( this.classes.buttons.disabled );
-			}
-		},
-		"fnInit": function( nButton, oConfig ) {
-			$(nButton).addClass( this.classes.buttons.disabled );
-		}
-	} ),
-
-	"ajax": $.extend( {}, TableTools.buttonBase, {
-		"sAjaxUrl": "/xhr.php",
-		"sButtonText": "Ajax button",
-		"fnClick": function( nButton, oConfig ) {
-			var sData = this.fnGetTableData(oConfig);
-			$.ajax( {
-				"url": oConfig.sAjaxUrl,
-				"data": [
-					{ "name": "tableData", "value": sData }
-				],
-				"success": oConfig.fnAjaxComplete,
-				"dataType": "json",
-				"type": "POST",
-				"cache": false,
-				"error": function () {
-					alert( "Error detected when sending table data to server" );
-				}
-			} );
-		},
-		"fnAjaxComplete": function( json ) {
-			alert( 'Ajax complete' );
-		}
-	} ),
-
-	"div": $.extend( {}, TableTools.buttonBase, {
-		"sAction": "div",
-		"sTag": "div",
-		"sButtonClass": "DTTT_nonbutton",
-		"sButtonText": "Text button"
-	} ),
-
-	"collection": $.extend( {}, TableTools.buttonBase, {
-		"sAction": "collection",
-		"sButtonClass": "DTTT_button_collection",
-		"sButtonText": "Collection",
-		"fnClick": function( nButton, oConfig ) {
-			this._fnCollectionShow(nButton, oConfig);
-		}
-	} )
-};
-/*
- *  on* callback parameters:
- *     1. node - button element
- *     2. object - configuration object for this button
- *     3. object - ZeroClipboard reference (flash button only)
- *     4. string - Returned string from Flash (flash button only - and only on 'complete')
- */
-
-// Alias to match the other plug-ins styling
-TableTools.buttons = TableTools.BUTTONS;
-
-
-/**
- * @namespace Classes used by TableTools - allows the styles to be override easily.
- *   Note that when TableTools initialises it will take a copy of the classes object
- *   and will use its internal copy for the remainder of its run time.
- */
-TableTools.classes = {
-	"container": "DTTT_container",
-	"buttons": {
-		"normal": "DTTT_button",
-		"disabled": "DTTT_disabled"
-	},
-	"collection": {
-		"container": "DTTT_collection",
-		"background": "DTTT_collection_background",
-		"buttons": {
-			"normal": "DTTT_button",
-			"disabled": "DTTT_disabled"
-		}
-	},
-	"select": {
-		"table": "DTTT_selectable",
-		"row": "DTTT_selected selected"
-	},
-	"print": {
-		"body": "DTTT_Print",
-		"info": "DTTT_print_info",
-		"message": "DTTT_PrintMessage"
-	}
-};
-
-
-/**
- * @namespace ThemeRoller classes - built in for compatibility with DataTables' 
- *   bJQueryUI option.
- */
-TableTools.classes_themeroller = {
-	"container": "DTTT_container ui-buttonset ui-buttonset-multi",
-	"buttons": {
-		"normal": "DTTT_button ui-button ui-state-default"
-	},
-	"collection": {
-		"container": "DTTT_collection ui-buttonset ui-buttonset-multi"
-	}
-};
-
-
-/**
- * @namespace TableTools default settings for initialisation
- */
-TableTools.DEFAULTS = {
-	"sSwfPath":        "../swf/copy_csv_xls_pdf.swf",
-	"sRowSelect":      "none",
-	"sRowSelector":    "tr",
-	"sSelectedClass":  null,
-	"fnPreRowSelect":  null,
-	"fnRowSelected":   null,
-	"fnRowDeselected": null,
-	"aButtons":        [ "copy", "csv", "xls", "pdf", "print" ],
-	"oTags": {
-		"container": "div",
-		"button": "a", // We really want to use buttons here, but Firefox and IE ignore the
-		                 // click on the Flash element in the button (but not mouse[in|out]).
-		"liner": "span",
-		"collection": {
-			"container": "div",
-			"button": "a",
-			"liner": "span"
-		}
-	}
-};
-
-// Alias to match the other plug-ins
-TableTools.defaults = TableTools.DEFAULTS;
-
-
-/**
- * Name of this class
- *  @constant CLASS
- *  @type	 String
- *  @default  TableTools
- */
-TableTools.prototype.CLASS = "TableTools";
-
-
-/**
- * TableTools version
- *  @constant  VERSION
- *  @type	  String
- *  @default   See code
- */
-TableTools.version = "2.2.1";
-
-
-
-// DataTables 1.10 API
-// 
-// This will be extended in a big way in in TableTools 3 to provide API methods
-// such as rows().select() and rows.selected() etc, but for the moment the
-// tabletools() method simply returns the instance.
-
-if ( $.fn.dataTable.Api ) {
-	$.fn.dataTable.Api.register( 'tabletools()', function () {
-		var tt = null;
-
-		if ( this.context.length > 0 ) {
-			tt = TableTools.fnGetInstance( this.context[0].nTable );
-		}
-
-		return tt;
-	} );
-}
-
-
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
- * Initialisation
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
-
-/*
- * Register a new feature with DataTables
- */
-if ( typeof $.fn.dataTable == "function" &&
-	 typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
-	 $.fn.dataTableExt.fnVersionCheck('1.9.0') )
-{
-	$.fn.dataTableExt.aoFeatures.push( {
-		"fnInit": function( oDTSettings ) {
-			var init = oDTSettings.oInit;
-			var opts = init ?
-				init.tableTools || init.oTableTools || {} :
-				{};
-
-			var oTT = new TableTools( oDTSettings.oInstance, opts );
-			TableTools._aInstances.push( oTT );
-
-			return oTT.dom.container;
-		},
-		"cFeature": "T",
-		"sFeature": "TableTools"
-	} );
-}
-else
-{
-	alert( "Warning: TableTools requires DataTables 1.9.0 or newer - www.datatables.net/download");
-}
-
-$.fn.DataTable.TableTools = TableTools;
-
-})(jQuery, window, document);
-
-/*
- * Register a new feature with DataTables
- */
-if ( typeof $.fn.dataTable == "function" &&
-	 typeof $.fn.dataTableExt.fnVersionCheck == "function" &&
-	 $.fn.dataTableExt.fnVersionCheck('1.9.0') )
-{
-	$.fn.dataTableExt.aoFeatures.push( {
-		"fnInit": function( oDTSettings ) {
-			var oOpts = typeof oDTSettings.oInit.oTableTools != 'undefined' ?
-				oDTSettings.oInit.oTableTools : {};
-
-			var oTT = new TableTools( oDTSettings.oInstance, oOpts );
-			TableTools._aInstances.push( oTT );
-
-			return oTT.dom.container;
-		},
-		"cFeature": "T",
-		"sFeature": "TableTools"
-	} );
-}
-else
-{
-	alert( "Warning: TableTools 2 requires DataTables 1.9.0 or newer - www.datatables.net/download");
-}
-
-
-$.fn.dataTable.TableTools = TableTools;
-$.fn.DataTable.TableTools = TableTools;
-
-
-return TableTools;
-}; // /factory
-
-
-// Define as an AMD module if possible
-if ( typeof define === 'function' && define.amd ) {
-	define( 'datatables-tabletools', ['jquery', 'datatables'], factory );
-}
-else if ( jQuery && !jQuery.fn.dataTable.TableTools ) {
-	// Otherwise simply initialise as normal, stopping multiple evaluation
-	factory( jQuery, jQuery.fn.dataTable );
-}
-
-
-})(window, document);
-


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/server/edit/FormEditServerController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/server/edit/FormEditServerController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/server/edit/FormEditServerController.js
deleted file mode 100644
index a7fbc08..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/server/edit/FormEditServerController.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditServerController = function(server, $scope, $controller, $uibModal, $anchorScroll, locationUtils, serverService) {
-
-    // extends the FormServerController to inherit common methods
-    angular.extend(this, $controller('FormServerController', { server: server, $scope: $scope }));
-
-    var deleteServer = function(server) {
-        serverService.deleteServer(server.id)
-            .then(function() {
-                locationUtils.navigateToPath('/configure/servers');
-            });
-    };
-
-    $scope.serverName = angular.copy(server.hostName);
-
-    $scope.settings = {
-        isNew: false,
-        saveLabel: 'Update'
-    };
-
-    $scope.save = function(server) {
-        serverService.updateServer(server).
-            then(function() {
-                $scope.serverName = angular.copy(server.hostName);
-                $anchorScroll(); // scrolls window to top
-            });
-    };
-
-    $scope.confirmDelete = function(server) {
-        var params = {
-            title: 'Delete Server: ' + server.hostName,
-            key: server.hostName
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-            controller: 'DialogDeleteController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                }
-            }
-        });
-        modalInstance.result.then(function() {
-            deleteServer(server);
-        }, function () {
-            // do nothing
-        });
-    };
-
-};
-
-FormEditServerController.$inject = ['server', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'serverService'];
-module.exports = FormEditServerController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/server/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/server/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/server/edit/index.js
deleted file mode 100644
index aff7a84..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/server/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.server.edit', [])
-    .controller('FormEditServerController', require('./FormEditServerController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/server/form.server.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/server/form.server.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/server/form.server.tpl.html
deleted file mode 100644
index 2bc9dd2..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/server/form.server.tpl.html
+++ /dev/null
@@ -1,336 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/servers')">Servers</a></li>
-            <li class="active">{{serverName}}</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <button class="btn btn-primary" ng-click="confirmStatusUpdate()">Update Status</button>
-            <!--<button class="btn btn-success" ng-click="onlineServer()">Online Server</button>-->
-            <button class="btn btn-primary" title="Queue Server Updates" ng-show="!server.updPending" ng-click="queueServerUpdates(server)"><i class="fa fa-flag"></i></button>
-            <button class="btn btn-primary" title="Clear Server Updates" ng-show="server.updPending" ng-click="clearServerUpdates(server)"><i class="fa fa-ban"></i></button>
-            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
-                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    More&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li ng-show="!server.updPending"><a ng-click="queueServerUpdates(server)">Queue Server Updates</a></li>
-                    <li ng-show="server.updPending"><a ng-click="clearServerUpdates(server)">Clear Server Updates</a></li>
-                    <li class="divider"></li>
-                    <li><a ng-click="confirmStatusUpdate()">Update Status</a></li>
-                    <li class="divider"></li>
-                    <li><a ng-click="viewDeliveryServices()">View Delivery Services</a></li>
-                    <li><a ng-click="viewConfig()">View Config Files</a></li>
-                </ul>
-            </div>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="serverForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.status), 'has-feedback': hasError(serverForm.status)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Status *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="status" name="status" class="form-control" ng-model="server.statusId" ng-options="status.id as status.name for status in statuses" ng-disabled="true"></select>
-                </div>
-            </div>
-            <div class="form-group" ng-show="server.offlineReason.length > 0">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Offline Reason</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="offlineReason" name="offlineReason" type="text" class="form-control" ng-model="server.offlineReason" ng-maxlength="256" ng-readonly="true">
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.updPending), 'has-feedback': hasError(serverForm.updPending)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Update Pending *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="updPending" name="updPending" type="text" class="form-control" ng-model="server.updPending" ng-disabled="true">
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.hostName), 'has-feedback': hasError(serverForm.hostName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Hostname *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="hostName" name="hostName" type="text" class="form-control" ng-model="server.hostName" ng-required="true" ng-maxlength="45" ng-pattern="/^\S*$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.hostName, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.hostName, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.hostName, 'pattern')">No Spaces</small>
-                    <span ng-show="hasError(serverForm.hostName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.domainName), 'has-feedback': hasError(serverForm.domainName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Domain name *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="domainName" name="domainName" type="text" class="form-control" ng-model="server.domainName" ng-required="true" ng-maxlength="45" ng-pattern="/^\S*$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.domainName, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.domainName, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.domainName, 'pattern')">No Spaces</small>
-                    <span ng-show="hasError(serverForm.domainName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.tcpPort), 'has-feedback': hasError(serverForm.tcpPort)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">TCP Port</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="tcpPort" name="tcpPort" type="text" class="form-control" ng-model="server.tcpPort" ng-maxlength="10" ng-pattern="/^\d+$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.tcpPort, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.tcpPort, 'pattern')">Number</small>
-                    <span ng-show="hasError(serverForm.tcpPort)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.xmppId), 'has-feedback': hasError(serverForm.xmppId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">XMPP ID</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="xmppId" name="xmppId" type="text" class="form-control" ng-model="server.xmppId" ng-maxlength="256" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.xmppId, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(serverForm.xmppId)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.xmppPasswd), 'has-feedback': hasError(serverForm.xmppPasswd)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">XMPP Password</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="xmppPasswd" name="xmppPasswd" type="text" class="form-control" ng-model="server.xmppPasswd" ng-maxlength="45" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.xmppPasswd, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(serverForm.xmppPasswd)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.interfaceName), 'has-feedback': hasError(serverForm.interfaceName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Interface Name *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="interfaceName" name="interfaceName" type="text" class="form-control" ng-model="server.interfaceName" ng-required="true" ng-maxlength="45" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.interfaceName, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.interfaceName, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(serverForm.interfaceName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.ipAddress), 'has-feedback': hasError(serverForm.ipAddress)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">IP Address *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="ipAddress" name="ipAddress" type="text" class="form-control" ng-model="server.ipAddress" ng-required="true" ng-maxlength="45" ng-pattern="ipRegex()" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipAddress, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipAddress, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipAddress, 'pattern')">Invalid</small>
-                    <span ng-show="hasError(serverForm.ipAddress)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.ipNetmask), 'has-feedback': hasError(serverForm.ipNetmask)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">IP Netmask *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="ipNetmask" name="ipNetmask" type="text" class="form-control" ng-model="server.ipNetmask" ng-required="true" ng-maxlength="45" ng-pattern="validations.ipRegex" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipNetmask, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipNetmask, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipNetmask, 'pattern')">Invalid</small>
-                    <span ng-show="hasError(serverForm.ipNetmask)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.ipGateway), 'has-feedback': hasError(serverForm.ipGateway)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">IP Gateway *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="ipGateway" name="ipGateway" type="text" class="form-control" ng-model="server.ipGateway" ng-required="true" ng-maxlength="45" ng-pattern="ipRegex()" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipGateway, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipGateway, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.ipGateway, 'pattern')">Invalid</small>
-                    <span ng-show="hasError(serverForm.ipGateway)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.ip6Address), 'has-feedback': hasError(serverForm.ip6Address)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">IPv6 Address</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="ip6Address" name="ip6Address" type="text" class="form-control" ng-model="server.ip6Address" ng-maxlength="50" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.ip6Address, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(serverForm.ip6Address)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.ip6Gateway), 'has-feedback': hasError(serverForm.ip6Gateway)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">IPv6 Gateway</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="ip6Gateway" name="ip6Gateway" type="text" class="form-control" ng-model="server.ip6Gateway" ng-maxlength="50" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.ip6Gateway, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(serverForm.ip6Gateway)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.interfaceMtu), 'has-feedback': hasError(serverForm.interfaceMtu)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Interface MTU *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="interfaceMtu" name="interfaceMtu" type="text" class="form-control" ng-model="server.interfaceMtu" ng-required="true" ng-maxlength="11" ng-pattern="/(^1500$|^9000$)/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.interfaceMtu, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.interfaceMtu, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.interfaceMtu, 'pattern')">1500 or 9000</small>
-                    <span ng-show="hasError(serverForm.interfaceMtu)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.rack), 'has-feedback': hasError(serverForm.rack)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Rack</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="rack" name="rack" type="text" class="form-control" ng-model="server.rack" ng-maxlength="64" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.rack, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(serverForm.rack)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.mgmtIpAddress), 'has-feedback': hasError(serverForm.mgmtIpAddress)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Management IP Address</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="mgmtIpAddress" name="mgmtIpAddress" type="text" class="form-control" ng-model="server.mgmtIpAddress" ng-maxlength="50" ng-pattern="ipRegex()" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.mgmtIpAddress, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.mgmtIpAddress, 'pattern')">Invalid</small>
-                    <span ng-show="hasError(serverForm.mgmtIpAddress)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.mgmtIpNetmask), 'has-feedback': hasError(serverForm.mgmtIpNetmask)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Management IP Netmask</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="mgmtIpNetmask" name="mgmtIpNetmask" type="text" class="form-control" ng-model="server.mgmtIpNetmask" ng-maxlength="45" ng-pattern="ipRegex()" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.mgmtIpNetmask, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.mgmtIpNetmask, 'pattern')">Invalid</small>
-                    <span ng-show="hasError(serverForm.mgmtIpNetmask)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.mgmtIpGateway), 'has-feedback': hasError(serverForm.mgmtIpGateway)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Management IP Gateway</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="mgmtIpGateway" name="mgmtIpGateway" type="text" class="form-control" ng-model="server.mgmtIpGateway" ng-maxlength="45" ng-pattern="ipRegex()" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.mgmtIpGateway, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.mgmtIpGateway, 'pattern')">Invalid</small>
-                    <span ng-show="hasError(serverForm.mgmtIpGateway)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.iloIpAddress), 'has-feedback': hasError(serverForm.iloIpAddress)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">ILO IP Address</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="iloIpAddress" name="iloIpAddress" type="text" class="form-control" ng-model="server.iloIpAddress" ng-maxlength="45" ng-pattern="ipRegex()" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloIpAddress, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloIpAddress, 'pattern')">Invalid</small>
-                    <span ng-show="hasError(serverForm.iloIpAddress)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.iloIpNetmask), 'has-feedback': hasError(serverForm.iloIpNetmask)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">ILO IP Netmask</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="iloIpNetmask" name="iloIpNetmask" type="text" class="form-control" ng-model="server.iloIpNetmask" ng-maxlength="45" ng-pattern="ipRegex()" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloIpNetmask, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloIpNetmask, 'pattern')">Invalid</small>
-                    <span ng-show="hasError(serverForm.iloIpNetmask)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.iloIpGateway), 'has-feedback': hasError(serverForm.iloIpGateway)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">ILO IP Gateway</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="iloIpGateway" name="iloIpGateway" type="text" class="form-control" ng-model="server.iloIpGateway" ng-maxlength="45" ng-pattern="ipRegex()" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloIpGateway, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloIpGateway, 'pattern')">Invalid</small>
-                    <span ng-show="hasError(serverForm.iloIpGateway)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.iloUsername), 'has-feedback': hasError(serverForm.iloUsername)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">ILO Username</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="iloUsername" name="iloUsername" type="text" class="form-control" ng-model="server.iloUsername" ng-maxlength="45" ng-pattern="/^\S*$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloUsername, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloUsername, 'pattern')">No Spaces</small>
-                    <span ng-show="hasError(serverForm.iloUsername)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.iloPassword), 'has-feedback': hasError(serverForm.iloPassword)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">ILO Password</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="iloPassword" name="iloPassword" type="text" class="form-control" ng-model="server.iloPassword" ng-maxlength="45" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.iloPassword, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(serverForm.iloPassword)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.routerHostName), 'has-feedback': hasError(serverForm.routerHostName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Router Hostname</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="routerHostName" name="routerHostName" type="text" class="form-control" ng-model="server.routerHostName" ng-maxlength="256" ng-pattern="/^\S*$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.routerHostName, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.routerHostName, 'pattern')">No Spaces</small>
-                    <span ng-show="hasError(serverForm.routerHostName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.routerPortName), 'has-feedback': hasError(serverForm.routerPortName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Router Port Name</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="routerPortName" name="routerPortName" type="text" class="form-control" ng-model="server.routerPortName" ng-maxlength="256" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.routerPortName, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(serverForm.routerPortName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.httpsPort), 'has-feedback': hasError(serverForm.httpsPort)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">HTTPS Port</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="httpsPort" name="httpsPort" type="text" class="form-control" ng-model="server.httpsPort" ng-maxlength="10" ng-pattern="/^\d+$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.httpsPort, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.httpsPort, 'pattern')">Number</small>
-                    <span ng-show="hasError(serverForm.httpsPort)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.cdn), 'has-feedback': hasError(serverForm.cdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="cdn" name="cdn" class="form-control" ng-model="server.cdnId" ng-options="cdn.id as cdn.name for cdn in cdns" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.cdn, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.physLocation), 'has-feedback': hasError(serverForm.physLocation)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Phys Location *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="physLocation" name="physLocation" class="form-control" ng-model="server.physLocationId" ng-options="physLocation.id as physLocation.name for physLocation in physLocations" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.physLocation, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.cachegroup), 'has-feedback': hasError(serverForm.cachegroup)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Cache Group *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="cachegroup" name="cachegroup" class="form-control" ng-model="server.cachegroupId" ng-options="cachegroup.id as cachegroup.name for cachegroup in cacheGroups" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.cachegroup, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.type), 'has-feedback': hasError(serverForm.type)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Type *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="type" name="type" class="form-control" ng-model="server.typeId" ng-options="type.id as type.name for type in types" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.type, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(serverForm.profile), 'has-feedback': hasError(serverForm.profile)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Profile *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="profile" name="profile" class="form-control" ng-model="server.profileId" ng-options="profile.id as profile.name for profile in profiles" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(serverForm.profile, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(server)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="serverForm.$pristine || serverForm.$invalid" ng-click="save(server)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/server/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/server/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/server/index.js
deleted file mode 100644
index 95bea58..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/server/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.server', [])
-    .controller('FormServerController', require('./FormServerController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/server/new/FormNewServerController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/server/new/FormNewServerController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/server/new/FormNewServerController.js
deleted file mode 100644
index 744f588..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/server/new/FormNewServerController.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewServerController = function(server, $scope, $controller, serverService) {
-
-    // extends the FormServerController to inherit common methods
-    angular.extend(this, $controller('FormServerController', { server: server, $scope: $scope }));
-
-    $scope.serverName = 'New';
-
-    $scope.settings = {
-        isNew: true,
-        saveLabel: 'Create'
-    };
-
-    $scope.save = function(server) {
-        serverService.createServer(server);
-    };
-
-};
-
-FormNewServerController.$inject = ['server', '$scope', '$controller', 'serverService'];
-module.exports = FormNewServerController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/server/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/server/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/server/new/index.js
deleted file mode 100644
index ff3487b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/server/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.server.new', [])
-    .controller('FormNewServerController', require('./FormNewServerController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/status/FormStatusController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/status/FormStatusController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/status/FormStatusController.js
deleted file mode 100644
index fd015db..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/status/FormStatusController.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormStatusController = function(status, $scope, $location, formUtils, stringUtils, locationUtils) {
-
-    $scope.status = status;
-
-    $scope.props = [
-        { name: 'name', type: 'text', required: true, maxLength: 45 }
-    ];
-
-    $scope.viewServers = function() {
-        $location.path($location.path() + '/servers');
-    };
-
-    $scope.labelize = stringUtils.labelize;
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-};
-
-FormStatusController.$inject = ['status', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils'];
-module.exports = FormStatusController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/status/edit/FormEditStatusController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/status/edit/FormEditStatusController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/status/edit/FormEditStatusController.js
deleted file mode 100644
index ff940be..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/status/edit/FormEditStatusController.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditStatusController = function(status, $scope, $controller, $uibModal, $anchorScroll, locationUtils, statusService) {
-
-    // extends the FormStatusController to inherit common methods
-    angular.extend(this, $controller('FormStatusController', { status: status, $scope: $scope }));
-
-    var deleteStatus = function(status) {
-        statusService.deleteStatus(status.id)
-            .then(function() {
-                locationUtils.navigateToPath('/admin/statuses');
-            });
-    };
-
-    $scope.statusName = angular.copy(status.name);
-
-    $scope.settings = {
-        isNew: false,
-        saveLabel: 'Update'
-    };
-
-    $scope.save = function(status) {
-        statusService.updateStatus(status).
-            then(function() {
-                $scope.statusName = angular.copy(status.name);
-                $anchorScroll(); // scrolls window to top
-            });
-    };
-
-    $scope.confirmDelete = function(status) {
-        var params = {
-            title: 'Delete Status: ' + status.name,
-            key: status.name
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-            controller: 'DialogDeleteController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                }
-            }
-        });
-        modalInstance.result.then(function() {
-            deleteStatus(status);
-        }, function () {
-            // do nothing
-        });
-    };
-
-};
-
-FormEditStatusController.$inject = ['status', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'statusService'];
-module.exports = FormEditStatusController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/status/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/status/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/status/edit/index.js
deleted file mode 100644
index 55520d3..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/status/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.status.edit', [])
-    .controller('FormEditStatusController', require('./FormEditStatusController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/status/form.status.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/status/form.status.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/status/form.status.tpl.html
deleted file mode 100644
index d8733d7..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/status/form.status.tpl.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/statuses')">Statuses</a></li>
-            <li class="active">{{statusName}}</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <button class="btn btn-primary" title="View Servers" ng-click="viewServers()">View Servers</button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="statusForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(statusForm[prop.name]), 'has-feedback': hasError(statusForm[prop.name])}" ng-repeat="prop in props">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">{{labelize(prop.name)}} <span ng-show="prop.required">*</span></label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="{{prop.name}}" name="{{prop.name}}" type="{{prop.type}}" class="form-control" ng-model="status[prop.name]" ng-readonly="prop.readonly" ng-required="prop.required" ng-maxlength="prop.maxLength" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(statusForm[prop.name], 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(statusForm[prop.name], 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(statusForm[prop.name])" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Description</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <textarea id="description" name="description" rows="3" cols="17" class="form-control" ng-model="status.description" maxlength="256"></textarea>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(status)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="statusForm.$pristine || statusForm.$invalid" ng-click="save(status)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/status/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/status/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/status/index.js
deleted file mode 100644
index 87173fb..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/status/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.status', [])
-    .controller('FormStatusController', require('./FormStatusController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/status/new/FormNewStatusController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/status/new/FormNewStatusController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/status/new/FormNewStatusController.js
deleted file mode 100644
index 9ea4c87..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/status/new/FormNewStatusController.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewStatusController = function(status, $scope, $controller, statusService) {
-
-    // extends the FormStatusController to inherit common methods
-    angular.extend(this, $controller('FormStatusController', { status: status, $scope: $scope }));
-
-    $scope.statusName = 'New';
-
-    $scope.settings = {
-        isNew: true,
-        saveLabel: 'Create'
-    };
-
-    $scope.save = function(status) {
-        statusService.createStatus(status);
-    };
-
-};
-
-FormNewStatusController.$inject = ['status', '$scope', '$controller', 'statusService'];
-module.exports = FormNewStatusController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/status/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/status/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/status/new/index.js
deleted file mode 100644
index f3673fe..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/status/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.status.new', [])
-    .controller('FormNewStatusController', require('./FormNewStatusController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/FormTenantController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/FormTenantController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/FormTenantController.js
deleted file mode 100644
index 4acf374..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/FormTenantController.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormTenantController = function(tenant, $scope, formUtils, locationUtils, tenantService) {
-
-    var getTenants = function() {
-        tenantService.getTenants()
-            .then(function(result) {
-                $scope.tenants = result;
-            });
-    };
-
-    $scope.tenant = tenant;
-
-    $scope.falseTrue = [
-        { value: false, label: 'false' },
-        { value: true, label: 'true' }
-    ];
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-    var init = function () {
-        getTenants();
-    };
-    init();
-
-};
-
-FormTenantController.$inject = ['tenant', '$scope', 'formUtils', 'locationUtils', 'tenantService'];
-module.exports = FormTenantController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/edit/FormEditTenantController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/edit/FormEditTenantController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/edit/FormEditTenantController.js
deleted file mode 100644
index 28c69e2..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/edit/FormEditTenantController.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditTenantController = function(tenant, $scope, $controller, $uibModal, $anchorScroll, locationUtils, tenantService) {
-
-    // extends the FormTenantController to inherit common methods
-    angular.extend(this, $controller('FormTenantController', { tenant: tenant, $scope: $scope }));
-
-    var deleteTenant = function(tenant) {
-        tenantService.deleteTenant(tenant.id)
-            .then(function() {
-                locationUtils.navigateToPath('/admin/tenants');
-            });
-    };
-
-    $scope.tenantName = angular.copy(tenant.name);
-
-    $scope.settings = {
-        isNew: false,
-        saveLabel: 'Update'
-    };
-
-    $scope.save = function(tenant) {
-        tenantService.updateTenant(tenant).
-            then(function() {
-                $scope.tenantName = angular.copy(tenant.name);
-                $anchorScroll(); // scrolls window to top
-            });
-    };
-
-    $scope.confirmDelete = function(tenant) {
-        var params = {
-            title: 'Delete Tenant: ' + tenant.name,
-            key: tenant.name
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-            controller: 'DialogDeleteController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                }
-            }
-        });
-        modalInstance.result.then(function() {
-            deleteTenant(tenant);
-        }, function () {
-            // do nothing
-        });
-    };
-
-};
-
-FormEditTenantController.$inject = ['tenant', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'tenantService'];
-module.exports = FormEditTenantController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/edit/index.js
deleted file mode 100644
index 63484fd..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.tenant.edit', [])
-    .controller('FormEditTenantController', require('./FormEditTenantController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/form.tenant.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/form.tenant.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/form.tenant.tpl.html
deleted file mode 100644
index 8567a86..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/form.tenant.tpl.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb">
-            <li><a ng-click="navigateToPath('/admin/tenants')">Tenants</a></li>
-            <li class="active">{{tenantName}}</li>
-        </ol>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="tenantForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(tenantForm.name), 'has-feedback': hasError(tenantForm.name)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Name *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="name" name="name" type="text" class="form-control" ng-model="tenant.name" ng-required="true" ng-maxlength="45" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(tenantForm.name, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(tenantForm.name, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(tenantForm.name)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(tenantForm.active), 'has-feedback': hasError(tenantForm.active)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Active *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="active" name="active" class="form-control" ng-model="tenant.active" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(tenantForm.active, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(tenantForm.parentId), 'has-feedback': hasError(tenantForm.parentId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Parent Tenant *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="parentId" name="parentId" class="form-control" ng-model="tenant.parentId" ng-options="tenant.id as tenant.name for tenant in tenants" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(tenantForm.parentId, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(tenant)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="tenantForm.$pristine || tenantForm.$invalid" ng-click="save(tenant)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/index.js
deleted file mode 100644
index 7b76c87..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.tenant', [])
-    .controller('FormTenantController', require('./FormTenantController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/new/FormNewTenantController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/new/FormNewTenantController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/new/FormNewTenantController.js
deleted file mode 100644
index b1aab29..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/new/FormNewTenantController.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewTenantController = function(tenant, $scope, $controller, locationUtils, tenantService) {
-
-    // extends the FormTenantController to inherit common methods
-    angular.extend(this, $controller('FormTenantController', { tenant: tenant, $scope: $scope }));
-
-    $scope.tenantName = 'New';
-
-    $scope.settings = {
-        isNew: true,
-        saveLabel: 'Create'
-    };
-
-    $scope.save = function(tenant) {
-        tenantService.createTenant(tenant).
-            then(function() {
-                locationUtils.navigateToPath('/admin/tenants');
-            });
-    };
-
-};
-
-FormNewTenantController.$inject = ['tenant', '$scope', '$controller', 'locationUtils', 'tenantService'];
-module.exports = FormNewTenantController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/new/index.js
deleted file mode 100644
index 5e8a903..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/tenant/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.tenant.new', [])
-    .controller('FormNewTenantController', require('./FormNewTenantController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/type/FormTypeController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/type/FormTypeController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/type/FormTypeController.js
deleted file mode 100644
index 065fda9..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/type/FormTypeController.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormTypeController = function(type, $scope, $location, formUtils, stringUtils, locationUtils) {
-
-    $scope.type = type;
-
-    $scope.props = [
-        { name: 'name', type: 'text', required: true, maxLength: 45 },
-        { name: 'useInTable', type: 'text', required: true, maxLength: 45 }
-    ];
-
-    $scope.labelize = stringUtils.labelize;
-
-    $scope.viewServers = function() {
-        $location.path($location.path() + '/servers');
-    };
-
-    $scope.viewDeliveryServices = function() {
-        $location.path($location.path() + '/delivery-services');
-    };
-
-    $scope.viewCacheGroups = function() {
-        $location.path($location.path() + '/cache-groups');
-    };
-
-    $scope.viewStaticDnsEntries = function() {
-        $location.path($location.path() + '/static-dns-entries');
-    };
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-};
-
-FormTypeController.$inject = ['type', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils'];
-module.exports = FormTypeController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/type/edit/FormEditTypeController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/type/edit/FormEditTypeController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/type/edit/FormEditTypeController.js
deleted file mode 100644
index 6dc8baa..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/type/edit/FormEditTypeController.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditTypeController = function(type, $scope, $controller, $uibModal, $anchorScroll, locationUtils, typeService) {
-
-    // extends the FormTypeController to inherit common methods
-    angular.extend(this, $controller('FormTypeController', { type: type, $scope: $scope }));
-
-    var deleteType = function(type) {
-        typeService.deleteType(type.id)
-            .then(function() {
-                locationUtils.navigateToPath('/admin/types');
-            });
-    };
-
-    $scope.typeName = angular.copy(type.name);
-
-    $scope.settings = {
-        isNew: false,
-        saveLabel: 'Update'
-    };
-
-    $scope.save = function(type) {
-        typeService.updateType(type).
-            then(function() {
-                $scope.typeName = angular.copy(type.name);
-                $anchorScroll(); // scrolls window to top
-            });
-    };
-
-    $scope.confirmDelete = function(type) {
-        var params = {
-            title: 'Delete Type: ' + type.name,
-            key: type.name
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-            controller: 'DialogDeleteController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                }
-            }
-        });
-        modalInstance.result.then(function() {
-            deleteType(type);
-        }, function () {
-            // do nothing
-        });
-    };
-
-};
-
-FormEditTypeController.$inject = ['type', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'typeService'];
-module.exports = FormEditTypeController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/type/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/type/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/type/edit/index.js
deleted file mode 100644
index e4f9cb9..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/type/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.type.edit', [])
-    .controller('FormEditTypeController', require('./FormEditTypeController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/type/form.type.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/type/form.type.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/type/form.type.tpl.html
deleted file mode 100644
index 1fc3e1f..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/type/form.type.tpl.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/types')">Types</a></li>
-            <li class="active">{{typeName}}</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <button class="btn btn-primary" title="View Servers" ng-show="type.useInTable == 'server'" ng-click="viewServers()">View Servers</button>
-            <button class="btn btn-primary" title="View Delivery Services" ng-show="type.useInTable == 'deliveryservice'" ng-click="viewDeliveryServices()">View Delivery Services</button>
-            <button class="btn btn-primary" title="View Cache Groups" ng-show="type.useInTable == 'cachegroup'" ng-click="viewCacheGroups()">View Cache Groups</button>
-            <button class="btn btn-primary" title="View Static DNS Entries" ng-show="type.useInTable == 'staticdnsentry'" ng-click="viewStaticDnsEntries()">View Static DNS Entries</button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="typeForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(typeForm[prop.name]), 'has-feedback': hasError(typeForm[prop.name])}" ng-repeat="prop in props">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">{{labelize(prop.name)}} <span ng-show="prop.required">*</span></label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="{{prop.name}}" name="{{prop.name}}" type="{{prop.type}}" class="form-control" ng-model="type[prop.name]" ng-readonly="prop.readonly" ng-required="prop.required" ng-maxlength="prop.maxLength" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(typeForm[prop.name], 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(typeForm[prop.name], 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(typeForm[prop.name])" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Description</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <textarea id="description" name="description" rows="3" cols="17" class="form-control" ng-model="type.description" maxlength="256"></textarea>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(type)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="typeForm.$pristine || typeForm.$invalid" ng-click="save(type)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/type/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/type/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/type/index.js
deleted file mode 100644
index 24ae187..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/type/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.type', [])
-    .controller('FormTypeController', require('./FormTypeController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/type/new/FormNewTypeController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/type/new/FormNewTypeController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/type/new/FormNewTypeController.js
deleted file mode 100644
index 2f07a52..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/type/new/FormNewTypeController.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewTypeController = function(type, $scope, $controller, typeService) {
-
-    // extends the FormTypeController to inherit common methods
-    angular.extend(this, $controller('FormTypeController', { type: type, $scope: $scope }));
-
-    $scope.typeName = 'New';
-
-    $scope.settings = {
-        isNew: true,
-        saveLabel: 'Create'
-    };
-
-    $scope.save = function(type) {
-        typeService.createType(type);
-    };
-
-};
-
-FormNewTypeController.$inject = ['type', '$scope', '$controller', 'typeService'];
-module.exports = FormNewTypeController;



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/dates/chart.dates.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/dates/chart.dates.tpl.html b/traffic_portal/app/src/common/modules/chart/dates/chart.dates.tpl.html
deleted file mode 100644
index e13d247..0000000
--- a/traffic_portal/app/src/common/modules/chart/dates/chart.dates.tpl.html
+++ /dev/null
@@ -1,57 +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="chartDatesForm">
-    <form name="chartDatesForm" class="form-inline" role="form">
-        <div class="form-group">
-            <div class="start-dropdown" uib-dropdown is-open="startDropdown.isopen">
-                <button id="start-button" type="button" class="dates-btn btn btn-link" uib-dropdown-toggle>
-                    <div class="input-group">
-                        <span class="input-group-addon"><strong>From:</strong></span>
-                        <input type="text" class="form-control date-text" formatted-date data-ng-model="chartData.start" ng-disabled="true">
-                    </div>
-                </button>
-                <ul class="uib-dropdown-menu datetimepicker-dropdown-menu" role="menu" aria-labelledby="start-button">
-                    <datetimepicker data-ng-model="chartData.start" data-on-set-time="setStart(newDate, oldDate); closeStart()" data-datetimepicker-config="{ minuteStep: 1 }"/>
-                </ul>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="end-dropdown" uib-dropdown is-open="endDropdown.isopen">
-                <button id="end-button" type="button" class="dates-btn btn btn-link" uib-dropdown-toggle>
-                    <div class="input-group">
-                        <span class="input-group-addon"><strong>To:</strong></span>
-                        <input type="text" class="form-control date-text" formatted-date data-ng-model="chartData.end" ng-disabled="true">
-                    </div>
-                </button>
-                <ul class="uib-dropdown-menu datetimepicker-dropdown-menu" role="menu" aria-labelledby="end-button">
-                    <datetimepicker data-ng-model="chartData.end" data-on-set-time="setEnd(newDate, oldDate); closeEnd()" data-datetimepicker-config="{ minuteStep: 1 }"/>
-                </ul>
-            </div>
-        </div>
-        <div class="form-group">
-            <div class="input-group">
-                <span class="input-group-btn">
-                    <button id="applyBtn" class="apply-btn btn btn-default" type="button" ng-click="changeDates(chartData.start, chartData.end); chartData.autoRefresh = false;" uib-popover="Apply selected dates" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true" popover-class="popover-class">Apply</button>
-                    <button id="pauseBtn" class="pause-btn btn btn-default" type="button" ng-show="showAutoRefreshBtn && chartData.autoRefresh" ng-click="toggleAutoRefresh();" uib-popover="Pause live update" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true" popover-class="popover-class"><i class="fa fa-pause"></i></button>
-                    <button id="playBtn" class="play-btn btn btn-default" type="button" ng-show="showAutoRefreshBtn && !chartData.autoRefresh" ng-click="toggleAutoRefresh();" uib-popover="Start live update" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true" popover-class="popover-class"><i class="fa fa-play"></i></button>
-                </span>
-                <input id="rangeInput" type="text" class="form-control chart-range-input" placeholder="Range" uib-popover="Override the date range in the format 1m, 2h, 3d, 4w or 5M and hitting enter." popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true" popover-class="popover-class" ng-model="tempChartData.range" enter="applyRange()" ng-blur="revertRange()" select-on-click>
-            </div>
-        </div>
-    </form>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/dates/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/dates/index.js b/traffic_portal/app/src/common/modules/chart/dates/index.js
deleted file mode 100644
index 63eec0a..0000000
--- a/traffic_portal/app/src/common/modules/chart/dates/index.js
+++ /dev/null
@@ -1,26 +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.chart.dates', [])
-    .controller('ChartDatesController', require('./ChartDatesController'))
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.chart.dates', {
-                reloadOnSearch: false
-            });
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/httpStatus/ChartHttpStatusController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/httpStatus/ChartHttpStatusController.js b/traffic_portal/app/src/common/modules/chart/httpStatus/ChartHttpStatusController.js
deleted file mode 100644
index 60c8a62..0000000
--- a/traffic_portal/app/src/common/modules/chart/httpStatus/ChartHttpStatusController.js
+++ /dev/null
@@ -1,175 +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 ChartHttpStatusController = function(entity, $window, $rootScope, $scope, $uibModal, $q, $timeout, $filter, propertiesModel, dateUtils, statsService) {
-
-    $scope.chartName = propertiesModel.properties.charts.httpStatus.name;
-
-    var chartDatesChanged = false,
-        chartStart,
-        chartEnd;
-
-    var loadAggregateHttpStatusData = function(start, end) {
-        if (!entity || !chartDatesChanged) return;
-        chartDatesChanged = false;
-        getAggregateHttpStatusData(start, end);
-    };
-
-    var getAggregateHttpStatusData = function(start, end) {
-
-        var exclude = 'summary',
-            ignoreLoadingBar = false,
-            showError = false,
-            promises = [];
-
-        promises.push(statsService.getEdgeTransactionsByStatusGroup(entity, '2xx', start, end, $scope.httpStatusChartInterval, exclude, ignoreLoadingBar, showError));
-        promises.push(statsService.getEdgeTransactionsByStatusGroup(entity, '3xx', start, end, $scope.httpStatusChartInterval, exclude, ignoreLoadingBar, showError));
-        promises.push(statsService.getEdgeTransactionsByStatusGroup(entity, '4xx', start, end, $scope.httpStatusChartInterval, exclude, ignoreLoadingBar, showError));
-        promises.push(statsService.getEdgeTransactionsByStatusGroup(entity, '5xx', start, end, $scope.httpStatusChartInterval, exclude, ignoreLoadingBar, showError));
-
-        $q.all(promises)
-            .then(
-            function(responses) {
-                var status2xxChartData = buildHttpStatusChartData(responses[0], start, false),
-                    status3xxChartData = buildHttpStatusChartData(responses[1], start, false),
-                    status4xxChartData = buildHttpStatusChartData(responses[2], start, false),
-                    status5xxChartData = buildHttpStatusChartData(responses[3], start, false);
-                $timeout(function () {
-                    buildHttpChart(status2xxChartData, status3xxChartData, status4xxChartData, status5xxChartData);
-                }, 100);
-            },
-            function(fault) {
-                buildHttpChart([], [], [], []);
-            }).finally(function() {
-                $scope.httpStatusDataLoaded = true;
-            });
-    };
-
-    var updateChartDates = function(start, end) {
-        $scope.dateRangeText = dateUtils.dateFormat(start.toDate(), "ddd mmm d yyyy h:MM tt (Z)") + ' to ' + dateUtils.dateFormat(end.toDate(), "ddd mmm d yyyy h:MM tt (Z)");
-    };
-
-    var buildHttpStatusChartData = function(result, start, incremental) {
-        var normalizedChartData = [],
-            series = result.series;
-
-        if (angular.isDefined(series)) {
-            _.each(series.values, function(seriesItem) {
-                if (moment(seriesItem[0]).isSame(start) || moment(seriesItem[0]).isAfter(start)) {
-                    if (_.isNumber(seriesItem[1]) || !incremental) {
-                        normalizedChartData.push([ moment(seriesItem[0]).valueOf(), seriesItem[1] ]);
-                    }
-                }
-            });
-        }
-
-        return normalizedChartData;
-    };
-
-    var buildHttpChart = function(status2xxChartData, status3xxChartData, status4xxChartData, status5xxChartData) {
-
-        var options = {
-            xaxis: {
-                mode: "time",
-                timezone: "browser",
-                twelveHourClock: true
-            },
-            yaxes: [
-                {
-                    position: "left",
-                    axisLabel: "Success (2xx and 3xx)",
-                    axisLabelUseCanvas: true,
-                    axisLabelFontSizePixels: 12,
-                    axisLabelFontFamily: 'Verdana, Arial',
-                    axisLabelPadding: 3
-                },
-                {
-                    position: "right",
-                    axisLabel: "Client Error (4xx)",
-                    axisLabelUseCanvas: true,
-                    axisLabelFontSizePixels: 12,
-                    axisLabelFontFamily: 'Verdana, Arial',
-                    axisLabelPadding: 3
-                },
-                {
-                    position: "right",
-                    axisLabel: "Server Error (5xx)",
-                    axisLabelUseCanvas: true,
-                    axisLabelFontSizePixels: 12,
-                    axisLabelFontFamily: 'Verdana, Arial',
-                    axisLabelPadding: 3
-                }
-            ],
-            grid: {
-                hoverable: true,
-                axisMargin: 20
-            },
-            tooltip: {
-                show: true,
-                content: function(label, xval, yval, flotItem){
-                    var tooltipString = dateUtils.dateFormat(xval, "ddd mmm d yyyy h:MM:ss tt (Z)") + '<br>';
-                    tooltipString += '<span>' + label + ': ' + $filter('number')(yval, 2) + ' TPS</span><br>'
-                    return tooltipString;
-                }
-            }
-        };
-
-        var series = [
-            { label: "2xx", yaxis: 1, color: "#91ca32", data: status2xxChartData },
-            { label: "3xx", yaxis: 1, color: "#5897fb", data: status3xxChartData },
-            { label: "4xx", yaxis: 2, color: "#6859a3", data: status4xxChartData },
-            { label: "5xx", yaxis: 3, color: "#a94442", data: status5xxChartData }
-        ];
-
-        $.plot($("#http-chart"), series, options);
-
-    };
-
-    var onDateChange = function(args) {
-        chartDatesChanged = true;
-        chartStart = args.start;
-        chartEnd = args.end;
-        updateChartDates(chartStart, chartEnd);
-        loadAggregateHttpStatusData(chartStart, chartEnd);
-    };
-
-    $scope.httpStatusDataLoaded = false;
-
-    $scope.httpStatusChartInterval = '60s';
-
-    $scope.resetStatusCodes = function() {
-        $timeout(function(){
-            $scope.http2xxCodes = [];
-            $scope.http3xxCodes = [];
-            $scope.http4xxCodes = [];
-            $scope.http5xxCodes = [];
-        });
-    };
-    $scope.resetStatusCodes();
-
-    $scope.$on('chartModel::dateChange', function(event, args) {
-        onDateChange(args);
-    });
-
-    $scope.$on('chartModel::dateRoll', function(event, args) {
-        onDateChange(args);
-    });
-
-};
-
-ChartHttpStatusController.$inject = ['entity', '$window', '$rootScope', '$scope', '$uibModal', '$q', '$timeout', '$filter', 'propertiesModel', 'dateUtils', 'statsService'];
-module.exports = ChartHttpStatusController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/httpStatus/_chart.httpStatus.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/httpStatus/_chart.httpStatus.scss b/traffic_portal/app/src/common/modules/chart/httpStatus/_chart.httpStatus.scss
deleted file mode 100644
index b4ed1c3..0000000
--- a/traffic_portal/app/src/common/modules/chart/httpStatus/_chart.httpStatus.scss
+++ /dev/null
@@ -1,99 +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.
-
-*/
-
-#httpChartContainer {
-  position: relative;
-  text-align: center;
-  background-color: transparent;
-  padding: 30px 60px;
-
-  #http-loading, #http-chart {
-    height: 400px;
-    width: 100%;
-  }
-
-  #http-loading {
-    padding-top: 50px;
-  }
-
-}
-
-#httpSparklineContainer {
-
-  .http-sparkline-row {
-    margin-bottom: 20px;
-    &:first-child {
-      margin-top: 10px;
-    }
-  }
-
-  .http-sparkline-header-row {
-    margin-top: 10px;
-    margin-bottom: 10px;
-  }
-
-  .success-col, .client-error-col, .server-error-col {
-    margin-top: 10px;
-  }
-
-  .http-sparkline-row, .http-sparkline-header-row {
-    margin-left: 0;
-    margin-right: 0;
-    border: 1px solid #A8A8A8;
-
-    .header, .column-header {
-      padding: 10px;
-      margin-top: 0;
-    }
-
-    .column-header {
-      margin: 0;
-    }
-
-    .sparkline {
-      height: 50px;
-      width: 260px;
-      text-align: center;
-    }
-
-    .sparkline-loading-text {
-      padding-top: 15px;
-      color: #999;
-      font-size: 12px;
-      font-weight: bold;
-      display: inline-block;
-    }
-
-    .metrics {
-      padding: 10px;
-
-      .metric-label {
-        font-size: 12px;
-        font-weight: bold;
-      }
-
-      .total-percent {
-        color: #999;
-        font-size: 12px;
-        font-weight: bold;
-      }
-
-    }
-
-  }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/httpStatus/chart.httpStatus.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/httpStatus/chart.httpStatus.tpl.html b/traffic_portal/app/src/common/modules/chart/httpStatus/chart.httpStatus.tpl.html
deleted file mode 100644
index 40a79b2..0000000
--- a/traffic_portal/app/src/common/modules/chart/httpStatus/chart.httpStatus.tpl.html
+++ /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.
-
--->
-
-<div class="chart-container">
-    <div id="httpChartContainer">
-        <h6>{{chartName}}</h6>
-        <div id="http-loading" ng-show="!httpStatusDataLoaded">
-            <div class="loading-text">Loading http statuses...</div>
-        </div>
-        <div id="http-chart" ng-show="httpStatusDataLoaded"></div>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/httpStatus/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/httpStatus/index.js b/traffic_portal/app/src/common/modules/chart/httpStatus/index.js
deleted file mode 100644
index a05339a..0000000
--- a/traffic_portal/app/src/common/modules/chart/httpStatus/index.js
+++ /dev/null
@@ -1,19 +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.chart.httpStatus', [])
-    .controller('ChartHttpStatusController', require('./ChartHttpStatusController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/routing/ChartRoutingController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/routing/ChartRoutingController.js b/traffic_portal/app/src/common/modules/chart/routing/ChartRoutingController.js
deleted file mode 100644
index 7f10dfc..0000000
--- a/traffic_portal/app/src/common/modules/chart/routing/ChartRoutingController.js
+++ /dev/null
@@ -1,141 +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 ChartRoutingController = function(entityId, service, $rootScope, $scope, $interval, $filter) {
-
-    var routingInterval,
-        routingLoaded = false;
-
-    var getRoutingMethods = function(showTimoutError) {
-        if (!$rootScope.online) return;
-
-        var ignoreLoadingBar = true;
-        service.getRoutingMethods(entityId, ignoreLoadingBar, showTimoutError)
-            .then(
-            function(response) {
-                routingLoaded = true;
-                var staticRoute = Math.round(response.staticRoute * 100) / 100,
-                    dsr = Math.round(response.dsr * 100) / 100,
-                    err = Math.round(response.err * 100) / 100,
-                    miss = Math.round(response.miss * 100) / 100,
-                    geo = Math.round(response.geo * 100) / 100,
-                    fed = Math.round(response.fed * 100) / 100,
-                    cz = Math.round(response.cz * 100) / 100;
-
-                var data = [];
-
-                if (staticRoute > 0) {
-                    data.push({
-                        label: "Static",
-                        color: '#cccccc',
-                        data: [ [ staticRoute, 1 ] ]
-                    });
-                }
-                if (dsr > 0) {
-                    data.push({
-                        label: "DSR",
-                        color: '#3c763d',
-                        data: [ [ dsr, 1 ] ]
-                    });
-                }
-                if (err > 0) {
-                    data.push({
-                        label: "Error",
-                        color: '#FF0000',
-                        data: [ [ err, 1 ] ]
-                    });
-                }
-                if (miss > 0) {
-                    data.push({
-                        label: "Miss",
-                        color: '#a94442',
-                        data: [ [ miss, 1 ] ]
-                    });
-                }
-                if (geo > 0) {
-                    data.push({
-                        label: "3rd Party",
-                        color: '#263C53',
-                        data: [ [ geo, 1 ] ]
-                    });
-                }
-                if (cz > 0) {
-                    data.push({
-                        label: "Native",
-                        color: '#357EBD',
-                        data: [ [ cz, 1 ] ]
-                    });
-                }
-                if (fed > 0) {
-                    data.push({
-                        label: "Federated",
-                        color: '#8a00e6',
-                        data: [ [ fed, 1 ] ]
-                    });
-                }
-
-                buildRoutingChart(data);
-            });
-    };
-
-    var buildRoutingChart = function(data) {
-
-        var options = {
-            series: {
-                stack: true,
-                lines: {show: false, steps: false },
-                bars: {
-                    show: true,
-                    horizontal: true,
-                    barWidth: 0.9,
-                    align: 'center'
-                }
-            },
-            grid: {
-                borderWidth: 0,
-                hoverable: true
-            },
-            tooltip: {
-                show: true,
-                content: function(label, xval, yval, flotItem){
-                    return '<span>' + label + ': ' + $filter('number')(xval, 2) + '%</span><br>';
-                }
-            },
-            yaxis: {
-                ticks: [[ 1,'%' ]]
-            }
-        };
-
-        $.plot($("#routing-chart"), data, options);
-    };
-
-    angular.element(document).ready(function () {
-        getRoutingMethods(true);
-        routingInterval = $interval(function() { getRoutingMethods(false) }, 5 * 60 * 1000); // every 5 mins routing will refresh
-    });
-
-    $scope.$on("$destroy", function() {
-        if (angular.isDefined(routingInterval)) {
-            $interval.cancel(routingInterval);
-            routingInterval = undefined;
-        }
-    });
-
-};
-
-ChartRoutingController.$inject = ['entityId', 'service', '$rootScope', '$scope', '$interval', '$filter'];
-module.exports = ChartRoutingController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/routing/_chart.routing.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/routing/_chart.routing.scss b/traffic_portal/app/src/common/modules/chart/routing/_chart.routing.scss
deleted file mode 100644
index 84eb5dd..0000000
--- a/traffic_portal/app/src/common/modules/chart/routing/_chart.routing.scss
+++ /dev/null
@@ -1,25 +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.
-
-*/
-
-#routingChartContainer {
-  text-align: center;
-}
-
-#routing-chart {
-  height: 200px;
-  width: 100%;
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/routing/chart.routing.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/routing/chart.routing.tpl.html b/traffic_portal/app/src/common/modules/chart/routing/chart.routing.tpl.html
deleted file mode 100644
index 9be074e..0000000
--- a/traffic_portal/app/src/common/modules/chart/routing/chart.routing.tpl.html
+++ /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.
-
--->
-
-<div id="routingChartContainer">
-    <h6>Routing Methods %</h6>
-    <div id="routing-chart"></div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/routing/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/routing/index.js b/traffic_portal/app/src/common/modules/chart/routing/index.js
deleted file mode 100644
index d3782c5..0000000
--- a/traffic_portal/app/src/common/modules/chart/routing/index.js
+++ /dev/null
@@ -1,19 +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.chart.routing', [])
-    .controller('ChartRoutingController', require('./ChartRoutingController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/ChartTransactionsPerSecondController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/ChartTransactionsPerSecondController.js b/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/ChartTransactionsPerSecondController.js
deleted file mode 100644
index d1b3c47..0000000
--- a/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/ChartTransactionsPerSecondController.js
+++ /dev/null
@@ -1,214 +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 ChartTransactionsPerSecondController = function(entity, showSummary, $rootScope, $scope, $uibModal, $q, $timeout, $filter, propertiesModel, dateUtils, statsService) {
-
-    $scope.chartName = propertiesModel.properties.charts.transactionsPerSecond.name;
-
-    var chartDatesChanged = false,
-        chartStart,
-        chartEnd;
-
-    var summaryStart,
-        summaryEnd;
-
-    var chartRangeTimer;
-
-    var loadTransactions = function(start, end) {
-        if (!entity || !chartDatesChanged) return;
-        chartDatesChanged = false;
-        $scope.transactionChartDates = {
-            start: start,
-            end: end
-        };
-        getTransactions(start, end);
-        $scope.refreshTpsSummaryMetrics(0);
-    };
-
-    var getTransactions = function(start, end) {
-        var exclude = '',
-            ignoreLoadingBar = true,
-            showError = true,
-            promises = [];
-
-        // edge transactions
-        promises.push(statsService.getEdgeTransactions(entity, start, end, $scope.transactionsChartInterval, exclude, ignoreLoadingBar, showError));
-
-        $q.all(promises)
-            .then(
-            function(responses) {
-                // set chart data
-                var edgeTransactionsChartData = buildTransactionsChartData(responses[0], start, false);
-                $timeout(function () {
-                    buildTransactionsChart(edgeTransactionsChartData);
-                }, 100);
-            },
-            function(fault) {
-                buildTransactionsChart([]); // build an empty chart
-            }).finally(function() {
-                $scope.transactionsLoaded = true;
-            });
-    };
-
-    var buildTransactionsChartData = function(result, start, incremental) {
-        var normalizedChartData = [],
-            series = result.series;
-
-        if (angular.isDefined(series)) {
-            _.each(series.values, function(seriesItem) {
-                if (moment(seriesItem[0]).isSame(start) || moment(seriesItem[0]).isAfter(start)) {
-                    if (_.isNumber(seriesItem[1]) || !incremental) {
-                        normalizedChartData.push([ moment(seriesItem[0]).valueOf(), seriesItem[1] ]);
-                    }
-                }
-            });
-        }
-
-        return normalizedChartData;
-    };
-
-    var buildTransactionsChart = function(edgeTransactionsChartData) {
-
-        var options = {
-            xaxis: {
-                mode: "time",
-                timezone: "browser",
-                twelveHourClock: true
-            },
-            yaxes: [
-                {
-                    position: "left",
-                    axisLabel: "TPS",
-                    axisLabelUseCanvas: true,
-                    axisLabelFontSizePixels: 12,
-                    axisLabelFontFamily: 'Verdana, Arial',
-                    axisLabelPadding: 3
-                }
-            ],
-            grid: { hoverable: true },
-            tooltip: {
-                show: true,
-                content: function(label, xval, yval, flotItem){
-                    var tooltipString = dateUtils.dateFormat(xval, "ddd mmm d yyyy h:MM:ss tt (Z)") + '<br>';
-                    tooltipString += '<span>' + label + ': ' + $filter('number')(yval, 2) + ' TPS</span><br>'
-                    return tooltipString;
-                }
-            }
-        };
-
-        $.plot($("#tps-chart"), [ { label: "Edge", data: edgeTransactionsChartData } ], options);
-
-    };
-
-    var updateChartDates = function(start, end) {
-        $scope.dateRangeText = dateUtils.dateFormat(start.toDate(), "ddd mmm d yyyy h:MM tt (Z)") + ' to ' + dateUtils.dateFormat(end.toDate(), "ddd mmm d yyyy h:MM tt (Z)");
-    };
-
-    var getSummaryMetrics = function(start, end) {
-
-        var exclude = 'series',
-            ignoreLoadingBar = true,
-            showError = false,
-            promises = [];
-
-        // edge summary
-        promises.push(statsService.getEdgeTransactionsSummary(entity, start, end, $scope.transactionsChartInterval, exclude, ignoreLoadingBar, showError));
-
-        $q.all(promises)
-            .then(
-            function(responses) {
-                var edgeSummary = responses[0].summary;
-                if (angular.isDefined(edgeSummary)) {
-                    $scope.tpsEdgeSummary = edgeSummary;
-                } else {
-                    $scope.resetEdgeSummary();
-                }
-            },
-            function(fault) {
-                $scope.resetEdgeSummary();
-            }).finally(function() {
-                $scope.updatingTpsSummaryMetrics = false;
-            });
-    };
-
-    var onDateChange = function(args) {
-        chartDatesChanged = true;
-        chartStart = args.start;
-        chartEnd = args.end;
-        summaryStart = args.start;
-        summaryEnd = args.end;
-        updateChartDates(chartStart, chartEnd);
-        loadTransactions(chartStart, chartEnd);
-    };
-
-    $scope.showSummary = showSummary;
-
-    $scope.updatingTpsSummaryMetrics = false;
-
-    $scope.transactionsLoaded = false;
-
-    $scope.transactionsChartInterval = '60s';
-
-    $scope.resetEdgeSummary = function() {
-        $timeout(function() {
-            $scope.tpsEdgeSummary = {
-                max: 0,
-                min: 0,
-                totalTransactions: 0,
-                average: 0,
-                fifthPercentile: 0,
-                ninetyFifthPercentile: 0,
-                ninetyEighthPercentile: 0
-            };
-        });
-    };
-    $scope.resetEdgeSummary();
-
-    $scope.refreshTpsSummaryMetrics = function(delay) {
-        if (!$scope.showSummary) return; // don't bother. summary hidden...
-
-        $timeout(function() { $scope.updatingTpsSummaryMetrics = true; });
-        if (chartRangeTimer) {
-            $timeout.cancel(chartRangeTimer);
-        }
-        chartRangeTimer = $timeout(function () {
-            getSummaryMetrics(summaryStart, summaryEnd);
-        }, delay);
-    };
-
-    $scope.hideSummaryMetrics = function() {
-        $scope.showSummary = false;
-        $scope.resetEdgeSummary();
-    };
-
-    $scope.showSummaryMetrics = function() {
-        $scope.showSummary = true;
-        $scope.refreshTpsSummaryMetrics(0);
-    };
-
-    $scope.$on('chartModel::dateChange', function(event, args) {
-        onDateChange(args);
-    });
-
-    $scope.$on('chartModel::dateRoll', function(event, args) {
-        onDateChange(args);
-    });
-
-};
-
-ChartTransactionsPerSecondController.$inject = ['entity', 'showSummary', '$rootScope', '$scope', '$uibModal', '$q', '$timeout', '$filter', 'propertiesModel', 'dateUtils', 'statsService'];
-module.exports = ChartTransactionsPerSecondController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/_chart.transactionsPerSecond.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/_chart.transactionsPerSecond.scss b/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/_chart.transactionsPerSecond.scss
deleted file mode 100644
index 31a1ba4..0000000
--- a/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/_chart.transactionsPerSecond.scss
+++ /dev/null
@@ -1,39 +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.
-
-*/
-
-#tpsChartContainer {
-  position: relative;
-  text-align: center;
-  background-color: transparent;
-  padding: 30px 60px;
-
-  #tps-loading, #tps-chart {
-    height: 400px;
-    min-width: 310px;
-  }
-
-  #tps-loading {
-    padding-top: 40px;
-  }
-
-}
-
-#tps-metrics {
-  .header {
-    margin-bottom: 0;
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/chart.transactionsPerSecond.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/chart.transactionsPerSecond.tpl.html b/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/chart.transactionsPerSecond.tpl.html
deleted file mode 100644
index f446009..0000000
--- a/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/chart.transactionsPerSecond.tpl.html
+++ /dev/null
@@ -1,64 +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="chart-container">
-    <div id="tpsChartContainer">
-        <h6>{{chartName}}</h6>
-        <div id="tps-loading" ng-show="!transactionsLoaded">
-            <div class="loading-text">Loading transactions...</div>
-        </div>
-        <div id="tps-chart" ng-show="transactionsLoaded"></div>
-    </div>
-    <h6 ng-show="!showSummary" class="show-summary-header"><small class="show-summary">[ <a ng-click="showSummaryMetrics()">show summary metrics</a> ]</small></h6>
-    <div id="tps-metrics" ng-show="showSummary" class="row metrics">
-        <div class="col-sm-12 col-md-12">
-            <h6 class="header">
-                <div>{{chartName}} Summary Metrics
-                    <small ng-show="updatingTpsSummaryMetrics">[ calculating <i class="fa fa-spin fa-spinner fa-fw"></i> ]</small>
-                    <small ng-show="!updatingTpsSummaryMetrics" class="summary-refresh">[ <a ng-click="refreshTpsSummaryMetrics(0)">refresh</a> ]</small>
-                    <small class="hide-summary">[ <a ng-click="hideSummaryMetrics()">hide summary metrics</a> ]</small>
-                </div>
-                <hr class="summary-hr">
-                <div><small>{{dateRangeText}}</small></div>
-            </h6>
-            <div class="summary-metrics">
-                <table class="table table-condensed">
-                    <thead>
-                    <tr>
-                        <th>Server Type</th>
-                        <th>Total Transactions</th>
-                        <th>95th percentile</th>
-                        <th>Max</th>
-                        <th>Min</th>
-                        <th>Avg</th>
-                    </tr>
-                    </thead>
-                    <tbody>
-                    <tr>
-                        <td>Edge</td>
-                        <td class="total">{{tpsEdgeSummary.totalTransactions | number:0}}</td>
-                        <td>{{tpsEdgeSummary.ninetyFifthPercentile | number:2}} TPS</td>
-                        <td>{{tpsEdgeSummary.max | number:2}} TPS</td>
-                        <td>{{tpsEdgeSummary.min | number:2}} TPS</td>
-                        <td>{{tpsEdgeSummary.average | number:2}} TPS</td>
-                    </tr>
-                    </tbody>
-                </table>
-            </div>
-        </div>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/index.js b/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/index.js
deleted file mode 100644
index aedd14b..0000000
--- a/traffic_portal/app/src/common/modules/chart/transactionsPerSecond/index.js
+++ /dev/null
@@ -1,19 +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.chart.transactionsPerSecond', [])
-    .controller('ChartTransactionsPerSecondController', require('./ChartTransactionsPerSecondController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dates/DatesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dates/DatesController.js b/traffic_portal/app/src/common/modules/dates/DatesController.js
deleted file mode 100644
index 48d5243..0000000
--- a/traffic_portal/app/src/common/modules/dates/DatesController.js
+++ /dev/null
@@ -1,55 +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 DatesController = function(customLabel, dateRange, $rootScope, $scope) {
-
-    $scope.dateRange = dateRange;
-
-    $scope.customLabel = customLabel;
-
-    $scope.openStart = function($event) {
-        $event.preventDefault();
-        $event.stopPropagation();
-
-        $scope.startOpened = true;
-    };
-
-    $scope.openEnd = function($event) {
-        $event.preventDefault();
-        $event.stopPropagation();
-
-        $scope.endOpened = true;
-    };
-
-    $scope.dateOptions = {
-        formatYear: 'yy',
-        startingDay: 0,
-        showWeeks: false
-    };
-
-    $scope.changeDates = function(start, end) {
-        $rootScope.$broadcast('datesController::dateChange', { start: start, end: end });
-    };
-
-    angular.element(document).ready(function () {
-        $scope.changeDates(dateRange.start, dateRange.end);
-    });
-
-};
-
-DatesController.$inject = ['customLabel', 'dateRange', '$rootScope', '$scope'];
-module.exports = DatesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dates/_dates.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dates/_dates.scss b/traffic_portal/app/src/common/modules/dates/_dates.scss
deleted file mode 100644
index 83dd492..0000000
--- a/traffic_portal/app/src/common/modules/dates/_dates.scss
+++ /dev/null
@@ -1,47 +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.
-
-*/
-
-.dates-form {
-  text-align: center;
-  padding: 20px;
-  margin: 0 0 20px 0;
-  background-color: #e4e4e4;
-
-  .form-inline {
-    margin-top: 5px;
-  }
-
-  .to-date {
-    margin-left: 20px;
-  }
-
-  .date-text {
-    width: 200px !important;
-  }
-
-  .input-group {
-    margin-bottom: 0;
-  }
-
-}
-
-@media print {
-  .dates-form {
-    display: none;
-  }
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dates/dates.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dates/dates.tpl.html b/traffic_portal/app/src/common/modules/dates/dates.tpl.html
deleted file mode 100644
index 4c9a3d9..0000000
--- a/traffic_portal/app/src/common/modules/dates/dates.tpl.html
+++ /dev/null
@@ -1,42 +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 dates-form hidden-print">
-    <div class="col-sm-12 col-md-12">
-        <form class="form-inline" role="form">
-            <div class="form-group from-date">
-                <label for="startDate">{{customLabel}} from:</label>
-                <p class="input-group">
-                    <input id="startDate" type="text" class="form-control date-text" datepicker-popup="dd-MMMM-yyyy" show-button-bar="false" ng-model="dateRange.start" is-open="startOpened" max-date="dateRange.end" datepicker-options="dateOptions" ng-required="true" />
-                    <span class="input-group-btn">
-                        <button type="button" class="btn btn-default" ng-click="openStart($event)"><i class="fa fa-calendar"></i></button>
-                    </span>
-                </p>
-            </div>
-            <div class="form-group to-date">
-                <label for="endDate">to:</label>
-                <p class="input-group">
-                    <input id="endDate" type="text" class="form-control date-text" datepicker-popup="dd-MMMM-yyyy" show-button-bar="false" ng-model="dateRange.end" is-open="endOpened" min-date="dateRange.start" max-date="dateRange.max" datepicker-options="dateOptions" ng-required="true" />
-                    <span class="input-group-btn">
-                        <button type="button" class="btn btn-default" ng-click="openEnd($event)"><i class="fa fa-calendar"></i></button>
-                    </span>
-                </p>
-            </div>
-            <button type="submit" class="btn btn-default" ng-click="changeDates(dateRange.start, dateRange.end)">Apply</button>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dates/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dates/index.js b/traffic_portal/app/src/common/modules/dates/index.js
deleted file mode 100644
index 47ae7a0..0000000
--- a/traffic_portal/app/src/common/modules/dates/index.js
+++ /dev/null
@@ -1,19 +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.dates', [])
-    .controller('DatesController', require('./DatesController'))
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/deliveryService/config/edit/DSConfigEditController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/deliveryService/config/edit/DSConfigEditController.js b/traffic_portal/app/src/common/modules/deliveryService/config/edit/DSConfigEditController.js
deleted file mode 100644
index f3d9860..0000000
--- a/traffic_portal/app/src/common/modules/deliveryService/config/edit/DSConfigEditController.js
+++ /dev/null
@@ -1,55 +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 DSConfigEditController = function(deliveryService, $scope, $uibModalInstance) {
-
-    $scope.deliveryService = deliveryService;
-
-    $scope.close = function () {
-        $uibModalInstance.dismiss('close');
-    };
-
-    $scope.isHTTP = function(ds) {
-        return ds.type.indexOf('HTTP') !== -1;
-    };
-
-    $scope.edgeFQDNs = function(ds) {
-        var urlString = '';
-        if (_.isArray(ds.exampleURLs) && ds.exampleURLs.length > 0) {
-            for (var i = 0; i < ds.exampleURLs.length; i++) {
-                urlString += ds.exampleURLs[i] + '\n';
-            }
-        }
-        return urlString;
-    };
-
-    $scope.rangeRequestHandling = function(ds) {
-        var rrh = '';
-        if (ds.rangeRequestHandling == '0') {
-            rrh = 'Do not cache range requests';
-        } else if (ds.rangeRequestHandling == '1') {
-            rrh = 'Background fetch';
-        } else if (ds.rangeRequestHandling == '2') {
-            rrh = 'Cache range requests';
-        }
-        return rrh;
-    };
-
-};
-
-DSConfigEditController.$inject = ['deliveryService', '$scope', '$uibModalInstance'];
-module.exports = DSConfigEditController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/deliveryService/config/edit/_deliveryService.config.edit.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/deliveryService/config/edit/_deliveryService.config.edit.scss b/traffic_portal/app/src/common/modules/deliveryService/config/edit/_deliveryService.config.edit.scss
deleted file mode 100644
index 26796c4..0000000
--- a/traffic_portal/app/src/common/modules/deliveryService/config/edit/_deliveryService.config.edit.scss
+++ /dev/null
@@ -1,36 +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.
-
-*/
-
-#dsConfigForm {
-  padding: 0 20px;
-
-  .settings-row {
-    padding: 10px 0 0 0;
-    margin: 0 0 10px 0;
-
-    .settings-col {
-      text-align: center;
-    }
-
-  }
-
-}
-
-.ds-config-modal {
-  // not used yet but you can throw a class on a modal if needed
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/deliveryService/config/edit/deliveryService.config.edit.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/deliveryService/config/edit/deliveryService.config.edit.tpl.html b/traffic_portal/app/src/common/modules/deliveryService/config/edit/deliveryService.config.edit.tpl.html
deleted file mode 100644
index 0b92e5e..0000000
--- a/traffic_portal/app/src/common/modules/deliveryService/config/edit/deliveryService.config.edit.tpl.html
+++ /dev/null
@@ -1,126 +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="modal-header">
-    <button type="button" class="close" ng-click="close()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-    <h3 class="modal-title">{{deliveryService.displayName}} ({{deliveryService.id}} | {{deliveryService.xmlId}})</h3>
-</div>
-<div class="modal-body">
-    <form id="dsConfigForm" name="dsConfigForm" role="form" novalidate>
-        <div class="row settings-row">
-            <div class="settings-col col-sm-4 col-md-4">
-                <div class="form-group">
-                    <input type="checkbox" ng-disabled="true" ng-model="deliveryService.active">  <strong>Active</strong>
-                </div>
-            </div>
-            <div class="settings-col col-sm-4 col-md-4">
-                <div class="form-group">
-                    <input type="checkbox" ng-disabled="true" ng-model="deliveryService.ipv6RoutingEnabled">  <strong>IPv6 Routing Enabled</strong>
-                </div>
-            </div>
-            <div class="settings-col col-sm-4 col-md-4">
-                <div class="form-group">
-                    <input type="checkbox" ng-disabled="true" ng-model="deliveryService.signed">  <strong>Signed URLs</strong>
-                </div>
-            </div>
-        </div>
-        <hr>
-        <div class="row">
-            <div class="col-sm-6 col-md-6">
-                <div class="form-group">
-                    <label class="control-label" for="orgServerFqdn">Origin FQDN:</label>
-                    <input id="orgServerFqdn" name="orgServerFqdn" type="text" class="form-control" ng-model="deliveryService.orgServerFqdn" readonly>
-                </div>
-                <div class="form-group">
-                    <label class="control-label" for="checkPath">Origin health check:</label>
-                    <input id="checkPath" name="checkPath" type="text" class="form-control" ng-model="deliveryService.checkPath" readonly>
-                </div>
-                <div class="form-group">
-                    <label class="control-label" for="edgeFQDNs">Edge FQDNs:</label>
-                    <textarea id="edgeFQDNs" name="edgeFQDNs" rows="4" cols="17" class="form-control" readonly>{{edgeFQDNs(deliveryService)}}</textarea>
-                </div>
-                <div class="form-group">
-                    <label class="control-label" for="edgeHeaderRewrite">Edge header rewrite rules:</label>
-                    <input id="edgeHeaderRewrite" name="edgeHeaderRewrite" type="text" class="form-control" ng-model="deliveryService.edgeHeaderRewrite" readonly>
-                </div>
-                <div class="form-group">
-                    <label class="control-label" for="midHeaderRewrite">Mid header rewrite rules:</label>
-                    <input id="midHeaderRewrite" name="midHeaderRewrite" type="text" class="form-control" ng-model="deliveryService.midHeaderRewrite" readonly>
-                </div>
-                <div class="form-group">
-                    <label class="control-label" for="regexRemap">Regex remap expression:</label>
-                    <input id="regexRemap" name="regexRemap" type="text" class="form-control" ng-model="deliveryService.regexRemap" readonly>
-                </div>
-            </div>
-            <div class="col-sm-6 col-md-6">
-                <div class="form-group">
-                    <label class="control-label" for="type">Content Routing Type:</label>
-                    <input id="type" name="type" type="text" class="form-control" ng-model="deliveryService.type" readonly>
-                </div>
-                <div class="form-group" ng-show="isHTTP(deliveryService)">
-                    <label class="control-label" for="httpBypassFqdn">HTTP Bypass FQDN:</label>
-                    <input id="httpBypassFqdn" name="httpBypassFqdn" type="text" class="form-control" ng-model="deliveryService.httpBypassFqdn" readonly>
-                </div>
-                <div class="form-group" ng-show="!isHTTP(deliveryService)">
-                    <label class="control-label" for="dnsBypassIp">DNS Bypass IP:</label>
-                    <input id="dnsBypassIp" name="dnsBypassIp" type="text" class="form-control" ng-model="deliveryService.dnsBypassIp" readonly>
-                </div>
-                <div class="form-group" ng-show="!isHTTP(deliveryService)">
-                    <label class="control-label" for="dnsBypassIp6">DNS Bypass IPv6:</label>
-                    <input id="dnsBypassIp6" name="dnsBypassIp6" type="text" class="form-control" ng-model="deliveryService.dnsBypassIp6" readonly>
-                </div>
-                <div class="form-group" ng-show="!isHTTP(deliveryService)">
-                    <label class="control-label" for="dnsBypassTtl">DNS Bypass TTL:</label>
-                    <input id="dnsBypassTtl" name="dnsBypassTtl" type="text" class="form-control" ng-model="deliveryService.dnsBypassTtl" readonly>
-                </div>
-                <div class="form-group" style="margin-top: 20px;" ng-show="!isHTTP(deliveryService)">
-                    <label class="control-label" for="maxDnsAnswers">Max DNS Answers:</label>
-                    <input id="maxDnsAnswers" name="maxDnsAnswers" type="text" class="form-control" ng-model="deliveryService.maxDnsAnswers" readonly>
-                </div>
-                <div class="row">
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="globalMaxMbps">Global Max Mbps:</label>
-                            <input id="globalMaxMbps" name="globalMaxMbps" type="text" class="form-control" ng-model="deliveryService.globalMaxMbps" readonly>
-                        </div>
-                    </div>
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="globalMaxMbps">Global Max Tps:</label>
-                            <input id="globalMaxTps" name="globalMaxTps" type="text" class="form-control" ng-model="deliveryService.globalMaxTps" readonly>
-                        </div>
-                    </div>
-                </div>
-                <div class="form-group">
-                    <label class="control-label" for="rangeRequestHandling">Range Request Handling:</label>
-                    <input id="rangeRequestHandling" name="rangeRequestHandling" type="text" class="form-control" value="{{rangeRequestHandling(deliveryService)}}" readonly>
-                </div>
-            </div>
-        </div>
-        <div class="row">
-            <div class="col-sm-12 col-md-12">
-                <div class="form-group">
-                    <label class="control-label" for="longDesc">Long Description:</label>
-                    <textarea id="longDesc" name="longDesc" rows="5" cols="17" class="form-control" ng-model="deliveryService.longDesc" readonly></textarea>
-                </div>
-            </div>
-        </div>
-    </form>
-</div>
-<div class="modal-footer">
-    <button class="btn action-btn" ng-click="close()">Close</button>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/deliveryService/config/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/deliveryService/config/edit/index.js b/traffic_portal/app/src/common/modules/deliveryService/config/edit/index.js
deleted file mode 100644
index b6f67f6..0000000
--- a/traffic_portal/app/src/common/modules/deliveryService/config/edit/index.js
+++ /dev/null
@@ -1,19 +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.config.edit', [])
-    .controller('DSConfigEditController', require('./DSConfigEditController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/confirm/DialogConfirmController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/confirm/DialogConfirmController.js b/traffic_portal/app/src/common/modules/dialog/confirm/DialogConfirmController.js
index 09aef67..c936647 100644
--- a/traffic_portal/app/src/common/modules/dialog/confirm/DialogConfirmController.js
+++ b/traffic_portal/app/src/common/modules/dialog/confirm/DialogConfirmController.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.
  */
 
 var DialogConfirmController = function(params, $scope, $uibModalInstance) {

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/confirm/_dialog.confirm.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/confirm/_dialog.confirm.scss b/traffic_portal/app/src/common/modules/dialog/confirm/_dialog.confirm.scss
index fff23b4..d57b9c6 100644
--- a/traffic_portal/app/src/common/modules/dialog/confirm/_dialog.confirm.scss
+++ b/traffic_portal/app/src/common/modules/dialog/confirm/_dialog.confirm.scss
@@ -14,4 +14,3 @@
  limitations under the License.
 
 */
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/confirm/dialog.confirm.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/confirm/dialog.confirm.tpl.html b/traffic_portal/app/src/common/modules/dialog/confirm/dialog.confirm.tpl.html
index 8fad17f..235cbb3 100644
--- a/traffic_portal/app/src/common/modules/dialog/confirm/dialog.confirm.tpl.html
+++ b/traffic_portal/app/src/common/modules/dialog/confirm/dialog.confirm.tpl.html
@@ -1,27 +1,30 @@
 <!--
+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 class="modal-header">
-    <h4 class="modal-title">{{params.title}}</h4>
+    <button type="button" class="close" ng-click="no()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+    <h4 class="modal-title">{{::params.title}}</h4>
 </div>
 <div class="modal-body">
-    <p>{{params.message}}</p>
+    <p>{{::params.message}}</p>
 </div>
 <div class="modal-footer">
     <button class="btn action-btn" ng-click="no()">No</button>
     <button class="btn btn-link" ng-click="yes()">Yes</button>
-</div>
\ No newline at end of file
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/confirm/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/confirm/index.js b/traffic_portal/app/src/common/modules/dialog/confirm/index.js
index f824c8f..d500733 100644
--- a/traffic_portal/app/src/common/modules/dialog/confirm/index.js
+++ b/traffic_portal/app/src/common/modules/dialog/confirm/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.dialog.confirm', [])

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/delete/DialogDeleteController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/delete/DialogDeleteController.js b/traffic_portal/app/src/common/modules/dialog/delete/DialogDeleteController.js
new file mode 100644
index 0000000..f3633cd
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/dialog/delete/DialogDeleteController.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.
+ */
+
+var DialogDeleteController = function(params, $scope, $uibModalInstance) {
+
+    $scope.params = params;
+
+    $scope.delete = function() {
+        $uibModalInstance.close();
+    };
+
+    $scope.cancel = function () {
+        $uibModalInstance.dismiss('cancel');
+    };
+
+};
+
+DialogDeleteController.$inject = ['params', '$scope', '$uibModalInstance'];
+module.exports = DialogDeleteController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/delete/dialog.delete.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/delete/dialog.delete.tpl.html b/traffic_portal/app/src/common/modules/dialog/delete/dialog.delete.tpl.html
new file mode 100644
index 0000000..852d724
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/dialog/delete/dialog.delete.tpl.html
@@ -0,0 +1,32 @@
+<!--
+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="modal-header">
+    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Cancel</span></button>
+    <h4 class="modal-title">{{::params.title}}</h4>
+</div>
+<div class="modal-body">
+    <form name="deleteForm" novalidate>
+        <p>This action CANNOT be undone. This will permanently delete '{{::params.key}}'. Please type in '{{::params.key}}' to confirm deletion.</p>
+        <input type="text" class="form-control" ng-model="confirmKey" match="params.key" required>
+    </form>
+</div>
+<div class="modal-footer">
+    <button type="button" class="btn btn-danger" ng-disabled="deleteForm.$pristine || deleteForm.$invalid" ng-click="delete()">Delete Permanently</button>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/delete/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/delete/index.js b/traffic_portal/app/src/common/modules/dialog/delete/index.js
new file mode 100644
index 0000000..4a35c29
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/dialog/delete/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.dialog.delete', [])
+    .controller('DialogDeleteController', require('./DialogDeleteController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/reset/DialogResetController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/reset/DialogResetController.js b/traffic_portal/app/src/common/modules/dialog/reset/DialogResetController.js
index 271345f..2b0c6c7 100644
--- a/traffic_portal/app/src/common/modules/dialog/reset/DialogResetController.js
+++ b/traffic_portal/app/src/common/modules/dialog/reset/DialogResetController.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.
  */
 
-var DialogResetController = function($scope, $uibModalInstance, formUtils) {
+var DialogResetController = function($scope, $uibModalInstance) {
 
     $scope.userData = {
         email: ""
@@ -29,11 +31,15 @@ var DialogResetController = function($scope, $uibModalInstance, formUtils) {
         $uibModalInstance.dismiss('cancel');
     };
 
-    $scope.hasError = formUtils.hasError;
+    $scope.hasError = function(input) {
+        return !input.$focused && input.$dirty && input.$invalid;
+    };
 
-    $scope.hasPropertyError = formUtils.hasPropertyError;
+    $scope.hasPropertyError = function(input, property) {
+        return !input.$focused && input.$dirty && input.$error[property];
+    };
 
 };
 
-DialogResetController.$inject = ['$scope', '$uibModalInstance', 'formUtils'];
+DialogResetController.$inject = ['$scope', '$uibModalInstance'];
 module.exports = DialogResetController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/reset/_dialog.reset.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/reset/_dialog.reset.scss b/traffic_portal/app/src/common/modules/dialog/reset/_dialog.reset.scss
index fff23b4..d57b9c6 100644
--- a/traffic_portal/app/src/common/modules/dialog/reset/_dialog.reset.scss
+++ b/traffic_portal/app/src/common/modules/dialog/reset/_dialog.reset.scss
@@ -14,4 +14,3 @@
  limitations under the License.
 
 */
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/reset/dialog.reset.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/reset/dialog.reset.tpl.html b/traffic_portal/app/src/common/modules/dialog/reset/dialog.reset.tpl.html
index 852131d..dd541f7 100644
--- a/traffic_portal/app/src/common/modules/dialog/reset/dialog.reset.tpl.html
+++ b/traffic_portal/app/src/common/modules/dialog/reset/dialog.reset.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 class="modal-header">
@@ -33,6 +35,6 @@ limitations under the License.
     </form>
 </div>
 <div class="modal-footer">
-    <button class="btn btn-link" ng-click="cancel()">Cancel</button>
-    <button class="btn action-btn" ng-disabled="resetPasswordForm.$pristine || resetPasswordForm.$invalid" ng-click="reset(userData.email)">Reset</button>
-</div>
\ No newline at end of file
+    <button class="btn btn-default" ng-click="cancel()">Cancel</button>
+    <button class="btn btn-primary" ng-disabled="resetPasswordForm.$pristine || resetPasswordForm.$invalid" ng-click="reset(userData.email)">Reset</button>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/reset/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/reset/index.js b/traffic_portal/app/src/common/modules/dialog/reset/index.js
index c14c8e7..d86c394 100644
--- a/traffic_portal/app/src/common/modules/dialog/reset/index.js
+++ b/traffic_portal/app/src/common/modules/dialog/reset/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.dialog.reset', [])

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/select/DialogSelectController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/select/DialogSelectController.js b/traffic_portal/app/src/common/modules/dialog/select/DialogSelectController.js
new file mode 100644
index 0000000..84ac0e9
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/dialog/select/DialogSelectController.js
@@ -0,0 +1,40 @@
+/*
+ * 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 DialogSelectController = function(params, collection, $scope, $uibModalInstance) {
+
+	$scope.params = params;
+
+	$scope.collection = collection;
+
+	$scope.selectedItemId = null;
+
+	$scope.select = function() {
+		var selectedItem = _.find(collection, function(item){ return parseInt(item.id) == parseInt($scope.selectedItemId) });
+		$uibModalInstance.close(selectedItem);
+	};
+
+	$scope.cancel = function () {
+		$uibModalInstance.dismiss('cancel');
+	};
+
+};
+
+DialogSelectController.$inject = ['params', 'collection', '$scope', '$uibModalInstance'];
+module.exports = DialogSelectController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/select/dialog.select.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/select/dialog.select.tpl.html b/traffic_portal/app/src/common/modules/dialog/select/dialog.select.tpl.html
new file mode 100644
index 0000000..568935d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/dialog/select/dialog.select.tpl.html
@@ -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.
+-->
+
+<div class="modal-header">
+    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+    <h4 class="modal-title">{{::params.title}}</h4>
+</div>
+<div class="modal-body">
+    <p>{{::params.message}}</p>
+    <form name="selectForm" novalidate>
+        <select id="cdn" name="cdn" class="form-control" ng-model="selectedItemId" ng-options="item.id as item.name for item in collection" required>
+            <option value="">Select...</option>
+        </select>
+    </form>
+</div>
+<div class="modal-footer">
+    <button class="btn btn-link" ng-click="cancel()">Cancel</button>
+    <button class="btn btn-primary" ng-disabled="selectForm.$invalid" ng-click="select()">Submit</button>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/select/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/select/index.js b/traffic_portal/app/src/common/modules/dialog/select/index.js
new file mode 100644
index 0000000..56480ac
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/dialog/select/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.dialog.select', [])
+	.controller('DialogSelectController', require('./DialogSelectController'));



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/new/deliveryService.new.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/new/deliveryService.new.tpl.html b/traffic_portal/app/src/modules/private/deliveryService/new/deliveryService.new.tpl.html
deleted file mode 100644
index 9003ee3..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/new/deliveryService.new.tpl.html
+++ /dev/null
@@ -1,601 +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="dsWizardContainer">
-    <div>
-        <ol class="breadcrumb">
-            <li><a ng-click="navigateToDashboard()">Dashboard</a></li>
-            <li class="active">New Delivery Service</li>
-        </ol>
-    </div>
-    <div class="row">
-        <div class="col-lg-3 col-md-12 col-sm-12">
-            <ul class="nav nav-pills nav-stacked">
-                <li class="header">New Delivery Service</li>
-                <li>
-                    <a ng-class="{'selected-step': openTab == 'service-desc-tab'}" ng-click="jumpToTab('service-desc-tab', 'serviceDescStarted')">
-                        <i class="fa fa-check fa-fw" ng-show="serviceDescStarted && !serviceDescForm.$invalid"></i> Service Description
-                    </a>
-                </li>
-                <li>
-                    <a ng-class="{'selected-step': openTab == 'traffic-tab'}" ng-click="jumpToTab('traffic-tab', 'trafficStarted')">
-                        <i class="fa fa-check fa-fw" ng-show="trafficStarted && !trafficForm.$invalid"></i> Traffic &amp; Library Estimates
-                    </a>
-                </li>
-                <li>
-                    <a ng-class="{'selected-step': openTab == 'origin-tab'}" ng-click="jumpToTab('origin-tab', 'originStarted')">
-                        <i class="fa fa-check fa-fw" ng-show="originStarted && !originForm.$invalid"></i> Origin Server &amp; Security
-                    </a>
-                </li>
-                <li>
-                    <a ng-class="{'selected-step': openTab == 'core-tab'}" ng-click="jumpToTab('core-tab', 'coreStarted')">
-                        <i class="fa fa-check fa-fw" ng-show="coreStarted && !coreForm.$invalid"></i> Core Features
-                    </a>
-                </li>
-                <li>
-                    <a ng-class="{'selected-step': openTab == 'service-limits-tab'}" ng-click="jumpToTab('service-limits-tab', 'serviceLimitStarted')">
-                        <i class="fa fa-check fa-fw" ng-show="serviceLimitStarted && !serviceLimitForm.$invalid"></i> Service Limits
-                    </a>
-                </li>
-                <li>
-                    <a ng-class="{'selected-step': openTab == 'header-tab'}" ng-click="jumpToTab('header-tab', 'headerStarted')">
-                        <i class="fa fa-check fa-fw" ng-show="headerStarted && !headerForm.$invalid"></i> Header Customization
-                    </a>
-                </li>
-                <li>
-                    <a ng-class="{'selected-step': openTab == 'notes-tab'}" ng-click="jumpToTab('notes-tab', 'notesStarted')">
-                        <i class="fa fa-check fa-fw" ng-show="notesStarted && !notesForm.$invalid"></i> Additional Notes
-                    </a>
-                </li>
-                <li>
-                    <a ng-class="{'selected-step': openTab == 'confirm-tab'}" ng-click="jumpToTab('confirm-tab', 'confirmStarted')">
-                        Confirm &amp; Submit
-                    </a>
-                </li>
-            </ul>
-        </div>
-        <div id="dsNewFormContainer" class="col-lg-9 col-med-12 col-sm-12">
-            <form name="serviceDescForm" role="form" ng-show="openTab == 'service-desc-tab'" novalidate>
-                <legend>Service Description</legend>
-                <div class="row">
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="customer">Customer&nbsp;&nbsp;<i class="customer-tooltip field-info fa fa-info-circle" popover-title="Customer" uib-popover="Name of the customer to display on the service. We use this to help determine the service ids and relation to other services." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <input id="customer" name="customer" type="text" class="form-control" ng-model="dsData.customer" ng-maxlength="50" required>
-                            <small class="input-error" ng-show="hasPropertyError(serviceDescForm.customer, 'required')">[ Required ]</small>
-                            <small class="input-error" ng-show="hasPropertyError(serviceDescForm.customer, 'maxlength')">[ Too Long ]</small>
-                        </div>
-                    </div>
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="deliveryProtocol">Delivery Protocol&nbsp;&nbsp;<i class="delivery-protocol-tooltip field-info fa fa-info-circle" popover-title="Delivery Protocol" uib-popover="Services that use &quot;HTTP and HTTPS&quot; will be able to deliver both types of traffic. If you deliver HTTPS you will not be able to use a service alias with your service." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="top" popover-append-to-body="true"></i></label>
-                            <select id="deliveryProtocol" name="deliveryProtocol" class="form-control" ng-change="onDeliveryProtocolChange()" ng-model="dsData.deliveryProtocol">
-                                <option value="http">HTTP</option>
-                                <option value="https-only">HTTPS</option>
-                                <option value="http-and-https">HTTP and HTTPS</option>
-                                <option value="http-to-https">HTTP to HTTPS</option>
-                            </select>
-                        </div>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="contentType">Content Type&nbsp;&nbsp;<i class="content-type-tooltip field-info fa fa-info-circle" popover-title="Content Type" uib-popover="This choice should reflect the primary content of the service. Services may deliver more than one type of content." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <select id="contentType" name="contentType" class="form-control" ng-model="dsData.contentType">
-                                <option value="video-on-demand">Video - On Demand</option>
-                                <option value="video-live">Video - Live</option>
-                                <option value="web-content-file-download">Web Content / File Download</option>
-                            </select>
-                        </div>
-                    </div>
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="routingType">Routing Type&nbsp;&nbsp;<i class="routing-type-tooltip field-info fa fa-info-circle" popover-title="Routing Type" uib-popover="DNS is the standard routing type for most CDN services. HTTP Redirect is a specialty routing service that is primarily used for video and large file downloads where localization and latency are significant concerns." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="top" popover-append-to-body="true"></i></label>
-                            <select id="routingType" name="routingType" class="form-control" ng-disabled="dsData.deliveryProtocol == 'http-to-https'" ng-change="onRoutingTypeChange()" ng-model="dsData.routingType">
-                                <option value="dns">DNS</option>
-                                <option value="http">HTTP Redirect</option>
-                            </select>
-                            <small class="input-error" ng-show="dsData.deliveryProtocol == 'http-to-https'">HTTP required for HTTP to HTTPS delivery protocol</small>
-                        </div>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-sm-12 col-md-12">
-                        <div class="form-group">
-                            <label class="control-label" for="serviceDesc">Service Description&nbsp;&nbsp;<i class="service-desc-tooltip field-info fa fa-info-circle" popover-title="Service Description" uib-popover="This description will be used to help name your service and differentiate it from your other services." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <textarea id="serviceDesc" name="serviceDesc" rows="3" class="form-control" ng-model="dsData.serviceDesc" ng-maxlength="400" required></textarea>
-                            <small class="input-error" ng-show="hasPropertyError(serviceDescForm.serviceDesc, 'required')">[ Required ]</small>
-                            <small class="input-error" ng-show="hasPropertyError(serviceDescForm.serviceDesc, 'maxlength')">[ Too Long ]</small>
-                        </div>
-                    </div>
-                </div>
-                <hr>
-                <div class="pull-right">
-                    <button type="button" class="btn action-btn" ng-disabled="serviceDescForm.$invalid" ng-click="jumpToTab('traffic-tab', 'trafficStarted')">Next</button>
-                </div>
-            </form>
-            <form name="trafficForm" role="form" ng-show="openTab == 'traffic-tab'" novalidate>
-                <legend>Traffic &amp; Library Estimates</legend>
-                <div class="row">
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="peakBpsEstimate">Peak Bandwidth Estimate&nbsp;&nbsp;<i class="peakBpsEstimate-tooltip field-info fa fa-info-circle" popover-title="Peak Bandwidth Estimate" uib-popover="Service size estimates help us manage cache efficiency and plan for capacity for new build services. Sizing should be estimated for short term expectations. We actively monitor service growth over time and adjust configuration settings as needed." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <select id="peakBpsEstimate" name="peakBpsEstimate" class="form-control" ng-model="dsData.peakBPSEstimate">
-                                <option value="less-than-5-Gbps">Less than 5 Gbps</option>
-                                <option value="5-to-50-Gbps">5 to 50 Gbps</option>
-                                <option value="gt-50-Gbps">Greater than 50 Gbps</option>
-                            </select>
-                        </div>
-                    </div>
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="maxLibrarySizeEstimate">Max Library Size Estimate&nbsp;&nbsp;<i class="maxLibrarySizeEstimate-tooltip field-info fa fa-info-circle" popover-title="Max Library Size Estimate" uib-popover="Service size estimates help us manage cache efficiency and plan for capacity for new build services. Sizing should be estimated for short term expectations. We actively monitor service growth over time and adjust configuration settings as needed." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="top" popover-append-to-body="true"></i></label>
-                            <select id="maxLibrarySizeEstimate" name="maxLibrarySizeEstimate" class="form-control" ng-model="dsData.maxLibrarySizeEstimate">
-                                <option value="less-than-200-GB">Less than 200 GB</option>
-                                <option value="200-GB-to-2-TB">200 GB to 2 TB</option>
-                                <option value="greater-than-2-TB">Greater than 2 TB</option>
-                            </select>
-                        </div>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="peakTpsEstimate">Peak Transactions/Second Estimate&nbsp;&nbsp;<i class="peakTpsEstimate-tooltip field-info fa fa-info-circle" popover-title="Peak Transactions/Second Estimate" uib-popover="Service size estimates help us manage cache efficiency and plan for capacity for new build services. Sizing should be estimated for short term expectations. We actively monitor service growth over time and adjust configuration settings as needed." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <select id="peakTpsEstimate" name="peakTpsEstimate" class="form-control" ng-model="dsData.peakTPSEstimate">
-                                <option value="less-than-1000-TPS">Less than 1,000 TPS</option>
-                                <option value="1000-to-5000-TPS">1,000 to 5,000 TPS</option>
-                                <option value="greater-than-5000-TPS">Greater than 5,000 TPS</option>
-                            </select>
-                        </div>
-                    </div>
-                </div>
-                <hr>
-                <div class="pull-right">
-                    <button type="button" class="btn btn-link" ng-click="jumpToTab('service-desc-tab', 'serviceDescStarted')">Back</button>
-                    <button type="button" class="btn action-btn" ng-disabled="trafficForm.$invalid" ng-click="jumpToTab('origin-tab', 'originStarted')">Next</button>
-                </div>
-            </form>
-            <form name="originForm" role="form" ng-show="openTab == 'origin-tab'" novalidate>
-                <fieldset>
-                    <div class="col-sm-6 col-md-6">
-                        <legend>Origin Server</legend>
-                        <div class="form-group">
-                            <label class="control-label" for="originUrl">Origin Server URL&nbsp;&nbsp;<i class="originUrl-tooltip field-info fa fa-info-circle" popover-title="Origin Server URL" uib-popover="The URL path to the origin server including http://" popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <input id="originUrl" name="originUrl" type="text" placeholder="http://" class="form-control" ng-model="dsData.originURL" ng-maxlength="2000" ng-pattern="/^(https?:\/\/)/" required>
-                            <small class="input-error" ng-show="hasPropertyError(originForm.originUrl, 'required')">[ Required ]</small>
-                            <small class="input-error" ng-show="hasPropertyError(originForm.originUrl, 'pattern')">[ Must start with http:// or https:// ]</small>
-                            <small class="input-error" ng-show="hasPropertyError(originForm.originUrl, 'maxlength')">[ Too Long ]</small>
-                        </div>
-                        <div class="form-group">
-                            <label class="control-label" for="originDynamicRemap">Origin Dynamic Remap&nbsp;&nbsp;<i class="originDynamicRemap-tooltip field-info fa fa-info-circle" popover-title="Origin Dynamic Remap" uib-popover="This is a feature which allows services to use multiple origin URLs for the same service. This is done by passing an origin URL value as a part of each request (ex query string). Most customers will not require this feature. If you select &quot;Yes&quot; for this feature, we will contact you to discuss the details." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <select id="originDynamicRemap" name="originDynamicRemap" class="form-control" ng-model="dsData.hasOriginDynamicRemap" ng-options="boolean.value as boolean.label for boolean in booleans"></select>
-                        </div>
-                        <div class="form-group">
-                            <label class="control-label" for="originTestFile">Origin Test File&nbsp;&nbsp;<i class="originTestFile-tooltip field-info fa fa-info-circle" popover-title="Origin Test File" uib-popover="A URL path to a test file available on the origin server. This is used to verify that service is setup correctly. crossdomain.xml and clientaccesspolicy.xml are two examples of common files available on the origin." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <input id="originTestFile" name="originTestFile" type="text" placeholder="http://" class="form-control" ng-model="dsData.originTestFile" ng-maxlength="2000" ng-pattern="/^(https?:\/\/)/" required>
-                            <small class="input-error" ng-show="hasPropertyError(originForm.originTestFile, 'required')">[ Required ]</small>
-                            <small class="input-error" ng-show="hasPropertyError(originForm.originTestFile, 'pattern')">[ Must start with http:// or https:// ]</small>
-                            <small class="input-error" ng-show="hasPropertyError(originForm.originTestFile, 'maxlength')">[ Too Long ]</small>
-                        </div>
-                    </div>
-                    <div class="col-sm-6 col-md-6">
-                        <legend>Origin Security</legend>
-                        <div class="form-group">
-                            <label class="control-label" for="originAclWhitelist">ACL/Whitelist to Access Origin&nbsp;&nbsp;<i class="originAclWhitelist-tooltip field-info fa fa-info-circle" popover-title="ACL/Whitelist to Access Origin" uib-popover="Do you restrict access to your origin using an access control list (ACL or whitelist) of IPs?" popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="left" popover-append-to-body="true"></i></label>
-                            <select id="originAclWhitelist" name="originAclWhitelist" class="form-control" ng-model="dsData.hasOriginACLWhitelist" ng-options="boolean.value as boolean.label for boolean in booleans"></select>
-                        </div>
-                        <div class="form-group">
-                            <label class="control-label" for="originHeaders">Header to Access Origin (optional)&nbsp;&nbsp;<i class="originHeaders-tooltip field-info fa fa-info-circle" popover-title="Header to Access Origin" uib-popover="Do you require a header to be passed in requests to your origin? If you do, please provide the value of this header." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="top" popover-append-to-body="true"></i></label>
-                            <input id="originHeaders" name="originHeaders" type="text" class="form-control" ng-model="dsData.originHeaders" ng-maxlength="500">
-                            <small class="input-error" ng-show="hasPropertyError(originForm.originHeaders, 'maxlength')">[ Too Long ]</small>
-                        </div>
-                        <div class="form-group">
-                            <label class="control-label" for="otherOriginSecurity">Other Origin Security Measures (optional)&nbsp;&nbsp;<i class="otherOriginSecurity-tooltip field-info fa fa-info-circle" popover-title="Other Origin Security Measures" uib-popover="Do you have other origin security measures that need to be considered for access? Please describe." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="top" popover-append-to-body="true"></i></label>
-                            <input id="otherOriginSecurity" name="otherOriginSecurity" type="text" class="form-control" ng-model="dsData.otherOriginSecurity" ng-maxlength="500">
-                            <small class="input-error" ng-show="hasPropertyError(originForm.otherOriginSecurity, 'maxlength')">[ Too Long ]</small>
-                        </div>
-                    </div>
-                </fieldset>
-                <hr>
-                <div class="pull-right">
-                    <button type="button" class="btn btn-link" ng-click="jumpToTab('traffic-tab', 'trafficStarted')">Back</button>
-                    <button type="button" class="btn action-btn" ng-disabled="originForm.$invalid" ng-click="jumpToTab('core-tab', 'coreStarted')">Next</button>
-                </div>
-            </form>
-            <form name="coreForm" role="form" ng-show="openTab == 'core-tab'" novalidate>
-                <legend>Core Features</legend>
-                <div class="row">
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="queryStringHandling">Query String Handling&nbsp;&nbsp;<i class="queryStringHandling-tooltip field-info fa fa-info-circle" popover-title="Query String Handling" uib-popover-template="templates.queryStringHandling" popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-big" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <select id="queryStringHandling" name="queryStringHandling" class="form-control" ng-model="dsData.queryStringHandling">
-                                <option value="use-in-cache-key-and-pass-up">Use in Cache Key, and Pass Up</option>
-                                <option value="ignore-in-cache-key-and-pass-up">Ignore in Cache Key, and Pass Up</option>
-                                <option value="drop-at-edge">Drop at Edge</option>
-                            </select>
-                        </div>
-                    </div>
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="signedURLs">Signed URLs / URL Tokenization&nbsp;&nbsp;<i class="signedURLs-tooltip field-info fa fa-info-circle" popover-title="Signed URLs / URL Tokenization" uib-popover-template="templates.signedUrls" popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-popup-close-delay="1000" popover-placement="top" popover-append-to-body="true"></i></label>
-                            <select id="signedURLs" name="signedURLs" class="form-control" ng-model="dsData.hasSignedURLs" ng-options="boolean.value as boolean.label for boolean in booleans"></select>
-                        </div>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="rangeRequestHandling">Range Request Handling&nbsp;&nbsp;<i class="rangeRequestHandling-tooltip field-info fa fa-info-circle" popover-title="Range Request Handling" uib-popover-template="templates.rangeRequestHandling" popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-big" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <select id="rangeRequestHandling" name="rangeRequestHandling" class="form-control" ng-model="dsData.rangeRequestHandling">
-                                <option value="range-requests-not-used">Range Requests Not Used</option>
-                                <option value="consistent-non-overlapping-range-requests-used">Consistent, Non-Overlapping Range Requests Used</option>
-                                <option value="variable-overlapping-range-requests-used">Variable, Overlapping Range Requests Used</option>
-                            </select>
-                        </div>
-                    </div>
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="negativeCachingCustomization">Negative Caching Customization&nbsp;&nbsp;<i class="negativeCachingCustomization-tooltip field-info fa fa-info-circle" popover-title="Negative Caching Customization" uib-popover="For failed CDN responses like 404 or 502, the CDN will cache the response and reserve it for 1 second to prevent the customer origin from being overloaded with retries. This behavior can be customized but most customers keep the standard parameters." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="top" popover-append-to-body="true"></i></label>
-                            <select id="negativeCachingCustomization" name="negativeCachingCustomization" class="form-control" ng-change="onNegativeCachingCustomizationChange()" ng-model="dsData.hasNegativeCachingCustomization" ng-options="boolean.value as boolean.label for boolean in booleans"></select>
-                        </div>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-sm-6 col-md-6">
-                        <div class="row" ng-repeat="alias in dsData.serviceAliases track by $index">
-                            <div class="col-sm-12 col-md-12">
-                                <ng-form name="aliasForm">
-                                    <div class="form-group">
-                                        <div class="input-group alias-inputs">
-                                            <label class="control-label" for="serviceAlias">Service Alias #{{$index + 1}} (optional)&nbsp;&nbsp;<i class="serviceAlias-tooltip field-info fa fa-info-circle" popover-title="Service Alias" uib-popover="Do you have other service aliases which will be used for this service? We need to know these aliases so that we know where to direct these requests. You can add multiple aliases." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="right" popover-append-to-body="true"></i></label>
-                                            <input id="serviceAlias" name="serviceAlias" type="text" placeholder="http://" class="form-control" ng-model="dsData.serviceAliases[$index]" ng-pattern="/^(https?:\/\/)/" ng-maxlength="2000">
-                                            <span class="form-input-group-btn input-group-btn">
-                                                <button id="removeBtn" name="removeBtn" class="btn btn-default" ng-show="$index > 0" ng-click="removeAlias($index)"><i class="fa fa-minus"></i></button>
-                                                <button id="addBtn" name="addBtn" class="btn btn-default" ng-show="$index == (dsData.serviceAliases.length - 1)" ng-click="addAlias()"><i class="fa fa-plus"></i></button>
-                                            </span>
-                                        </div>
-                                        <small class="input-error" ng-show="hasPropertyError(aliasForm.serviceAlias, 'pattern')">[ Must start with http:// or https:// ]</small>
-                                        <small class="input-error" ng-show="hasPropertyError(aliasForm.serviceAlias, 'maxlength')">[ Too Long ]</small>
-                                    </div>
-                                </ng-form>
-                            </div>
-                        </div>
-                    </div>
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group" ng-show="dsData.hasNegativeCachingCustomization == true">
-                            <label class="control-label" for="negativeCachingCustomizationNote">Negative Caching Instructions&nbsp;&nbsp;<i class="negativeCachingCustomizationNote-tooltip field-info fa fa-info-circle" popover-title="Negative Caching Instructions" uib-popover="Please enter any specific instructions you have regarding negative caching customization." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="top" popover-append-to-body="true"></i></label>
-                            <textarea id="negativeCachingCustomizationNote" name="negativeCachingCustomizationNote" rows="3" class="form-control" ng-model="dsData.negativeCachingCustomizationNote" ng-required="dsData.hasNegativeCachingCustomization == true" ng-maxlength="400"></textarea>
-                            <small class="input-error" ng-show="hasPropertyError(coreForm.negativeCachingCustomizationNote, 'required')">[ Required ]</small>
-                            <small class="input-error" ng-show="hasPropertyError(coreForm.negativeCachingCustomizationNote, 'maxlength')">[ Too Long ]</small>
-                        </div>
-                    </div>
-                </div>
-                <hr>
-                <div class="pull-right">
-                    <button type="button" class="btn btn-link" ng-click="jumpToTab('origin-tab', 'originStarted')">Back</button>
-                    <button type="button" class="btn action-btn" ng-disabled="coreForm.$invalid" ng-click="jumpToTab('service-limits-tab', 'serviceLimitStarted')">Next</button>
-                </div>
-            </form>
-            <form name="serviceLimitsForm" role="form" ng-show="openTab == 'service-limits-tab'" novalidate>
-                <legend>Service Limits</legend>
-                <div class="row">
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="rateLimitingGbps">Rate Limiting - Bandwidth (Gbps) (optional)&nbsp;&nbsp;<i class="rateLimitingGbps-tooltip field-info fa fa-info-circle" popover-title="Rate Limiting - Bandwidth (Gbps)" uib-popover="If a service limit is selected, then you must provide an overflow point where the CDN will send the excess traffic. This overflow point is typically a another CDN service or a customer origin. The overflow can be provided as an FQDN (http://customername.com) or as an IPv4 or IPv6 address (10.10.10.10). When the service exceeds the threshold set, the CDN will redirect all excess traffic to the overflow point." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <input id="rateLimitingGbps" name="rateLimitingGbps" type="number" class="form-control" min="0" ng-change="onRateLimitingChange()" ng-model="dsData.rateLimitingGBPS">
-                            <small class="input-error" ng-show="hasPropertyError(serviceLimitsForm.rateLimitingGbps, 'min')">[ Invalid ]</small>
-                        </div>
-                    </div>
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="rateLimitingTPS">Rate Limiting - Transactions/Second (optional)&nbsp;&nbsp;<i class="rateLimitingTPS-tooltip field-info fa fa-info-circle" popover-title="Rate Limiting - Transactions/Second" uib-popover="If a service limit is selected, then you must provide an overflow point where the CDN will send the excess traffic. This overflow point is typically a another CDN service or a customer origin. The overflow can be provided as an FQDN (http://customername.com) or as an IPv4 or IPv6 address (10.10.10.10). When the service exceeds the threshold set, the CDN will redirect all excess traffic to the overflow point." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="bottom" popover-append-to-body="true"></i></label>
-                            <input id="rateLimitingTPS" name="rateLimitingTPS" type="number" class="form-control" min="0" ng-change="onRateLimitingChange()" ng-model="dsData.rateLimitingTPS">
-                            <small class="input-error" ng-show="hasPropertyError(serviceLimitsForm.rateLimitingTPS, 'min')">[ Invalid ]</small>
-                        </div>
-                    </div>
-                </div>
-                <div class="row" ng-show="dsData.rateLimitingGBPS > 0 || dsData.rateLimitingTPS > 0">
-                    <div class="col-sm-6 col-md-6">
-                        <div class="form-group">
-                            <label class="control-label" for="overflowService">Overflow Service (IP or URL)&nbsp;&nbsp;<i class="overflowService-tooltip field-info fa fa-info-circle" popover-title="Overflow Service (IP or URL)" uib-popover="This overflow point is typically a another CDN service or a customer origin. The overflow can be provided as an FQDN (http://customername.com) or as an IPv4 or IPv6 address (10.10.10.10). When the service exceeds the threshold set, the CDN will redirect all excess traffic to the overflow point." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <input id="overflowService" name="overflowService" type="text" class="form-control" ng-required="dsData.rateLimitingGBPS > 0 || dsData.rateLimitingTPS > 0" ng-model="dsData.overflowService">
-                        </div>
-                    </div>
-                </div>
-                <hr>
-                <div class="pull-right">
-                    <button type="button" class="btn btn-link" ng-click="jumpToTab('core-tab', 'coreStarted')">Back</button>
-                    <button type="button" class="btn action-btn" ng-disabled="serviceLimitsForm.$invalid" ng-click="jumpToTab('header-tab', 'headerStarted')">Next</button>
-                </div>
-            </form>
-            <form name="headerForm" role="form" ng-show="openTab == 'header-tab'" novalidate>
-                <legend>Header Customization</legend>
-                <div class="row">
-                    <div class="col-sm-12 col-md-12">
-                        <div class="form-group">
-                            <label class="control-label" for="headerRewriteEdge">Header Rewrite - Edge Tier (optional)&nbsp;&nbsp;<i class="headerRewriteEdge-tooltip field-info fa fa-info-circle" popover-title="Header Rewrite - Edge Tier" uib-popover-template="templates.headerRewriteEdge" popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-big" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <textarea id="headerRewriteEdge" name="headerRewriteEdge" rows="3" class="form-control" ng-model="dsData.headerRewriteEdge" ng-maxlength="400"></textarea>
-                            <small class="input-error" ng-show="hasPropertyError(headerForm.headerRewriteEdge, 'maxlength')">[ Too Long ]</small>
-                        </div>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-sm-12 col-md-12">
-                        <div class="form-group">
-                            <label class="control-label" for="headerRewriteMid">Header Rewrite - Mid Tier (optional)&nbsp;&nbsp;<i class="headerRewriteMid-tooltip field-info fa fa-info-circle" popover-title="Header Rewrite - Mid Tier" uib-popover-template="templates.headerRewriteMid" popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-big" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <textarea id="headerRewriteMid" name="headerRewriteMid" rows="3" class="form-control" ng-model="dsData.headerRewriteMid" ng-maxlength="400"></textarea>
-                            <small class="input-error" ng-show="hasPropertyError(headerForm.headerRewriteMid, 'maxlength')">[ Too Long ]</small>
-                        </div>
-                    </div>
-                </div>
-                <div class="row" ng-show="dsData.routingType == 'http'">
-                    <div class="col-sm-12 col-md-12">
-                        <div class="form-group">
-                            <label class="control-label" for="headerRewriteRedirectRouter">Header Rewrite - Redirect Router (optional)&nbsp;&nbsp;<i class="headerRewriteRedirectRouter-tooltip field-info fa fa-info-circle" popover-title="Header Rewrite - Redirect Router" uib-popover-template="templates.headerRewriteRedirectRouter" popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-big" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <textarea id="headerRewriteRedirectRouter" name="headerRewriteRedirectRouter" rows="3" class="form-control" ng-model="dsData.headerRewriteRedirectRouter" ng-maxlength="400"></textarea>
-                            <small class="input-error" ng-show="hasPropertyError(headerForm.headerRewriteRedirectRouter, 'maxlength')">[ Too Long ]</small>
-                        </div>
-                    </div>
-                </div>
-                <hr>
-                <div class="pull-right">
-                    <button type="button" class="btn btn-link" ng-click="jumpToTab('service-limits-tab', 'serviceLimitStarted')">Back</button>
-                    <button type="button" class="btn action-btn" ng-disabled="headerForm.$invalid" ng-click="jumpToTab('notes-tab', 'notesStarted')">Next</button>
-                </div>
-            </form>
-            <form name="notesForm" role="form" ng-show="openTab == 'notes-tab'" novalidate>
-                <legend>Additional Notes</legend>
-                <div class="row">
-                    <div class="col-sm-12 col-md-12">
-                        <div class="form-group">
-                            <label class="control-label" for="notes">Additional Notes&nbsp;&nbsp;<i class="notes-tooltip field-info fa fa-info-circle" popover-title="Additional Notes" uib-popover="Any additional instructions you would like to provide the delivery service provisioning team." popover-trigger="mouseenter" popover-class="popover-class ds-wizard-popover-small" popover-placement="right" popover-append-to-body="true"></i></label>
-                            <textarea id="notes" name="notes" rows="5" class="form-control" ng-model="dsData.notes" ng-maxlength="500"></textarea>
-                            <small class="input-error" ng-show="hasPropertyError(notesForm.notes, 'maxlength')">[ Too Long ]</small>
-                        </div>
-                    </div>
-                </div>
-                <hr>
-                <div class="pull-right">
-                    <button type="button" class="btn btn-link" ng-click="jumpToTab('header-tab', 'headerStarted')">Back</button>
-                    <button type="button" class="btn action-btn" ng-disabled="notesForm.$invalid" ng-click="jumpToTab('confirm-tab', 'confirmStarted')">Next</button>
-                </div>
-            </form>
-            <div ng-show="openTab == 'confirm-tab'">
-                <h3>Confirm &amp; Submit</h3>
-                <table class="table confirm-table">
-                    <tbody>
-                        <tr><th colspan="2"><h4 class="heading">Service Description</h4></th></tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Customer:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.customer}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Content Type:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.contentType}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Delivery Protocol:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.deliveryProtocol}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Routing Type:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.routingType}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Service Description:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.serviceDesc}}</td>
-                        </tr>
-                        <tr><th colspan="2"><h4 class="heading">Traffic &amp; Library Estimates</h4></th></tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Peak Bandwidth Estimate:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.peakBPSEstimate}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Peak Transactions Per Second Estimate:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.peakTPSEstimate}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Max Library Size Estimate:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.maxLibrarySizeEstimate}}</td>
-                        </tr>
-                        <tr><th colspan="2"><h4 class="heading">Origin Server &amp; Security</h4></th></tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Origin Server URL:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.originURL}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Origin Dynamic Remap:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.hasOriginDynamicRemap}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Origin Test File:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.originTestFile}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">ACL/Whitelist to Access Origin:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.hasOriginACLWhitelist}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Header to Access Origin:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.otherOriginSecurity}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Other Origin Security Measures:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.originHeaders}}</td>
-                        </tr>
-                        <tr><th colspan="2"><h4 class="heading">Core Features</h4></th></tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Query String Handling:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.queryStringHandling}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Range Request Handling:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.rangeRequestHandling}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Signed URLs / URL Tokenization:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.hasSignedURLs}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Negative Caching Customization:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.hasNegativeCachingCustomization}}</td>
-                        </tr>
-                        <tr ng-show="dsData.hasNegativeCachingCustomization == true">
-                            <td class="col-sm-4 col-md-4 col-lg-4">Negative Caching Instructions:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.negativeCachingCustomizationNote}}</td>
-                        </tr>
-                        <tr ng-repeat="alias in dsData.serviceAliases track by $index">
-                            <td class="col-sm-4 col-md-4 col-lg-4">Service Alias #{{$index + 1}}:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.serviceAliases[$index]}}</td>
-                        </tr>
-                        <tr><th colspan="2"><h4 class="heading">Service Limits</h4></th></tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Rate Limiting - Bandwidth (Gbps):</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.rateLimitingGBPS}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Rate Limiting - Transactions/Second:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.rateLimitingTPS}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Overflow Service (IP or URL):</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.overflowService}}</td>
-                        </tr>
-                        <tr><th colspan="2"><h4 class="heading">Header Customization</h4></th></tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Header Rewrite - Edge Tier:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.headerRewriteEdge}}</td>
-                        </tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Header Rewrite - Mid Tier:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.headerRewriteMid}}</td>
-                        </tr>
-                        <tr ng-show="dsData.routingType.indexOf('http') != -1">
-                            <td class="col-sm-4 col-md-4 col-lg-4">Header Rewrite - Redirect Router:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.headerRewriteRedirectRouter}}</td>
-                        </tr>
-                        <tr><th colspan="2"><h4 class="heading">Additional Notes</h4></th></tr>
-                        <tr>
-                            <td class="col-sm-4 col-md-4 col-lg-4">Additional Notes:</td>
-                            <td class="col-sm-8 col-md-8 col-lg-8">{{dsData.notes}}</td>
-                        </tr>
-                    </tbody>
-                </table>
-                <hr>
-                <div class="pull-right">
-                    <button type="button" class="btn btn-link" ng-click="jumpToTab('notes-tab', 'notesStarted')">Back</button>
-                    <button type="button" class="btn action-btn" ng-disabled="incomplete([serviceDescForm, trafficForm, originForm, coreForm, serviceLimitsForm, headerForm, notesForm])" ng-click="submitRequest(dsData)">Submit Request &nbsp;&nbsp;<i class="fa fa-chevron-circle-right fa-lg"></i></button>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-
-<!-- html for tooltips -->
-
-<script type="text/ng-template" id="signedUrl.html">
-    <div>
-        <p>If you select "yes" we will provide you with a script to use to sign your URLs as well as a set of 16 keys.</p>
-        <p><a href="/resources/assets/other/sign.pl" target="_blank">Perl URL Signing Script</a></p>
-        <p><a href="/resources/assets/other/sign_parameters.txt" target="_blank">Signing Script Parameters</a></p>
-    </div>
-</script>
-
-<script type="text/ng-template" id="queryStringHandling.html">
-    <div id="queryStringHandling-tooltip-content">
-        <p>When caching your content, we need to know how to handle query strings that come with the request in terms of how we cache each URL. For example if you pass a query string with a user id as a part of each request for the same file, we would need to either ignore this query string or drop it in order to cache the file properly.</p>
-        <ul>
-            <li>Use in Cache Key, and Pass Up: query string is used in cache key and passed up to the origin when fill requests are made.</li>
-            <li>Ignore in Cache Key, and Pass Up: query string is not used in cache key but it is still passed along to the origin when fill requests are made.</li>
-            <li>Drop at Edge: query string is not used in cache key and is not passed to origin when fill requests are made.</li>
-        </ul>
-    </div>
-</script>
-
-<script type="text/ng-template" id="rangeRequestHandling.html">
-    <div id="rangeRequestHandling-tooltip-content"><p>Range requests are not supported by default. One of two options must
-        be selected in order for the CDN to support range requests.</p>
-        <ul>
-            <li>Consistent, Non-Overlapping Ranges: If this is selected, each range request will be cached as a separate file.</li>
-            <li>Variable, Overlapping Ranges: If this is selected, the full object will be pulled into cache as a single file and the varying ranges will be served from the full copy.</li>
-        </ul>
-        <p>If you know you need range requests but you don’t know which type of requests are made the safer choice is Variable, Overlapping Ranges. This can always be changed later.</p>
-        <p>Consistent, Non-Overlapping Example: each client calls the same ranges (in any order) and these ranges do not overlap each other:</p>
-        <ul>
-            <li>Client 1 calls ranges: 0 to 1,000; 1,001 to 2,000; 2,001 to 2,650</li>
-            <li>Client 2 calls ranges: 2,001 to 2,650; 1,001 to 2000; 0 to 1,000</li>
-            <li>Client 3 calls ranges: 0 to 1,000; 1,001 to 2000</li>
-        </ul>
-        <p>Variable, Overlapping Example: each client is free to call whatever range they want, in any order, and these ranges may overlap each other:</p>
-        <ul>
-            <li>Client 1 calls ranges: 0 to 500; 501 to 1,000</li>
-            <li>Client 2 calls ranges: 0 to 1,000; 1,001 to 2,000</li>
-            <li>Client 3 calls ranges: 0 to 750; 751 to 1,500</li>
-        </ul>
-    </div>
-</script>
-
-<script type="text/ng-template" id="headerRewriteEdge.html">
-    <div id="headerRewriteEdge-tooltip-content">
-        <p>Headers can be added or altered at each layer of the CDN. You must tell
-            us four things: the action, the header name, the header value, and the direction to apply. The action will tell us
-            whether we are adding, removing, or replacing headers. The header name and header value will determine the full
-            header text. The direction will determine whether we add it before we respond to a request or before we make a
-            request further up the chain in the server hierarchy. Examples include:</p>
-        <ul>
-            <li>Action: Add</li>
-            <li>Header Name: X-CDN</li>
-            <li>Header Value: Foo</li>
-            <li>Direction: Edge Response to Client</li>
-        </ul>
-    </div>
-</script>
-
-<script type="text/ng-template" id="headerRewriteMid.html">
-    <div id="headerRewriteMid-tooltip-content"><p>Headers can be added or altered at each layer of the CDN. You must tell
-        us four things: the action, the header name, the header value, and the direction to apply. The action will tell us
-        whether we are adding, removing, or replacing headers. The header name and header value will determine the full
-        header text. The direction will determine whether we add it before we respond to a request or before we make a
-        request further up the chain in the server hierarchy. Examples include:</p>
-        <ul>
-            <li>Action: Modify (Replace)</li>
-            <li>Header Name: Host</li>
-            <li>Header Value: code_abc123</li>
-            <li>Direction: Mid Request to Origin</li>
-        </ul>
-    </div>
-</script>
-
-<script type="text/ng-template" id="headerRewriteRedirectRouter.html">
-    <div id="headerRewriteRedirectRouter-tooltip-content"><p>Headers can be added or altered at each layer of the CDN. You
-        must tell us four things: the action, the header name, the header value, and the direction to apply. The action will
-        tell us whether we are adding, removing, or replacing headers. The header name and header value will determine the
-        full header text. The direction will determine whether we add it before we respond to a request or before we make a
-        request further up the chain in the server hierarchy. Examples include:</p>
-
-        <p>The CCR Router is the first server to which the client will connect. The CCR Router will redirect the client to
-            the proper edge server based on the geo location of the client and the content requested.</p>
-        <ul>
-            <li>Action: Add</li>
-            <li>Header Name: Access-Control-Allow-Origin</li>
-            <li>Header Value: *</li>
-            <li>Direction: CCR Response to Client</li>
-        </ul>
-    </div>
-</script>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/new/index.js b/traffic_portal/app/src/modules/private/deliveryService/new/index.js
deleted file mode 100644
index fc7ab24..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/new/index.js
+++ /dev/null
@@ -1,32 +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.new', [])
-    .controller('DeliveryServiceNewController', require('./DeliveryServiceNewController'))
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.deliveryService.new', {
-                url: '/new',
-                views: {
-                    deliveryServiceContent: {
-                        templateUrl: 'modules/private/deliveryService/new/deliveryService.new.tpl.html',
-                        controller: 'DeliveryServiceNewController'
-                    }
-                }
-            });
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/DeliveryServiceViewController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/DeliveryServiceViewController.js b/traffic_portal/app/src/modules/private/deliveryService/view/DeliveryServiceViewController.js
deleted file mode 100644
index 1257613..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/DeliveryServiceViewController.js
+++ /dev/null
@@ -1,25 +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 DeliveryServiceViewController = function($scope, deliveryService) {
-
-    $scope.deliveryService = deliveryService;
-
-};
-
-DeliveryServiceViewController.$inject = ['$scope', 'deliveryService'];
-module.exports = DeliveryServiceViewController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/_deliveryService.view.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/_deliveryService.view.scss b/traffic_portal/app/src/modules/private/deliveryService/view/_deliveryService.view.scss
deleted file mode 100644
index fff23b4..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/_deliveryService.view.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/deliveryService/view/charts/DeliveryServiceViewChartsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/charts/DeliveryServiceViewChartsController.js b/traffic_portal/app/src/modules/private/deliveryService/view/charts/DeliveryServiceViewChartsController.js
deleted file mode 100644
index a7212bf..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/charts/DeliveryServiceViewChartsController.js
+++ /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.
-
- */
-
-var DeliveryServiceViewChartsController = function($scope, $location, $uibModal, $state, deliveryServicesModel, propertiesModel, chartModel) {
-
-    $scope.deliveryServices = deliveryServicesModel.deliveryServices;
-
-    $scope.properties = propertiesModel.properties;
-
-    $scope.bpsPopover = {
-        title: propertiesModel.properties.charts.bandwidthPerSecond.title,
-        content: propertiesModel.properties.charts.bandwidthPerSecond.description
-    };
-
-    $scope.tpsPopover = {
-        title: propertiesModel.properties.charts.transactionsPerSecond.title,
-        content: propertiesModel.properties.charts.transactionsPerSecond.description
-    };
-
-    $scope.httpPopover = {
-        title: propertiesModel.properties.charts.httpStatus.title,
-        content: propertiesModel.properties.charts.httpStatus.description
-    };
-
-    $scope.isState = function(state) {
-        return $state.current.name == state;
-    };
-
-    $scope.changeDS = function(dsId) {
-        $state.go($state.current.name, { deliveryServiceId: dsId }, { reload: true });
-    };
-
-    $scope.navigateToChart = function(dsId, type) {
-        $location.url('/delivery-service/' + dsId + '/chart/' + type).search({ start: moment(chartModel.chart.start).format(), end: moment(chartModel.chart.end).format() });
-    };
-
-    $scope.navigateToDeliveryService = function(dsId) {
-        $location.url('/delivery-service/' + dsId).search({ start: moment(chartModel.chart.start).format(), end: moment(chartModel.chart.end).format() });
-    };
-
-};
-
-DeliveryServiceViewChartsController.$inject = ['$scope', '$location', '$uibModal', '$state', 'deliveryServicesModel', 'propertiesModel', 'chartModel'];
-module.exports = DeliveryServiceViewChartsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/charts/_deliveryService.view.charts.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/charts/_deliveryService.view.charts.scss b/traffic_portal/app/src/modules/private/deliveryService/view/charts/_deliveryService.view.charts.scss
deleted file mode 100644
index ce980e2..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/charts/_deliveryService.view.charts.scss
+++ /dev/null
@@ -1,112 +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.
-
-*/
-
-#dsChartsContainer {
-
-  .ds-header {
-    position: relative;
-
-    .ds-name {
-      max-width: 500px;
-    }
-
-    .ds-name {
-      white-space: nowrap;
-      overflow: hidden;
-      text-overflow: ellipsis;
-      display: inline-block;
-      margin-bottom: -5px;
-    }
-
-  }
-
-  .more-ds-btn {
-    position: absolute;
-    top: 8px;
-    right: 0;
-  }
-
-  .more-ds-menu {
-    height: auto;
-    max-height: 300px;
-    max-width: 500px;
-    overflow-y: auto;
-
-    .ds-name-link {
-      overflow: hidden;
-      text-overflow: ellipsis;
-    }
-
-  }
-
-  .schedule-button {
-    margin-top: 20px;
-    float: right;
-  }
-
-  .chart-column {
-    margin-bottom: 20px;
-  }
-
-  .chart-content .chart-container {
-    padding: 10px 20px 0 20px;
-  }
-
-  .chart-content > .chart-container {
-    border: 1px solid #A8A8A8;
-    margin-bottom: 30px;
-  }
-
-  .chart-info {
-    float: right;
-    margin-top: 3px;
-  }
-
-}
-
-@media (max-width: 1199px) {
-
-  #dsChartsContainer {
-
-    .ds-header {
-
-      .ds-name {
-        max-width: 400px;
-      }
-
-    }
-
-  }
-
-}
-
-@media (max-width: 991px) {
-
-  #dsChartsContainer {
-
-    .ds-header {
-
-      .ds-name {
-        max-width: 300px;
-      }
-
-    }
-
-  }
-
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/charts/bandwidthPerSecond/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/charts/bandwidthPerSecond/index.js b/traffic_portal/app/src/modules/private/deliveryService/view/charts/bandwidthPerSecond/index.js
deleted file mode 100644
index 07ab673..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/charts/bandwidthPerSecond/index.js
+++ /dev/null
@@ -1,51 +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.chart.bandwidthPerSecond', [])
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.deliveryService.view.chart.bandwidthPerSecond', {
-                url: '/bandwidth-per-second',
-                views: {
-                    chartDatesContent: {
-                        templateUrl: 'common/modules/chart/dates/chart.dates.tpl.html',
-                        controller: 'ChartDatesController',
-                        resolve: {
-                            customLabel: function() {
-                                return 'Data';
-                            },
-                            showAutoRefreshBtn: function() {
-                                return true;
-                            }
-                        }
-                    },
-                    chartContent: {
-                        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;
-                            }
-                        }
-                    }
-                }
-            });
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/charts/deliveryService.view.charts.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/charts/deliveryService.view.charts.tpl.html b/traffic_portal/app/src/modules/private/deliveryService/view/charts/deliveryService.view.charts.tpl.html
deleted file mode 100644
index 2a8c0b4..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/charts/deliveryService.view.charts.tpl.html
+++ /dev/null
@@ -1,64 +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="dsChartsContainer" ng-show="deliveryService">
-    <div class="ds-header">
-        <ol class="breadcrumb">
-            <li><a class="ds-name" ng-click="navigateToDeliveryService(deliveryService.id)" title="{{deliveryService.displayName}} ({{deliveryService.id}} | {{deliveryService.xmlId}})">{{deliveryService.displayName}}</a></li>
-            <li class="active">Charts</li>
-        </ol>
-        <div class="more-ds-btn btn-group" uib-dropdown is-open="dsDropdown.isopen">
-            <button id="moreDS-button" type="button" class="action-btn-dropdown btn" uib-dropdown-toggle>
-                Change Delivery Service <i class="fa fa-angle-down fa-lg"></i>
-            </button>
-            <ul class="action-btn-menu uib-dropdown-menu dropdown-menu-right more-ds-menu scrollable" role="menu" aria-labelledby="moreDS-button">
-                <li ng-repeat="ds in deliveryServices | orderBy:'displayName'" ng-show="ds.id != deliveryService.id"><a class="ds-name-link" title="{{ds.displayName}} ({{ds.id}} | {{ds.xmlId}})" ng-click="changeDS(ds.id)"><span ng-show="!ds.active" title="Inactive"><i class="fa fa-times fa-fw"></i></span><span ng-show="ds.active" title="Active"><i class="fa fa-check fa-fw"></i></span> {{ds.displayName}}</a></li>
-            </ul>
-        </div>
-    </div>
-    <div class="row">
-        <div class="col-lg-3 col-md-12 col-sm-12 column chart-column">
-            <ul class="nav nav-pills nav-stacked">
-                <li class="header">Delivery Service Charts</li>
-                <li ng-if="properties.charts.bandwidthPerSecond.show">
-                    <a ng-class="{'selected-chart': isState('trafficPortal.private.deliveryService.view.chart.bandwidthPerSecond')}" ng-click="navigateToChart(deliveryService.id, 'bandwidth-per-second')">
-                        <i ng-show="isState('trafficPortal.private.deliveryService.view.chart.bandwidthPerSecond')" class="fa fa-chevron-right fa-fw"></i> {{properties.charts.bandwidthPerSecond.name}}
-                        <i class="chart-info fa fa-info-circle fa-lg" uib-popover="{{bpsPopover.content}}" popover-title="{{bpsPopover.title}}" popover-trigger="mouseenter" popover-placement="right" popover-append-to-body="true" popover-class="popover-class"></i>
-                    </a>
-                </li>
-                <li ng-if="properties.charts.transactionsPerSecond.show">
-                    <a ng-class="{'selected-chart': isState('trafficPortal.private.deliveryService.view.chart.transactionsPerSecond')}" ng-click="navigateToChart(deliveryService.id, 'transactions-per-second')">
-                        <i ng-show="isState('trafficPortal.private.deliveryService.view.chart.transactionsPerSecond')" class="fa fa-chevron-right fa-fw"></i> {{properties.charts.transactionsPerSecond.name}}
-                        <i class="chart-info fa fa-info-circle fa-lg" uib-popover="{{tpsPopover.content}}" popover-title="{{tpsPopover.title}}" popover-trigger="mouseenter" popover-placement="right" popover-append-to-body="true" popover-class="popover-class"></i>
-                    </a>
-                </li>
-                <li ng-if="properties.charts.httpStatus.show">
-                    <a ng-class="{'selected-chart': isState('trafficPortal.private.deliveryService.view.chart.httpStatus')}" ng-click="navigateToChart(deliveryService.id, 'http-status-by-class')">
-                        <i ng-show="isState('trafficPortal.private.deliveryService.view.chart.httpStatus')" class="fa fa-chevron-right fa-fw"></i> {{properties.charts.httpStatus.name}}
-                        <i class="chart-info fa fa-info-circle fa-lg" uib-popover="{{httpPopover.content}}" popover-title="{{httpPopover.title}}" popover-trigger="mouseenter" popover-placement="right" popover-append-to-body="true" popover-class="popover-class"></i>
-                    </a>
-                </li>
-            </ul>
-        </div>
-        <div class="col-lg-9 col-med-12 col-sm-12">
-            <div ui-view="chartDatesContent"></div>
-            <div ui-view="chartContent" class="chart-content"></div>
-        </div>
-    </div>
-</div>
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/charts/httpStatus/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/charts/httpStatus/index.js b/traffic_portal/app/src/modules/private/deliveryService/view/charts/httpStatus/index.js
deleted file mode 100644
index 1618b0b..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/charts/httpStatus/index.js
+++ /dev/null
@@ -1,48 +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.chart.httpStatus', [])
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.deliveryService.view.chart.httpStatus', {
-                url: '/http-status-by-class',
-                views: {
-                    chartDatesContent: {
-                        templateUrl: 'common/modules/chart/dates/chart.dates.tpl.html',
-                        controller: 'ChartDatesController',
-                        resolve: {
-                            customLabel: function() {
-                                return 'Data';
-                            },
-                            showAutoRefreshBtn: function() {
-                                return true;
-                            }
-                        }
-                    },
-                    chartContent: {
-                        templateUrl: 'common/modules/chart/httpStatus/chart.httpStatus.tpl.html',
-                        controller: 'ChartHttpStatusController',
-                        resolve: {
-                            entity: function(user, $stateParams, deliveryServicesModel) {
-                                return deliveryServicesModel.getDeliveryService($stateParams.deliveryServiceId);
-                            }
-                        }
-                    }
-                }
-            });
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/charts/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/charts/index.js b/traffic_portal/app/src/modules/private/deliveryService/view/charts/index.js
deleted file mode 100644
index f0856ea..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/charts/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.chart', [])
-    .controller('DeliveryServiceViewChartsController', require('./DeliveryServiceViewChartsController'))
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.deliveryService.view.chart', {
-                url: '/chart',
-                abstract: true,
-                views: {
-                    deliveryServiceViewContent: {
-                        templateUrl: 'modules/private/deliveryService/view/charts/deliveryService.view.charts.tpl.html',
-                        controller: 'DeliveryServiceViewChartsController'
-                    }
-                }
-            });
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/charts/transactionsPerSecond/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/charts/transactionsPerSecond/index.js b/traffic_portal/app/src/modules/private/deliveryService/view/charts/transactionsPerSecond/index.js
deleted file mode 100644
index 36be5f9..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/charts/transactionsPerSecond/index.js
+++ /dev/null
@@ -1,51 +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.chart.transactionsPerSecond', [])
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.deliveryService.view.chart.transactionsPerSecond', {
-                url: '/transactions-per-second',
-                views: {
-                    chartDatesContent: {
-                        templateUrl: 'common/modules/chart/dates/chart.dates.tpl.html',
-                        controller: 'ChartDatesController',
-                        resolve: {
-                            customLabel: function() {
-                                return 'Data';
-                            },
-                            showAutoRefreshBtn: function() {
-                                return true;
-                            }
-                        }
-                    },
-                    chartContent: {
-                        templateUrl: 'common/modules/chart/transactionsPerSecond/chart.transactionsPerSecond.tpl.html',
-                        controller: 'ChartTransactionsPerSecondController',
-                        resolve: {
-                            entity: function(user, $stateParams, deliveryServicesModel) {
-                                return deliveryServicesModel.getDeliveryService($stateParams.deliveryServiceId);
-                            },
-                            showSummary: function() {
-                                return true;
-                            }
-                        }
-                    }
-                }
-            });
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/deliveryService.view.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/deliveryService.view.tpl.html b/traffic_portal/app/src/modules/private/deliveryService/view/deliveryService.view.tpl.html
deleted file mode 100644
index 9a51f63..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/deliveryService.view.tpl.html
+++ /dev/null
@@ -1,18 +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 ui-view="deliveryServiceViewContent"></div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/index.js b/traffic_portal/app/src/modules/private/deliveryService/view/index.js
deleted file mode 100644
index bb71dd4..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/index.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.
-
- */
-
-module.exports = angular.module('trafficPortal.deliveryService.view', [])
-    .controller('DeliveryServiceViewController', require('./DeliveryServiceViewController'))
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.deliveryService.view', {
-                url: '/{deliveryServiceId}',
-                abstract: true,
-                views: {
-                    deliveryServiceContent: {
-                        templateUrl: 'modules/private/deliveryService/view/deliveryService.view.tpl.html',
-                        controller: 'DeliveryServiceViewController',
-                        resolve: {
-                            deliveryService: function(user, deliveryServicesModel, $stateParams) {
-                                return deliveryServicesModel.getDeliveryService($stateParams.deliveryServiceId);
-                            }
-                        }
-                    }
-                }
-            });
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/overview/DeliveryServiceViewOverviewController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/overview/DeliveryServiceViewOverviewController.js b/traffic_portal/app/src/modules/private/deliveryService/view/overview/DeliveryServiceViewOverviewController.js
deleted file mode 100644
index 9902340..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/overview/DeliveryServiceViewOverviewController.js
+++ /dev/null
@@ -1,73 +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 DeliveryServiceViewOverviewController = function($scope, $location, $state, $uibModal, propertiesModel, deliveryServiceService, chartModel) {
-
-    var getFailoverStatus = function() {
-        var ignoreLoadingBar = true;
-        deliveryServiceService.getState($scope.deliveryService.id, ignoreLoadingBar)
-            .then(function(response) {
-                $scope.failover = response.failover;
-            });
-    };
-
-    $scope.properties = propertiesModel.properties;
-
-    $scope.failover = {
-        configured: false,
-        enabled: false,
-        destination: {
-            location: null,
-            type: ''
-        },
-        locations: []
-    };
-
-    $scope.viewConfig = function(ds) {
-
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/deliveryService/config/edit/deliveryService.config.edit.tpl.html',
-            controller: 'DSConfigEditController',
-            size: 'lg',
-            windowClass: 'ds-config-modal',
-            resolve: {
-                deliveryService: function () {
-                    return deliveryServiceService.getDeliveryService(ds.id);
-                }
-            }
-        });
-
-        modalInstance.result.then(function() {
-        }, function () {
-            // do nothing
-        });
-    };
-
-    $scope.navigateToChart = function(dsId, type) {
-        $location.url('/delivery-service/' + dsId + '/chart/' + type).search({ start: moment(chartModel.chart.start).format(), end: moment(chartModel.chart.end).format() });
-    };
-
-    angular.element(document).ready(function () {
-        if ($scope.deliveryService && $scope.deliveryService.active) {
-            getFailoverStatus();
-        }
-    });
-
-};
-
-DeliveryServiceViewOverviewController.$inject = ['$scope', '$location', '$state', '$uibModal', 'propertiesModel', 'deliveryServiceService', 'chartModel'];
-module.exports = DeliveryServiceViewOverviewController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/view/overview/_deliveryService.view.overview.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/view/overview/_deliveryService.view.overview.scss b/traffic_portal/app/src/modules/private/deliveryService/view/overview/_deliveryService.view.overview.scss
deleted file mode 100644
index cef58e6..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/view/overview/_deliveryService.view.overview.scss
+++ /dev/null
@@ -1,98 +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.
-
-*/
-
-#dsOverviewContainer {
-
-  .ds-header {
-    position: relative;
-
-    .ds-name {
-      max-width: 500px;
-    }
-
-    .ds-name {
-      white-space: nowrap;
-      overflow: hidden;
-      text-overflow: ellipsis;
-      display: inline-block;
-      margin-bottom: -5px;
-    }
-
-  }
-
-  .bandwidth-content {
-    border: 1px solid #A8A8A8;
-    padding: 10px;
-  }
-
-  .more-charts-btn, .invalidate-content-btn {
-    position: absolute;
-    top: 8px;
-  }
-
-  .invalidate-content-btn {
-    right: 215px;
-  }
-
-  .more-charts-btn {
-    right: 0;
-  }
-
-  .ds-cachegroups {
-    padding-bottom: 60px;
-  }
-
-  .scrollable-purge-container {
-    height: auto;
-    max-height: 500px;
-    overflow-y: auto;
-  }
-
-}
-
-@media (max-width: 1199px) {
-
-  #dsOverviewContainer {
-
-    .ds-header {
-
-      .ds-name {
-        max-width: 400px;
-      }
-
-    }
-
-  }
-
-}
-
-@media (max-width: 991px) {
-
-  #dsOverviewContainer {
-
-    .ds-header {
-
-      .ds-name {
-        max-width: 300px;
-      }
-
-    }
-
-  }
-
-}
-



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/type/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/type/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/type/new/index.js
deleted file mode 100644
index 6b067de..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/type/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.type.new', [])
-    .controller('FormNewTypeController', require('./FormNewTypeController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/user/FormUserController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/user/FormUserController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/user/FormUserController.js
deleted file mode 100644
index 8561601..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/user/FormUserController.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormUserController = function(user, $scope, $location, formUtils, stringUtils, locationUtils, roleService, tenantService) {
-
-    var getRoles = function() {
-        roleService.getRoles()
-            .then(function(result) {
-                $scope.roles = result;
-            });
-    };
-
-    var getTenants = function() {
-        tenantService.getTenants()
-            .then(function(result) {
-                $scope.tenants = result;
-            });
-    };
-
-    $scope.user = user;
-
-    $scope.labelize = stringUtils.labelize;
-
-    $scope.viewDeliveryServices = function() {
-        $location.path($location.path() + '/delivery-services');
-    };
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-    var init = function () {
-        getRoles();
-        getTenants();
-    };
-    init();
-
-};
-
-FormUserController.$inject = ['user', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils', 'roleService', 'tenantService'];
-module.exports = FormUserController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/user/_form.user.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/user/_form.user.scss b/traffic_ops/experimental/ui/app/src/common/modules/form/user/_form.user.scss
deleted file mode 100644
index d57b9c6..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/user/_form.user.scss
+++ /dev/null
@@ -1,16 +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_ops/experimental/ui/app/src/common/modules/form/user/edit/FormEditUserController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/user/edit/FormEditUserController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/user/edit/FormEditUserController.js
deleted file mode 100644
index 69f5fec..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/user/edit/FormEditUserController.js
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditUserController = function(user, $scope, $controller, $uibModal, $anchorScroll, locationUtils, userService) {
-
-    // extends the FormUserController to inherit common methods
-    angular.extend(this, $controller('FormUserController', { user: user, $scope: $scope }));
-
-    var saveUser = function(user) {
-        userService.updateUser(user).
-            then(function() {
-                $scope.userName = angular.copy(user.username);
-                $anchorScroll(); // scrolls window to top
-            });
-    };
-
-    var deleteUser = function(user) {
-        userService.deleteUser(user.id)
-            .then(function() {
-                locationUtils.navigateToPath('/admin/users');
-            });
-    };
-
-    $scope.userName = angular.copy(user.username);
-
-    $scope.settings = {
-        isNew: false,
-        saveLabel: 'Update'
-    };
-
-    $scope.confirmSave = function(user, usernameField) {
-        saveUser(user);
-    };
-
-    $scope.confirmDelete = function(user) {
-        var params = {
-            title: 'Delete User: ' + user.username,
-            key: user.username
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-            controller: 'DialogDeleteController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                }
-            }
-        });
-        modalInstance.result.then(function() {
-            deleteUser(user);
-        }, function () {
-            // do nothing
-        });
-    };
-
-};
-
-FormEditUserController.$inject = ['user', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'userService'];
-module.exports = FormEditUserController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/user/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/user/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/user/edit/index.js
deleted file mode 100644
index 9dc2f56..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/user/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.user.edit', [])
-    .controller('FormEditUserController', require('./FormEditUserController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/user/form.user.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/user/form.user.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/user/form.user.tpl.html
deleted file mode 100644
index b6cd309..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/user/form.user.tpl.html
+++ /dev/null
@@ -1,109 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/users')">Users</a></li>
-            <li class="active">{{userName}}</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <button class="btn btn-primary" title="View Delivery Services" ng-click="viewDeliveryServices()">View Delivery Services</button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="userForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(userForm.fullName), 'has-feedback': hasError(userForm.fullName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Full Name *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="fullName" name="fullName" type="text" class="form-control" ng-model="user.fullName" ng-required="true" ng-maxlength="256" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(userForm.fullName, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(userForm.fullName, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(userForm.fullName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(userForm.username), 'has-feedback': hasError(userForm.username)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Username *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="username" name="username" type="text" class="form-control" ng-model="user.username" ng-required="true" ng-maxlength="128" ng-pattern="/^\S*$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(userForm.username, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(userForm.username, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(userForm.username, 'pattern')">No Spaces</small>
-                    <span ng-show="hasError(userForm.username)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(userForm.email), 'has-feedback': hasError(userForm.email)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Email *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="email" name="email" type="email" class="form-control" ng-model="user.email" ng-required="true" ng-maxlength="128" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(userForm.email, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(userForm.email, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(userForm.email)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(userForm.role), 'has-feedback': hasError(userForm.role)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Role *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="role" name="role" class="form-control" ng-model="user.role" ng-options="role.id as role.name for role in roles" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(userForm.role, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(userForm.tenantId), 'has-feedback': hasError(userForm.tenantId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Tenant</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="tenantId" name="tenantId" class="form-control" ng-model="user.tenantId" ng-options="tenant.id as tenant.name for tenant in tenants">
-                        <option value="">Select...</option>
-                    </select>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(userForm.password), 'has-feedback': hasError(userForm.password)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Password <span ng-if="settings.isNew">*</span></label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="password" name="password" type="password" class="form-control" ng-model="user.localPasswd" ng-required="settings.isNew" ng-maxlength="40" ng-minlength="8" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(userForm.password, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(userForm.password, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(userForm.password)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(userForm.confirmPassword), 'has-feedback': hasError(userForm.confirmPassword)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Confirm Password <span ng-if="settings.isNew">*</span></label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="confirmPassword" name="confirmPassword" type="password" class="form-control" ng-model="user.confirmLocalPasswd" match="user.localPasswd">
-                    <small class="input-error" ng-show="hasPropertyError(userForm.confirmPassword, 'match')">[ Doesn't Match ]</small>
-                    <span ng-show="hasError(userForm.confirmPassword)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Public SSH Key</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <textarea id="publicSshKey" name="publicSshKey" rows="5" class="form-control" ng-model="user.publicSshKey"></textarea>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(user)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="userForm.$pristine || userForm.$invalid" ng-click="confirmSave(user, userForm.username)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/user/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/user/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/user/index.js
deleted file mode 100644
index e844d0d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/user/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.user', [])
-    .controller('FormUserController', require('./FormUserController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/user/new/FormNewUserController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/user/new/FormNewUserController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/user/new/FormNewUserController.js
deleted file mode 100644
index a832929..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/user/new/FormNewUserController.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewUserController = function(user, $scope, $controller, userService) {
-
-    // extends the FormUserController to inherit common methods
-    angular.extend(this, $controller('FormUserController', { user: user, $scope: $scope }));
-
-    $scope.userName = 'New';
-
-    $scope.settings = {
-        isNew: true,
-        saveLabel: 'Create'
-    };
-
-    $scope.confirmSave = function(user, usernameField) {
-        userService.createUser(user);
-    };
-
-};
-
-FormNewUserController.$inject = ['user', '$scope', '$controller', 'userService'];
-module.exports = FormNewUserController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/user/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/user/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/user/new/index.js
deleted file mode 100644
index cdd0817..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/user/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.user.new', [])
-    .controller('FormNewUserController', require('./FormNewUserController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/header/HeaderController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/header/HeaderController.js b/traffic_ops/experimental/ui/app/src/common/modules/header/HeaderController.js
deleted file mode 100644
index e8789df..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/header/HeaderController.js
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var HeaderController = function($rootScope, $scope, $state, $uibModal, $location, $anchorScroll, locationUtils, authService, trafficPortalService, changeLogService, cdnService, changeLogModel, userModel) {
-
-    $scope.isCollapsed = true;
-
-    $scope.userLoaded = userModel.loaded;
-
-    /* we don't want real time changes to the user showing up. we want the ability to revert changes
-    if necessary. thus, we will only update this on save. see userModel::userUpdated event below.
-     */
-    $scope.user = angular.copy(userModel.user);
-
-    $scope.newLogCount = changeLogModel.newLogCount;
-
-    $scope.changeLogs = [];
-
-    $scope.isState = function(state) {
-        return $state.current.name.indexOf(state) !== -1;
-    };
-
-    $scope.getChangeLogs = function() {
-        $scope.changeLogs = [];
-        changeLogService.getChangeLogs({ limit: 6 })
-            .then(function(response) {
-                $scope.changeLogs = response;
-            });
-    };
-
-    $scope.getRelativeTime = function(date) {
-        return moment(date).fromNow();
-    };
-
-    $scope.logout = function() {
-        authService.logout();
-    };
-
-    $scope.dumpDB = function() {
-        alert('not working yet');
-        // trafficPortalService.dumpDB();
-    };
-
-    $scope.confirmQueueServerUpdates = function() {
-        var params = {
-            title: 'Queue Server Updates',
-            message: "Please select a CDN"
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
-            controller: 'DialogSelectController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                },
-                collection: function(cdnService) {
-                    return cdnService.getCDNs();
-                }
-            }
-        });
-        modalInstance.result.then(function(cdn) {
-            cdnService.queueServerUpdates(cdn.id);
-        }, function () {
-            // do nothing
-        });
-    };
-
-    $scope.snapshot = function() {
-        var params = {
-            title: 'Diff CDN Config Snapshot',
-            message: "Please select a CDN"
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
-            controller: 'DialogSelectController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                },
-                collection: function(cdnService) {
-                    return cdnService.getCDNs();
-                }
-            }
-        });
-        modalInstance.result.then(function(cdn) {
-            $location.path('/admin/cdns/' + cdn.id + '/config/changes');
-        }, function () {
-            // do nothing
-        });
-    };
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    var scrollToTop = function() {
-        $anchorScroll(); // hacky?
-    };
-
-    var initToggleMenu = function() {
-        $('#menu_toggle').click(function () {
-            var isBig = $('body').hasClass('nav-md');
-            if (isBig) {
-                // shrink side menu
-                $('body').removeClass('nav-md');
-                $('body').addClass('nav-sm');
-                $('.main-nav').removeClass('scroll-view');
-                $('.main-nav').removeAttr('style');
-                $('.sidebar-footer').hide();
-
-                if ($('#sidebar-menu li').hasClass('active')) {
-                    $('#sidebar-menu li.active').addClass('active-sm');
-                    $('#sidebar-menu li.active').removeClass('active');
-                }
-
-                $('.side-menu-category ul').hide();
-
-            } else {
-                // expand side menu
-                $('body').removeClass('nav-sm');
-                $('body').addClass('nav-md');
-                $('.sidebar-footer').show();
-
-                if ($('#sidebar-menu li').hasClass('active-sm')) {
-                    $('#sidebar-menu li.active-sm').addClass('active');
-                    $('#sidebar-menu li.active-sm').removeClass('active-sm');
-                }
-
-                $rootScope.$broadcast('HeaderController::navExpanded', {});
-
-            }
-        });
-    };
-
-    $scope.$on('userModel::userUpdated', function() {
-        $scope.user = angular.copy(userModel.user);
-    });
-
-    var init = function () {
-        scrollToTop();
-        initToggleMenu();
-    };
-    init();
-};
-
-HeaderController.$inject = ['$rootScope', '$scope', '$state', '$uibModal', '$location', '$anchorScroll', 'locationUtils', 'authService', 'trafficPortalService', 'changeLogService', 'cdnService', 'changeLogModel', 'userModel'];
-module.exports = HeaderController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/header/_header.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/header/_header.scss b/traffic_ops/experimental/ui/app/src/common/modules/header/_header.scss
deleted file mode 100755
index 3ac94db..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/header/_header.scss
+++ /dev/null
@@ -1,136 +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.
-
-*/
-body.nav-sm .main_container .top_nav {
-  padding: 0 !important;
-  display: block;
-  margin-left: 70px;
-  z-index: 2;
-}
-
-#alertsButton, #userButton {
-  &:hover, &:focus {
-    text-decoration: none;
-  }
-}
-
-.main_container .top_nav {
-  padding: 0 !important;
-  display: block;
-  padding: 10px 20px 0;
-  margin-left: 230px;
-}
-
-.top_nav .navbar-right {
-  margin: 0;
-  width: 70%;
-  float: right;
-}
-
-.top_nav .navbar-right li {
-  display: inline-block;
-  float: right;
-}
-
-.top_nav .dropdown-menu {
-  min-width: 220px;
-}
-
-.top_nav .dropdown-menu li {
-  width: 100%;
-}
-
-.top_nav .dropdown-menu li a {
-  width: 100%;
-  padding: 12px 20px;
-}
-
-.top_nav li a i {
-  font-size: 15px
-}
-
-.navbar {
-  margin-bottom: 0
-}
-
-.navbar-header {
-  background: #34495E;
-}
-
-.navbar-right {
-  margin-right: 0;
-}
-
-.navbar-static-top {
-  position: fixed;
-  top: 0;
-  width: 100%;
-}
-
-.navbar-brand,
-.navbar-nav>li>.btn-group>.btn-link {
-  color: #fff !important;
-}
-
-.navbar-brand,
-.navbar-nav>li>.btn-group>.btn-link {
-  margin-bottom: 5px
-}
-
-.nav.navbar-nav>li>.btn-group>.btn-link {
-  color: #515356 !important;
-}
-
-.nav.top_menu>li>a {
-  position: relative;
-  display: block;
-  padding: 10px 15px;
-  color: #34495E !important;
-}
-
-.nav>li>a:hover,
-.nav>li>a:focus {
-  background-color: transparent;
-}
-
-.toggle {
-  float: left;
-  margin: 0;
-  padding-top: 16px;
-  padding-bottom: 16px;
-  width: 70px;
-}
-
-.toggle a {
-  padding: 15px 15px 0;
-  margin: 0;
-}
-
-.toggle a i {
-  font-size: 26px;
-}
-
-@media (max-width: 991px) {
-
-  body.nav-md .container.body .top_nav {
-    width: 100%;
-    margin: 0;
-  }
-
-}
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/header/header.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/header/header.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/header/header.tpl.html
deleted file mode 100644
index 99a4ee5..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/header/header.tpl.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div id="header" class="nav_menu">
-    <nav role="navigation">
-        <div class="nav toggle">
-            <a id="menu_toggle"><i class="fa fa-bars"></i></a>
-        </div>
-        <ul class="nav navbar-nav navbar-right" ng-if="userLoaded">
-            <li>
-                <div class="btn-group" uib-dropdown is-open="userMenu.isopen">
-                    <button id="userButton" type="button" class="btn btn-link" uib-dropdown-toggle>
-                        <span id="headerUsername">{{::user.username}}</span><span ng-if="user.newUser">New User</span> <i class="fa fa-angle-down fa-lg"></i>
-                    </button>
-                    <ul class="uib-dropdown-menu dropdown-usermenu animated fadeInDown" role="menu" aria-labelledby="userMenu-button">
-                        <li><a ui-sref="trafficPortal.private.user.edit">Manage User Profile</a></li>
-                        <li ng-if="userLoaded"><a ng-click="logout()">Logout</a></li>
-                    </ul>
-                </div>
-            </li>
-            <li role="presentation" class="dropdown">
-                <div class="btn-group" uib-dropdown is-open="alerts.isopen">
-                    <button id="alertsButton" type="button" class="btn btn-link" ng-click="getChangeLogs()" uib-dropdown-toggle>
-                        <i class="fa fa-comment-o"></i>
-                        <span class="badge bg-green">{{newLogCount()}}</span>
-                    </button>
-                    <ul class="uib-dropdown-menu list-unstyled msg_list animated fadeInDown" role="menu">
-                        <li ng-repeat="changeLog in changeLogs">
-                            <a ng-click="$event.stopPropagation()">
-                                <span>
-                                    <span>{{::changeLog.user}}</span>
-                                    <span class="time">{{::getRelativeTime(changeLog.lastUpdated)}}</span>
-                                </span>
-                                <span class="message">{{::changeLog.message}}</span>
-                            </a>
-                        </li>
-                        <li>
-                            <div class="text-center">
-                                <a>
-                                    <strong><a ng-click="navigateToPath('/admin/change-logs')">See All Change Logs</a></strong>
-                                    <i class="fa fa-angle-right"></i>
-                                </a>
-                            </div>
-                        </li>
-                    </ul>
-                </div>
-            </li>
-            <li>
-                <div class="btn-group" title="Download DB">
-                    <button type="button" class="btn btn-link" ng-click="dumpDB()"><i class="fa fa-download"></i></button>
-                </div>
-            </li>
-            <li>
-                <div class="btn-group" title="Queue CDN Server Updates">
-                    <button type="button" class="btn btn-link" ng-click="confirmQueueServerUpdates()"><i class="fa fa-flag"></i></button>
-                </div>
-            </li>
-            <li>
-                <div class="btn-group" title="Diff CDN Config Snapshot">
-                    <button type="button" class="btn btn-link" ng-click="snapshot()"><i class="fa fa-camera"></i></button>
-                </div>
-            </li>
-        </ul>
-    </nav>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/header/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/header/index.js b/traffic_ops/experimental/ui/app/src/common/modules/header/index.js
deleted file mode 100644
index 4931e1f..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/header/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.header', [])
-    .controller('HeaderController', require('./HeaderController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/message/MessageController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/message/MessageController.js b/traffic_ops/experimental/ui/app/src/common/modules/message/MessageController.js
deleted file mode 100644
index fde0f6b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/message/MessageController.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var MessageController = function($scope, messageModel) {
-
-    $scope.messageData = messageModel;
-
-    $scope.dismissMessage = function(message) {
-        messageModel.removeMessage(message);
-    };
-
-};
-
-MessageController.$inject = ['$scope', 'messageModel'];
-module.exports = MessageController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/message/_message.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/message/_message.scss b/traffic_ops/experimental/ui/app/src/common/modules/message/_message.scss
deleted file mode 100644
index 5c7d88a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/message/_message.scss
+++ /dev/null
@@ -1,19 +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.
-
-*/
-#messageContainer {
-  margin-top: 70px;
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/message/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/message/index.js b/traffic_ops/experimental/ui/app/src/common/modules/message/index.js
deleted file mode 100644
index cffdace..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/message/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.message', [])
-    .controller('MessageController', require('./MessageController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/message/message.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/message/message.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/message/message.tpl.html
deleted file mode 100644
index b99b6cb..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/message/message.tpl.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div id="messageContainer">
-    <div ng-show="messageData.messages.loaded">
-        <div class="alert alert-dismissable alert-{{(message.level === 'error') ? 'danger' : message.level}}" ng-repeat="message in messageData.messages.content">
-            <button type="button" class="close" data-dismiss="alert" aria-hidden="true" ng-click="dismissMessage(message)">&times;</button>
-            <div>{{message.text}}</div>
-        </div>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/navigation/NavigationController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/navigation/NavigationController.js b/traffic_ops/experimental/ui/app/src/common/modules/navigation/NavigationController.js
deleted file mode 100644
index 2c39b84..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/navigation/NavigationController.js
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var NavigationController = function($scope, $log, $state, $location, $window, $timeout, $uibModal, authService, trafficPortalService, propertiesModel, userModel) {
-
-    $scope.appName = propertiesModel.properties.name;
-
-    $scope.customMenuItems = propertiesModel.properties.customMenu.items;
-
-    $scope.userLoaded = userModel.loaded;
-
-    $scope.user = userModel.user;
-
-    $scope.monitor = {
-        isOpen: false,
-        isDisabled: false
-    };
-
-    $scope.settings = {
-        isOpen: false,
-        isDisabled: false
-    };
-
-
-    $scope.navigateToPath = function(path) {
-        $location.url(path);
-    };
-
-    $scope.isState = function(state) {
-        return $state.current.name.indexOf(state) !== -1;
-    };
-
-    $scope.logout = function() {
-        authService.logout();
-    };
-
-    $scope.releaseVersion = function() {
-        trafficPortalService.getReleaseVersionInfo()
-            .then(function(result) {
-                $uibModal.open({
-                    templateUrl: 'common/modules/release/release.tpl.html',
-                    controller: 'ReleaseController',
-                    size: 'sm',
-                    resolve: {
-                        params: function () {
-                            return result;
-                        }
-                    }
-                });
-            });
-    };
-
-    $scope.openCustomItem = function(url, embed) {
-        if (embed) {
-            $location.url('/custom').search({ url: encodeURIComponent(url) });
-        } else {
-            $window.open(
-                url,
-                '_blank'
-            );
-        }
-    };
-
-    var explodeMenu = function() {
-        var isBig = $('body').hasClass('nav-md');
-
-        $('.side-menu-category ul').slideUp();
-        $('.side-menu-category').removeClass('active');
-        $('.side-menu-category').removeClass('active-sm');
-
-        if (isBig) {
-            $('.current-page').parent('ul').slideDown().parent().addClass('active');
-        } else {
-            $('.current-page').closest('.side-menu-category').addClass('active-sm');
-        }
-    };
-
-    var registerMenuHandlers = function() {
-        $('.side-menu-category').click(function() {
-            var isBig = $('body').hasClass('nav-md');
-            if (isBig) {
-                if ($(this).is('.active')) {
-                    $(this).removeClass('active');
-                    $('ul', this).slideUp();
-                    $(this).removeClass('nv');
-                    $(this).addClass('vn');
-                } else {
-                    $('#sidebar-menu li ul').slideUp();
-                    $(this).removeClass('vn');
-                    $(this).addClass('nv');
-                    $('ul', this).slideDown();
-                    $('#sidebar-menu li').removeClass('active');
-                    $(this).addClass('active');
-                }
-            } else {
-                $('#sidebar-menu li ul').slideUp();
-                if ($(this).is('.active-sm')) {
-                    $(this).removeClass('active-sm');
-                    $(this).removeClass('nv');
-                    $(this).addClass('vn');
-                } else {
-                    $(this).removeClass('vn');
-                    $(this).addClass('nv');
-                    $('ul', this).slideDown();
-                    $('#sidebar-menu li').removeClass('active-sm');
-                    $(this).addClass('active-sm');
-                }
-            }
-        });
-
-        $('.side-menu-category-item').click(function(event) {
-            event.stopPropagation();
-            var isBig = $('body').hasClass('nav-md');
-            if (!isBig) {
-                // close the menu when child is clicked only in small mode
-                $(event.currentTarget).closest('.child_menu').slideUp();
-            }
-        });
-    };
-
-    $scope.$on('HeaderController::navExpanded', function() {
-        explodeMenu();
-    });
-
-    var init = function() {
-        $timeout(function() {
-            explodeMenu();
-            registerMenuHandlers();
-        }, 100);
-    };
-    init();
-
-};
-
-NavigationController.$inject = ['$scope', '$log', '$state', '$location', '$window', '$timeout', '$uibModal', 'authService', 'trafficPortalService', 'propertiesModel', 'userModel'];
-module.exports = NavigationController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/navigation/_navigation.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/navigation/_navigation.scss b/traffic_ops/experimental/ui/app/src/common/modules/navigation/_navigation.scss
deleted file mode 100644
index 88b0b59..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/navigation/_navigation.scss
+++ /dev/null
@@ -1,299 +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.
-
-*/
-body.nav-sm .container.body .main-nav {
-  width: 70px;
-  padding: 0;
-  position: fixed;
-  height: 100%;
-  z-index: 200;
-  background: #2A3F54
-}
-
-body.nav-sm .navbar.nav_title {
-  width: 70px;
-}
-
-body.nav-sm .navbar.nav_title a span {
-  display: none;
-}
-
-body.nav-sm .navbar.nav_title a i {
-  font-size: 27px;
-  margin: 13px 0 0 3px;
-}
-
-.site_title i {
-  padding: 5px 6px;
-}
-
-body.nav-sm .nav.side-menu li a {
-  text-align: center !important;
-  font-weight: 400;
-  font-size: 10px;
-  padding: 10px 5px;
-}
-
-body.nav-sm .nav.side-menu li.active-sm {
-  border-right: 5px solid #1ABB9C;
-}
-
-body.nav-sm > .nav.side-menu > li.active-sm > a {
-  color: #1ABB9C !important;
-}
-
-body.nav-sm .nav.side-menu li a i.toggle-up {
-  display: none !important;
-}
-
-body.nav-sm .nav.side-menu li a i {
-  font-size: 25px !important;
-  text-align: center;
-  width: 100% !important;
-  margin-bottom: 5px;
-}
-
-body.nav-sm ul.nav.child_menu {
-  left: 100%;
-  position: absolute;
-  top: 0;
-  padding: 10px;
-  width: 210px;
-  z-index: 4000;
-  background: #3E5367;
-  display: none;
-}
-
-body.nav-sm ul.nav.child_menu li {
-  padding-left: 0;
-}
-
-body.nav-sm ul.nav.child_menu li a {
-  text-align: left !important;
-}
-
-body.nav-sm .profile {
-  display: none;
-}
-
-.menu_section {
-  margin-bottom: 35px;
-}
-
-.menu_section h3 {
-  padding-left: 23px;
-  color: #fff;
-  text-transform: uppercase;
-  letter-spacing: .5px;
-  font-weight: bold;
-  font-size: 11px;
-  margin-bottom: 0;
-  margin-top: 0;
-  text-shadow: 1px 1px #000;
-}
-
-.menu_section >ul {
-  margin-top: 10px;
-}
-
-#sidebar-menu span.fa {
-  float: right;
-  text-align: center;
-  margin-top: 5px;
-  font-size: 10px !important;
-  min-width: inherit;
-  color: #C4CFDA;
-}
-
-.active a span.fa {
-  text-align: right !important;
-  margin-right: 4px;
-}
-
-body.nav-sm .menu_section {
-  margin: 0;
-}
-
-body.nav-sm span.fa,
-body.nav-sm .menu_section h3 {
-  display: none !important;
-}
-
-.nav_menu {
-  float: left;
-  /*background: #F4F6F9;
-  border-bottom: 1px solid #E6E9ED;*/
-
-  background: #EDEDED;
-  border-bottom: 1px solid #D9DEE4;
-  margin-bottom: 10px;
-  width: 100%;
-}
-
-body.nav-md .container.body .col-md-3.main-nav {
-  top: 0;
-  bottom: 0;
-  width: 230px;
-  background: #2A3F54;
-  padding: 0;
-  position: absolute;
-  display: flex;
-}
-
-.nav_title {
-  width: 230px;
-  float: left;
-  background: #2A3F54;
-  border-radius: 0;
-  height: 57px;
-  text-align: center;
-}
-
-.nav.child_menu > li > a {
-  color: rgba(255, 255, 255, 0.75) !important;
-  font-size: 14px;
-  padding: 9px;
-}
-
-.sidebar-header {
-  border-bottom: 0;
-  margin-top: 46px;
-}
-
-.sidebar-header:first-of-type {
-  margin-top: 0
-}
-
-.nav.side-menu> li {
-  position: relative;
-  display: block;
-}
-
-.nav.side-menu> li > a {
-  margin-bottom: 6px;
-}
-
-.nav.side-menu> li > a:hover {
-  color: #F2F5F7 !important;
-}
-
-.nav.side-menu>li>a:hover,
-.nav>li>a:focus {
-  text-decoration: none;
-  background: transparent;
-}
-
-.nav.child_menu li:hover {
-  background-color: rgba(255, 255, 255, 0.06);
-}
-
-.nav.child_menu li {
-  padding-left: 36px
-}
-
-body.nav-md ul.nav.child_menu li:before {
-  background: #425668;
-  bottom: auto;
-  content: "";
-  height: 8px;
-  left: 23px;
-  margin-top: 15px;
-  position: absolute;
-  right: auto;
-  width: 8px;
-  z-index: 1;
-  -webkit-border-radius: 50%;
-  -moz-border-radius: 50%;
-  border-radius: 50%;
-}
-
-body.nav-md ul.nav.child_menu li:after {
-  border-left: 1px solid #425668;
-  bottom: 0;
-  content: "";
-  left: 27px;
-  position: absolute;
-  top: 0;
-}
-
-.nav.side-menu>li>a,
-.nav.child_menu>li>a {
-  color: #E7E7E7 !important;
-  font-weight: 500;
-}
-
-.nav>li>.btn-group>.btn-link {
-  position: relative;
-  display: block;
-  padding: 13px 15px 7px;
-}
-
-.nav.side-menu> li.current-page,
-.nav.side-menu> li.active {
-  border-right: 5px solid #1ABB9C;
-}
-
-li.current-page {
-  background: rgba(255, 255, 255, 0.05);
-}
-
-.nav.side-menu> li.active > a {
-  color: #ff0000;
-  text-shadow: rgba(0, 0, 0, 0.25) 0 -1px 0;
-  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5b6479), color-stop(100%, #4c5566)), #686e78;
-  background: -webkit-linear-gradient(#334556, #2C4257), #2A3F54;
-  background: -moz-linear-gradient(#334556, #2C4257), #2A3F54;
-  background: -o-linear-gradient(#334556, #2C4257), #2A3F54;
-  background: linear-gradient(#334556, #2C4257), #2A3F54;
-  -webkit-box-shadow: rgba(0, 0, 0, 0.25) 0 1px 0, inset rgba(255, 255, 255, 0.16) 0 1px 0;
-  -moz-box-shadow: rgba(0, 0, 0, 0.25) 0 1px 0, inset rgba(255, 255, 255, 0.16) 0 1px 0;
-  box-shadow: rgba(0, 0, 0, 0.25) 0 1px 0, inset rgba(255, 255, 255, 0.16) 0 1px 0;
-}
-
-li.current-page a {
-  color: #1ABB9C !important
-}
-
-.site_title {
-  text-overflow: ellipsis;
-  overflow: hidden;
-  font-weight: 400;
-  font-size: 22px;
-  width: 100%;
-  color: #ECF0F1 !important;
-  margin-left: 0 !important;
-  line-height: 59px;
-  display: block;
-  height: 55px;
-  margin: 0;
-  padding-left: 10px;
-  text-transform: uppercase;
-}
-
-.site_title:hover,
-.site_title:focus {
-  text-decoration: none
-}
-
-
-
-
-@media (max-width: 991px) {
-  body.nav-md .container.body .col-md-3.main-nav {
-    display: none;
-  }
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/navigation/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/navigation/index.js b/traffic_ops/experimental/ui/app/src/common/modules/navigation/index.js
deleted file mode 100644
index 26a964d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/navigation/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.navigation', [])
-    .controller('NavigationController', require('./NavigationController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/navigation/navigation.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/navigation/navigation.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/navigation/navigation.tpl.html
deleted file mode 100644
index e4c261e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/navigation/navigation.tpl.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="main-nav scroll-view">
-    <div class="navbar nav_title">
-        <span class="site_title">{{appName}}</span>
-    </div>
-    <div class="clearfix"></div>
-    <div id="sidebar-menu" class="main_menu_side hidden-print main_menu">
-        <div class="menu_section">
-            <ul class="nav side-menu">
-                <li class="side-menu-category"><a href="javascript:void(0);"><i class="fa fa-bar-chart"></i> Monitor <span class="fa fa-chevron-down"></span></a>
-                    <ul class="nav child_menu" style="display: none">
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.monitor.dashboard')}"><a ng-click="navigateToPath('/monitor/dashboard')">Dashboard</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.monitor.map')}"><a ng-click="navigateToPath('/monitor/map')">Map</a></li>
-                    </ul>
-                </li>
-                <li class="side-menu-category"><a href="javascript:void(0);"><i class="fa fa-cog"></i> Configure <span class="fa fa-chevron-down"></span></a>
-                    <ul class="nav child_menu" style="display: none">
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.configure.cacheGroups')}"><a ng-click="navigateToPath('/configure/cache-groups')">Cache Groups</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.configure.deliveryServices')}"><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.configure.servers')}"><a ng-click="navigateToPath('/configure/servers')">Servers</a></li>
-                    </ul>
-                </li>
-                <li class="side-menu-category"><a href="javascript:void(0);"><i class="fa fa-wrench"></i> Admin <span class="fa fa-chevron-down"></span></a>
-                    <ul class="nav child_menu" style="display: none">
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.asns')}"><a ng-click="navigateToPath('/admin/asns')">ASNs</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.cdns')}"><a ng-click="navigateToPath('/admin/cdns')">CDNs</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.divisions')}"><a ng-click="navigateToPath('/admin/divisions')">Divisions</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.jobs')}"><a ng-click="navigateToPath('/admin/jobs')">Jobs</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.physLocations')}"><a ng-click="navigateToPath('/admin/phys-locations')">Phys Locations</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.parameters')}"><a ng-click="navigateToPath('/admin/parameters')">Parameters</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.profiles')}"><a ng-click="navigateToPath('/admin/profiles')">Profiles</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.regions')}"><a ng-click="navigateToPath('/admin/regions')">Regions</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.statuses')}"><a ng-click="navigateToPath('/admin/statuses')">Statuses</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.types')}"><a ng-click="navigateToPath('/admin/types')">Types</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.tenants')}"><a ng-click="navigateToPath('/admin/tenants')">Tenants</a></li>
-                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.users')}"><a ng-click="navigateToPath('/admin/users')">Users</a></li>
-                    </ul>
-                </li>
-                <li class="side-menu-category" ng-if="customMenuItems.length > 0"><a href="javascript:void(0);"><i class="fa fa-cog"></i> Custom <span class="fa fa-chevron-down"></span></a>
-                    <ul class="nav child_menu" style="display: none">
-                        <li class="side-menu-category-item" ng-repeat="item in ::customMenuItems"><a ng-click="openCustomItem(item.url, item.embed)">{{item.name}}</a></li>
-                    </ul>
-                </li>
-
-            </ul>
-        </div>
-    </div>
-    <div class="sidebar-footer hidden-small">
-        <a title="Logout" ng-show="userLoaded" ng-click="logout()" uib-popover="Logout" popover-trigger="mouseenter"><i class="fa fa-sign-out"></i></a>
-        <a title="Login" ng-show="!userLoaded" ui-sref="trafficPortal.public.login" uib-popover="Login" popover-trigger="mouseenter"><i class="fa fa-sign-in"></i></a>
-        <a title="User Profile" ui-sref="trafficPortal.private.user.edit" uib-popover="User Profile" popover-trigger="mouseenter"><i class="fa fa-user"></i></a>
-        <a title="Release Info" ng-click="releaseVersion()" uib-popover="Release Info" popover-trigger="mouseenter"><i class="fa fa-info"></i></a>
-        <a title="Popout" uib-popover="Popout" popover-trigger="mouseenter"><i class="fa fa-external-link"></i></a>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/release/ReleaseController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/release/ReleaseController.js b/traffic_ops/experimental/ui/app/src/common/modules/release/ReleaseController.js
deleted file mode 100644
index 36cc195..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/release/ReleaseController.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ReleaseController = function(params, $scope, $uibModalInstance) {
-
-    $scope.params = params;
-
-    $scope.dismiss = function () {
-        $uibModalInstance.dismiss('cancel');
-    };
-
-};
-
-ReleaseController.$inject = ['params', '$scope', '$uibModalInstance'];
-module.exports = ReleaseController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/release/_release.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/release/_release.scss b/traffic_ops/experimental/ui/app/src/common/modules/release/_release.scss
deleted file mode 100644
index d57b9c6..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/release/_release.scss
+++ /dev/null
@@ -1,16 +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_ops/experimental/ui/app/src/common/modules/release/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/release/index.js b/traffic_ops/experimental/ui/app/src/common/modules/release/index.js
deleted file mode 100644
index 31d3b3c..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/release/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.release', [])
-    .controller('ReleaseController', require('./ReleaseController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/release/release.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/release/release.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/release/release.tpl.html
deleted file mode 100644
index 21a52eb..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/release/release.tpl.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="modal-header">
-    <button type="button" class="close" ng-click="dismiss()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-    <h4 class="modal-title">Release Information</h4>
-</div>
-<div class="modal-body">
-    <p ng-repeat="(key, value) in params">{{key}}: {{value}}</p>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/_table.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/_table.scss b/traffic_ops/experimental/ui/app/src/common/modules/table/_table.scss
deleted file mode 100644
index a64e1fe..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/_table.scss
+++ /dev/null
@@ -1,23 +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.
-
-*/
-
-.update-column {
-  text-align: center;
-  .fa-flag {
-    font-weight: bold;
-  }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/asns/TableASNsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/asns/TableASNsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/asns/TableASNsController.js
deleted file mode 100644
index 93da7eb..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/asns/TableASNsController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableASNsController = function(asns, $scope, $state, locationUtils) {
-
-    $scope.asns = asns;
-
-    $scope.editASN = function(id) {
-        locationUtils.navigateToPath('/admin/asns/' + id);
-    };
-
-    $scope.createASN = function() {
-        locationUtils.navigateToPath('/admin/asns/new');
-    };
-
-    $scope.refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-    angular.element(document).ready(function () {
-        $('#asnsTable').dataTable({
-            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-            "iDisplayLength": 25,
-            "aaSorting": []
-        });
-    });
-
-};
-
-TableASNsController.$inject = ['asns', '$scope', '$state', 'locationUtils'];
-module.exports = TableASNsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/asns/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/asns/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/asns/index.js
deleted file mode 100644
index eef7292..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/asns/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.asns', [])
-    .controller('TableASNsController', require('./TableASNsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/asns/table.asns.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/asns/table.asns.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/asns/table.asns.tpl.html
deleted file mode 100644
index 4d7ae7b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/asns/table.asns.tpl.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">ASNs</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <button class="btn btn-primary" title="Create ASN" ng-click="createASN()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="asnsTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>asn</th>
-                <th>cachegroup</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editASN(asn.id)" ng-repeat="asn in ::asns">
-                <td>{{::asn.asn}}</td>
-                <td>{{::asn.cachegroup}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupAsns/TableCacheGroupAsnsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupAsns/TableCacheGroupAsnsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupAsns/TableCacheGroupAsnsController.js
deleted file mode 100644
index f5b9dc0..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupAsns/TableCacheGroupAsnsController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableCacheGroupAsnsController = function(cacheGroup, asns, $scope, $state, locationUtils) {
-
-	$scope.cacheGroup = cacheGroup;
-
-	$scope.asns = asns;
-
-	$scope.editASN = function(id) {
-		locationUtils.navigateToPath('/admin/asns/' + id);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#parametersTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableCacheGroupAsnsController.$inject = ['cacheGroup', 'asns', '$scope', '$state', 'locationUtils'];
-module.exports = TableCacheGroupAsnsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupAsns/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupAsns/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupAsns/index.js
deleted file mode 100644
index 638d901..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupAsns/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.cacheGroupAsns', [])
-	.controller('TableCacheGroupAsnsController', require('./TableCacheGroupAsnsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupAsns/table.cacheGroupAsns.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupAsns/table.cacheGroupAsns.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupAsns/table.cacheGroupAsns.tpl.html
deleted file mode 100644
index 59b8301..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupAsns/table.cacheGroupAsns.tpl.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/cache-groups')">Cache Groups</a></li>
-            <li><a ng-click="navigateToPath('/configure/cache-groups/' + cacheGroup.id)">{{cacheGroup.name}}</a></li>
-            <li class="active">ASNs</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="asnsTable" class="table responsive-utilities jambo_table">
-            <thead>
-                <tr class="headings">
-                    <th>asn</th>
-                    <th>cachegroup</th>
-                </tr>
-            </thead>
-            <tbody>
-                <tr ng-click="editASN(asn.id)" ng-repeat="asn in ::asns">
-                    <td>{{::asn.asn}}</td>
-                    <td>{{::asn.cachegroup}}</td>
-                </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParametersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParametersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParametersController.js
deleted file mode 100644
index 3bab653..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParametersController.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableCacheGroupParametersController = function(cacheGroup, cacheGroupParameters, $scope, $state, $uibModal, locationUtils, cacheGroupParameterService) {
-
-	$scope.cacheGroup = cacheGroup;
-
-	$scope.cacheGroupParameters = cacheGroupParameters;
-
-	$scope.removeParameter = function(paramId) {
-		cacheGroupParameterService.unlinkCacheGroupParameter(cacheGroup.id, paramId)
-			.then(
-				function() {
-					$scope.refresh();
-				}
-			);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.selectParams = function() {
-		var modalInstance = $uibModal.open({
-			templateUrl: 'common/modules/table/cacheGroupParameters/table.cacheGroupParamsUnassigned.tpl.html',
-			controller: 'TableCacheGroupParamsUnassignedController',
-			size: 'lg',
-			resolve: {
-				cg: function() {
-					return cacheGroup;
-				},
-				parameters: function(parameterService) {
-					return parameterService.getCacheGroupUnassignedParams(cacheGroup.id);
-				}
-			}
-		});
-		modalInstance.result.then(function(selectedParams) {
-			var massagedArray = [];
-			for (i = 0; i < selectedParams.length; i++) {
-				massagedArray.push( { cacheGroupId: cacheGroup.id, parameterId: selectedParams[i] } );
-			}
-			cacheGroupParameterService.linkCacheGroupParameters(massagedArray)
-				.then(
-					function() {
-						$scope.refresh();
-					}
-				);
-		}, function () {
-			// do nothing
-		});
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#parametersTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableCacheGroupParametersController.$inject = ['cacheGroup', 'cacheGroupParameters', '$scope', '$state', '$uibModal', 'locationUtils', 'cacheGroupParameterService'];
-module.exports = TableCacheGroupParametersController;



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroupAsns/TableCacheGroupAsnsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupAsns/TableCacheGroupAsnsController.js b/traffic_portal/app/src/common/modules/table/cacheGroupAsns/TableCacheGroupAsnsController.js
new file mode 100644
index 0000000..f5b9dc0
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroupAsns/TableCacheGroupAsnsController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableCacheGroupAsnsController = function(cacheGroup, asns, $scope, $state, locationUtils) {
+
+	$scope.cacheGroup = cacheGroup;
+
+	$scope.asns = asns;
+
+	$scope.editASN = function(id) {
+		locationUtils.navigateToPath('/admin/asns/' + id);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#parametersTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableCacheGroupAsnsController.$inject = ['cacheGroup', 'asns', '$scope', '$state', 'locationUtils'];
+module.exports = TableCacheGroupAsnsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroupAsns/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupAsns/index.js b/traffic_portal/app/src/common/modules/table/cacheGroupAsns/index.js
new file mode 100644
index 0000000..638d901
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroupAsns/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.cacheGroupAsns', [])
+	.controller('TableCacheGroupAsnsController', require('./TableCacheGroupAsnsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroupAsns/table.cacheGroupAsns.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupAsns/table.cacheGroupAsns.tpl.html b/traffic_portal/app/src/common/modules/table/cacheGroupAsns/table.cacheGroupAsns.tpl.html
new file mode 100644
index 0000000..59b8301
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroupAsns/table.cacheGroupAsns.tpl.html
@@ -0,0 +1,50 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/cache-groups')">Cache Groups</a></li>
+            <li><a ng-click="navigateToPath('/configure/cache-groups/' + cacheGroup.id)">{{cacheGroup.name}}</a></li>
+            <li class="active">ASNs</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="asnsTable" class="table responsive-utilities jambo_table">
+            <thead>
+                <tr class="headings">
+                    <th>asn</th>
+                    <th>cachegroup</th>
+                </tr>
+            </thead>
+            <tbody>
+                <tr ng-click="editASN(asn.id)" ng-repeat="asn in ::asns">
+                    <td>{{::asn.asn}}</td>
+                    <td>{{::asn.cachegroup}}</td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParametersController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParametersController.js b/traffic_portal/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParametersController.js
new file mode 100644
index 0000000..3bab653
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParametersController.js
@@ -0,0 +1,82 @@
+/*
+ * 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 TableCacheGroupParametersController = function(cacheGroup, cacheGroupParameters, $scope, $state, $uibModal, locationUtils, cacheGroupParameterService) {
+
+	$scope.cacheGroup = cacheGroup;
+
+	$scope.cacheGroupParameters = cacheGroupParameters;
+
+	$scope.removeParameter = function(paramId) {
+		cacheGroupParameterService.unlinkCacheGroupParameter(cacheGroup.id, paramId)
+			.then(
+				function() {
+					$scope.refresh();
+				}
+			);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.selectParams = function() {
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/table/cacheGroupParameters/table.cacheGroupParamsUnassigned.tpl.html',
+			controller: 'TableCacheGroupParamsUnassignedController',
+			size: 'lg',
+			resolve: {
+				cg: function() {
+					return cacheGroup;
+				},
+				parameters: function(parameterService) {
+					return parameterService.getCacheGroupUnassignedParams(cacheGroup.id);
+				}
+			}
+		});
+		modalInstance.result.then(function(selectedParams) {
+			var massagedArray = [];
+			for (i = 0; i < selectedParams.length; i++) {
+				massagedArray.push( { cacheGroupId: cacheGroup.id, parameterId: selectedParams[i] } );
+			}
+			cacheGroupParameterService.linkCacheGroupParameters(massagedArray)
+				.then(
+					function() {
+						$scope.refresh();
+					}
+				);
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#parametersTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableCacheGroupParametersController.$inject = ['cacheGroup', 'cacheGroupParameters', '$scope', '$state', '$uibModal', 'locationUtils', 'cacheGroupParameterService'];
+module.exports = TableCacheGroupParametersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParamsUnassignedController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParamsUnassignedController.js b/traffic_portal/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParamsUnassignedController.js
new file mode 100644
index 0000000..d7f0c9c
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParamsUnassignedController.js
@@ -0,0 +1,69 @@
+/*
+ * 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 TableProfileParamsUnassignedController = function(cg, parameters, $scope, $uibModalInstance) {
+
+	var selectedParams = [];
+
+	$scope.cg = cg;
+
+	$scope.unassignedParams = parameters;
+
+	var addParam = function(paramId) {
+		if (_.indexOf(selectedParams, paramId) == -1) {
+			selectedParams.push(paramId);
+		}
+	};
+
+	var removeParam = function(paramId) {
+		selectedParams = _.without(selectedParams, paramId);
+	};
+
+	$scope.updateParams = function($event, paramId) {
+		var checkbox = $event.target;
+		if (checkbox.checked) {
+			addParam(paramId);
+		} else {
+			removeParam(paramId);
+		}
+	};
+
+	$scope.submit = function() {
+		$uibModalInstance.close(selectedParams);
+	};
+
+	$scope.cancel = function () {
+		$uibModalInstance.dismiss('cancel');
+	};
+
+	angular.element(document).ready(function () {
+		$('#cgParamsUnassignedTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"order": [[ 1, 'asc' ]],
+			"columnDefs": [
+				{ "width": "5%", "targets": 0 }
+			]
+		});
+	});
+
+};
+
+TableProfileParamsUnassignedController.$inject = ['cg', 'parameters', '$scope', '$uibModalInstance'];
+module.exports = TableProfileParamsUnassignedController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroupParameters/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupParameters/index.js b/traffic_portal/app/src/common/modules/table/cacheGroupParameters/index.js
new file mode 100644
index 0000000..5069cef
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroupParameters/index.js
@@ -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.
+ */
+
+module.exports = angular.module('trafficPortal.table.cacheGroupParameters', [])
+	.controller('TableCacheGroupParametersController', require('./TableCacheGroupParametersController'))
+	.controller('TableCacheGroupParamsUnassignedController', require('./TableCacheGroupParamsUnassignedController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParameters.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParameters.tpl.html b/traffic_portal/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParameters.tpl.html
new file mode 100644
index 0000000..04feb92
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParameters.tpl.html
@@ -0,0 +1,55 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/cache-groups')">Cache Groups</a></li>
+            <li><a ng-click="navigateToPath('/configure/cache-groups/' + cacheGroup.id)">{{::cacheGroup.name}}</a></li>
+            <li class="active">Parameters</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-primary" title="Link Parameters to Cache Group" ng-click="selectParams()"><i class="fa fa-link"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="parametersTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+                <th>configFile</th>
+                <th>value</th>
+                <th></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="parameter in ::cacheGroupParameters">
+                <td>{{::parameter.name}}</td>
+                <td>{{::parameter.configFile}}</td>
+                <td>{{::parameter.value}}</td>
+                <td><button type="button" class="btn btn-link" title="Unlink Parameter from Cache Group" ng-click="removeParameter(parameter.id)"><i class="fa fa-chain-broken"></i></button></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParamsUnassigned.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParamsUnassigned.tpl.html b/traffic_portal/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParamsUnassigned.tpl.html
new file mode 100644
index 0000000..05ac1ed
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParamsUnassigned.tpl.html
@@ -0,0 +1,49 @@
+<!--
+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="modal-header">
+    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+    <h3 class="modal-title">Link Parameters to {{::cg.name}}</h3>
+</div>
+<div class="modal-body">
+    <table id="cgParamsUnassignedTable" class="table responsive-utilities jambo_table" style="table-layout:fixed; width:100%;">
+        <thead>
+        <tr class="headings">
+            <th></th>
+            <th>name</th>
+            <th>configFile</th>
+            <th>value</th>
+        </tr>
+        </thead>
+        <tbody>
+        <tr ng-repeat="parameter in ::unassignedParams">
+            <td><input type="checkbox" ng-click="updateParams($event, parameter.id)"></td>
+            <td>{{::parameter.name}}</td>
+            <td>{{::parameter.configFile}}</td>
+            <td>{{::parameter.value}}</td>
+        </tr>
+        </tbody>
+    </table>
+</div>
+<div class="modal-footer">
+    <button class="btn btn-link" ng-click="cancel()">cancel</button>
+    <button class="btn btn-primary" ng-click="submit()">Submit</button>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js b/traffic_portal/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js
new file mode 100644
index 0000000..26c0198
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js
@@ -0,0 +1,119 @@
+/*
+ * 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 TableCacheGroupsServersController = function(cacheGroup, servers, $scope, $state, $uibModal, cacheGroupService, locationUtils, serverUtils) {
+
+	$scope.cacheGroup = cacheGroup;
+
+	$scope.servers = servers;
+
+	var queueServerUpdates = function(cacheGroup, cdnId) {
+		cacheGroupService.queueServerUpdates(cacheGroup.id, cdnId)
+			.then(
+				function() {
+					$scope.refresh();
+				}
+			);
+	};
+
+	var clearServerUpdates = function(cacheGroup, cdnId) {
+		cacheGroupService.clearServerUpdates(cacheGroup.id, cdnId)
+			.then(
+				function() {
+					$scope.refresh();
+				}
+			);
+	};
+
+	$scope.editServer = function(id) {
+		locationUtils.navigateToPath('/configure/servers/' + id);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.confirmQueueServerUpdates = function(cacheGroup) {
+		var params = {
+			title: 'Queue Server Updates: ' + cacheGroup.name,
+			message: "Please select a CDN"
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+			controller: 'DialogSelectController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				},
+				collection: function(cdnService) {
+					return cdnService.getCDNs();
+				}
+			}
+		});
+		modalInstance.result.then(function(cdn) {
+			queueServerUpdates(cacheGroup, cdn.id);
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.confirmClearServerUpdates = function(cacheGroup) {
+		var params = {
+			title: 'Clear Server Updates: ' + cacheGroup.name,
+			message: "Please select a CDN"
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+			controller: 'DialogSelectController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				},
+				collection: function(cdnService) {
+					return cdnService.getCDNs();
+				}
+			}
+		});
+		modalInstance.result.then(function(cdn) {
+			clearServerUpdates(cacheGroup, cdn.id);
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	$scope.isOffline = serverUtils.isOffline;
+
+	$scope.offlineReason = serverUtils.offlineReason;
+
+	angular.element(document).ready(function () {
+		$('#serversTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableCacheGroupsServersController.$inject = ['cacheGroup', 'servers', '$scope', '$state', '$uibModal', 'cacheGroupService', 'locationUtils', 'serverUtils'];
+module.exports = TableCacheGroupsServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroupServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupServers/index.js b/traffic_portal/app/src/common/modules/table/cacheGroupServers/index.js
new file mode 100644
index 0000000..de377a5
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroupServers/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.cacheGroupServers', [])
+	.controller('TableCacheGroupServersController', require('./TableCacheGroupServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroupServers/table.cacheGroupServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupServers/table.cacheGroupServers.tpl.html b/traffic_portal/app/src/common/modules/table/cacheGroupServers/table.cacheGroupServers.tpl.html
new file mode 100644
index 0000000..ad3df4a
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroupServers/table.cacheGroupServers.tpl.html
@@ -0,0 +1,90 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/cache-groups')">Cache Groups</a></li>
+            <li><a ng-click="navigateToPath('/configure/cache-groups/' + cacheGroup.id)">{{::cacheGroup.name}}</a></li>
+            <li class="active">Servers</li>
+        </ol>
+        <div class="pull-right">
+            <div class="btn-group" role="group" uib-dropdown is-open="queue.isopen">
+                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    Queue Updates&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="confirmQueueServerUpdates(cacheGroup)"><i class="fa fa-flag"></i>&nbsp;&nbsp;Queue {{::cacheGroup.name}} Server Updates</a></li>
+                    <li role="menuitem"><a ng-click="confirmClearServerUpdates(cacheGroup)"><i class="fa fa-ban"></i>&nbsp;&nbsp;Clear {{::cacheGroup.name}} Server Updates</a></li>
+                </ul>
+            </div>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="serversTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Update?</th>
+                <th>hostName</th>
+                <th>domainName</th>
+                <th>cdn</th>
+                <th>cachegroup</th>
+                <th>type</th>
+                <th>location</th>
+                <th>ipAddress</th>
+                <th>ip6Address</th>
+                <th>status</th>
+                <th>profile</th>
+                <th>iloIpAddress</th>
+                <th>iloIpGateway</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editServer(server.id)" ng-repeat="server in ::servers" ng-class="::{'active': server.updPending}">
+                <td class="update-column">
+                    <i class="fa fa-flag" title="Server Update Pending" ng-if="server.updPending"></i>
+                </td>
+                <td>{{::server.hostName}}</td>
+                <td>{{::server.domainName}}</td>
+                <td>{{::server.cdnName}}</td>
+                <td>{{::server.cachegroup}}</td>
+                <td>{{::server.type}}</td>
+                <td>{{::server.physLocation}}</td>
+                <td>{{::server.ipAddress}}</td>
+                <td>{{::server.ip6Address}}</td>
+                <td>
+                    <span ng-if="!isOffline(server.status)">{{::server.status}}</span>
+                    <span ng-if="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
+                </td>
+                <td>{{::server.profile}}</td>
+                <td>{{::server.iloIpAddress}}</td>
+                <td>{{::server.iloIpGateway}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroupStaticDnsEntries/TableCacheGroupStaticDnsEntriesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupStaticDnsEntries/TableCacheGroupStaticDnsEntriesController.js b/traffic_portal/app/src/common/modules/table/cacheGroupStaticDnsEntries/TableCacheGroupStaticDnsEntriesController.js
new file mode 100644
index 0000000..889fc5c
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroupStaticDnsEntries/TableCacheGroupStaticDnsEntriesController.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.
+ */
+
+var TableCacheGroupsStaticDnsEntriesController = function(cacheGroup, staticDnsEntries, $scope, $state, locationUtils) {
+
+	$scope.cacheGroup = cacheGroup;
+
+	$scope.staticDnsEntries = staticDnsEntries;
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#staticDnsEntriesTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableCacheGroupsStaticDnsEntriesController.$inject = ['cacheGroup', 'staticDnsEntries', '$scope', '$state', 'locationUtils'];
+module.exports = TableCacheGroupsStaticDnsEntriesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroupStaticDnsEntries/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupStaticDnsEntries/index.js b/traffic_portal/app/src/common/modules/table/cacheGroupStaticDnsEntries/index.js
new file mode 100644
index 0000000..6a8a45e
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroupStaticDnsEntries/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.cacheGroupStaticDnsEntries', [])
+	.controller('TableCacheGroupStaticDnsEntriesController', require('./TableCacheGroupStaticDnsEntriesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroupStaticDnsEntries/table.cacheGroupStaticDnsEntries.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroupStaticDnsEntries/table.cacheGroupStaticDnsEntries.tpl.html b/traffic_portal/app/src/common/modules/table/cacheGroupStaticDnsEntries/table.cacheGroupStaticDnsEntries.tpl.html
new file mode 100644
index 0000000..e5d8346
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroupStaticDnsEntries/table.cacheGroupStaticDnsEntries.tpl.html
@@ -0,0 +1,58 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/cache-groups')">Cache Groups</a></li>
+            <li><a ng-click="navigateToPath('/configure/cache-groups/' + cacheGroup.id)">{{::cacheGroup.name}}</a></li>
+            <li class="active">Static DNS Entries</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="staticDnsEntriesTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>host</th>
+                <th>address</th>
+                <th>type</th>
+                <th>ttl</th>
+                <th>deliveryservice</th>
+                <th>cachegroup</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="staticDnsEntry in ::staticDnsEntries">
+                <td>{{::staticDnsEntry.host}}</td>
+                <td>{{::staticDnsEntry.address}}</td>
+                <td>{{::staticDnsEntry.type}}</td>
+                <td>{{::staticDnsEntry.ttl}}</td>
+                <td>{{::staticDnsEntry.deliveryservice}}</td>
+                <td>{{::staticDnsEntry.cachegroup}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroups/TableCacheGroupsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroups/TableCacheGroupsController.js b/traffic_portal/app/src/common/modules/table/cacheGroups/TableCacheGroupsController.js
new file mode 100644
index 0000000..c1a2857
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroups/TableCacheGroupsController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableCacheGroupsController = function(cacheGroups, $scope, $state, locationUtils) {
+
+    $scope.cacheGroups = cacheGroups;
+
+    $scope.editCacheGroup = function(id) {
+        locationUtils.navigateToPath('/configure/cache-groups/' + id);
+    };
+
+    $scope.createCacheGroup = function() {
+        locationUtils.navigateToPath('/configure/cache-groups/new');
+    };
+
+    $scope.refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+    angular.element(document).ready(function () {
+        $('#cacheGroupsTable').dataTable({
+            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+            "iDisplayLength": 25,
+            "aaSorting": []
+        });
+    });
+
+};
+
+TableCacheGroupsController.$inject = ['cacheGroups', '$scope', '$state', 'locationUtils'];
+module.exports = TableCacheGroupsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroups/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroups/index.js b/traffic_portal/app/src/common/modules/table/cacheGroups/index.js
new file mode 100644
index 0000000..141faf4
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroups/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.cacheGroups', [])
+    .controller('TableCacheGroupsController', require('./TableCacheGroupsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cacheGroups/table.cacheGroups.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cacheGroups/table.cacheGroups.tpl.html b/traffic_portal/app/src/common/modules/table/cacheGroups/table.cacheGroups.tpl.html
new file mode 100644
index 0000000..2e97ac8
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cacheGroups/table.cacheGroups.tpl.html
@@ -0,0 +1,54 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Cache Groups</li>
+        </ol>
+        <div class="pull-right" role="group" ng-if="!settings.isNew">
+            <button class="btn btn-primary" title="Create Cache Group" ng-click="createCacheGroup()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="cacheGroupsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+                <th>shortName</th>
+                <th>type</th>
+                <th>latitude</th>
+                <th>longitude</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editCacheGroup(cacheGroup.id)" ng-repeat="cacheGroup in ::cacheGroups">
+                <td>{{::cacheGroup.name}}</td>
+                <td>{{::cacheGroup.shortName}}</td>
+                <td>{{::cacheGroup.typeName}}</td>
+                <td>{{::cacheGroup.latitude}}</td>
+                <td>{{::cacheGroup.longitude}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cdnDeliveryServices/TableCDNDeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cdnDeliveryServices/TableCDNDeliveryServicesController.js b/traffic_portal/app/src/common/modules/table/cdnDeliveryServices/TableCDNDeliveryServicesController.js
new file mode 100644
index 0000000..be8505b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cdnDeliveryServices/TableCDNDeliveryServicesController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableCDNDeliveryServicesController = function(cdn, deliveryServices, $scope, $state, locationUtils) {
+
+	$scope.cdn = cdn;
+
+	$scope.deliveryServices = deliveryServices;
+
+	$scope.editDeliveryService = function(ds) {
+		locationUtils.navigateToPath('/configure/delivery-services/' + ds.id + '?type=' + ds.type);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#deliveryServicesTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableCDNDeliveryServicesController.$inject = ['cdn', 'deliveryServices', '$scope', '$state', 'locationUtils'];
+module.exports = TableCDNDeliveryServicesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cdnDeliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cdnDeliveryServices/index.js b/traffic_portal/app/src/common/modules/table/cdnDeliveryServices/index.js
new file mode 100644
index 0000000..80f823d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cdnDeliveryServices/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.cdnDeliveryServices', [])
+	.controller('TableCDNDeliveryServicesController', require('./TableCDNDeliveryServicesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cdnDeliveryServices/table.cdnDeliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cdnDeliveryServices/table.cdnDeliveryServices.tpl.html b/traffic_portal/app/src/common/modules/table/cdnDeliveryServices/table.cdnDeliveryServices.tpl.html
new file mode 100644
index 0000000..ac8dffd
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cdnDeliveryServices/table.cdnDeliveryServices.tpl.html
@@ -0,0 +1,69 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/cdns')">CDNs</a></li>
+            <li><a ng-click="navigateToPath('/admin/cdns/' + cdn.id)">{{cdn.name}}</a></li>
+            <li class="active">Delivery Services</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="deliveryServicesTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>xmlId</th>
+                <th>orgServerFqdn</th>
+                <th>active</th>
+                <th>type</th>
+                <th>protocol</th>
+                <th>cdn</th>
+                <th>ipv6RoutingEnabled</th>
+                <th>dscp</th>
+                <th>signed</th>
+                <th>qstringIgnore</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editDeliveryService(deliveryService)" ng-repeat="deliveryService in ::deliveryServices">
+                <td>{{::deliveryService.xmlId}}</td>
+                <td>{{::deliveryService.orgServerFqdn}}</td>
+                <td>{{::deliveryService.active}}</td>
+                <td>{{::deliveryService.type}}</td>
+                <td>{{::deliveryService.protocol}}</td>
+                <td>{{::deliveryService.cdnName}}</td>
+                <td>{{::deliveryService.ipv6RoutingEnabled}}</td>
+                <td>{{::deliveryService.dscp}}</td>
+                <td>{{::deliveryService.signed}}</td>
+                <td>{{::deliveryService.qstringIgnore}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cdnProfiles/TableCDNProfilesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cdnProfiles/TableCDNProfilesController.js b/traffic_portal/app/src/common/modules/table/cdnProfiles/TableCDNProfilesController.js
new file mode 100644
index 0000000..04785a1
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cdnProfiles/TableCDNProfilesController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableCDNProfilesController = function(cdn, profiles, $scope, $state, locationUtils) {
+
+	$scope.cdn = cdn;
+
+	$scope.profiles = profiles;
+
+	$scope.editProfile = function(id) {
+		locationUtils.navigateToPath('/admin/profiles/' + id);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#profilesTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableCDNProfilesController.$inject = ['cdn', 'profiles', '$scope', '$state', 'locationUtils'];
+module.exports = TableCDNProfilesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cdnProfiles/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cdnProfiles/index.js b/traffic_portal/app/src/common/modules/table/cdnProfiles/index.js
new file mode 100644
index 0000000..c255320
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cdnProfiles/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.cdnProfiles', [])
+	.controller('TableCDNProfilesController', require('./TableCDNProfilesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cdnProfiles/table.cdnProfiles.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cdnProfiles/table.cdnProfiles.tpl.html b/traffic_portal/app/src/common/modules/table/cdnProfiles/table.cdnProfiles.tpl.html
new file mode 100644
index 0000000..b054858
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cdnProfiles/table.cdnProfiles.tpl.html
@@ -0,0 +1,55 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/cdns')">CDNs</a></li>
+            <li><a ng-click="navigateToPath('/admin/cdns/' + cdn.id)">{{::cdn.name}}</a></li>
+            <li class="active">Profiles</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="profilesTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+                <th>description</th>
+                <th>cdn</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editProfile(profile.id)" ng-repeat="profile in ::profiles">
+                <td>{{::profile.name}}</td>
+                <td>{{::profile.description}}</td>
+                <td>{{::profile.cdnName}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cdnServers/TableCDNServersController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cdnServers/TableCDNServersController.js b/traffic_portal/app/src/common/modules/table/cdnServers/TableCDNServersController.js
new file mode 100644
index 0000000..8670fdc
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cdnServers/TableCDNServersController.js
@@ -0,0 +1,69 @@
+/*
+ * 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 TableCDNServersController = function(cdn, servers, $scope, $state, locationUtils, serverUtils, cdnService) {
+
+	$scope.cdn = cdn;
+
+	$scope.servers = servers;
+
+	$scope.editServer = function(id) {
+		locationUtils.navigateToPath('/configure/servers/' + id);
+	};
+
+	$scope.queueServerUpdates = function(cdn) {
+		cdnService.queueServerUpdates(cdn.id)
+			.then(
+				function() {
+					$scope.refresh();
+				}
+			);
+	};
+
+	$scope.clearServerUpdates = function(cdn) {
+		cdnService.clearServerUpdates(cdn.id)
+			.then(
+				function() {
+					$scope.refresh();
+				}
+			);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.isOffline = serverUtils.isOffline;
+
+	$scope.offlineReason = serverUtils.offlineReason;
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#serversTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableCDNServersController.$inject = ['cdn', 'servers', '$scope', '$state', 'locationUtils', 'serverUtils', 'cdnService'];
+module.exports = TableCDNServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cdnServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cdnServers/index.js b/traffic_portal/app/src/common/modules/table/cdnServers/index.js
new file mode 100644
index 0000000..22f950b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cdnServers/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.cdnServers', [])
+	.controller('TableCDNServersController', require('./TableCDNServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cdnServers/table.cdnServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cdnServers/table.cdnServers.tpl.html b/traffic_portal/app/src/common/modules/table/cdnServers/table.cdnServers.tpl.html
new file mode 100644
index 0000000..da6cf1e
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cdnServers/table.cdnServers.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 class="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/cdns')">CDNs</a></li>
+            <li><a ng-click="navigateToPath('/admin/cdns/' + cdn.id)">{{::cdn.name}}</a></li>
+            <li class="active">Servers</li>
+        </ol>
+        <div class="pull-right">
+            <div class="btn-group" role="group" uib-dropdown is-open="queue.isopen">
+                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    Queue Updates&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="queueServerUpdates(cdn)">Queue {{cdn.name}} Server Updates</a></li>
+                    <li role="menuitem"><a ng-click="clearServerUpdates(cdn)">Clear {{cdn.name}} Server Updates</a></li>
+                </ul>
+            </div>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="serversTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Update?</th>
+                <th>hostName</th>
+                <th>domainName</th>
+                <th>ipAddress</th>
+                <th>ip6Address</th>
+                <th>status</th>
+                <th>type</th>
+                <th>profile</th>
+                <th>cdn</th>
+                <th>cachegroup</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editServer(server.id)" ng-repeat="server in ::servers" ng-class="::{'active': server.updPending}">
+                <td class="update-column">
+                    <i class="fa fa-flag" ng-if="server.updPending"></i>
+                    <i class="fa fa-ban" ng-if="!server.updPending"></i>
+                </td>
+                <td>{{::server.hostName}}</td>
+                <td>{{::server.domainName}}</td>
+                <td>{{::server.ipAddress}}</td>
+                <td>{{::server.ip6Address}}</td>
+                <td>
+                    <span ng-if="!isOffline(server.status)">{{::server.status}}</span>
+                    <span ng-if="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
+                </td>
+                <td>{{::server.type}}</td>
+                <td>{{::server.profile}}</td>
+                <td>{{::server.cdnName}}</td>
+                <td>{{::server.cachegroup}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cdns/TableCDNsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cdns/TableCDNsController.js b/traffic_portal/app/src/common/modules/table/cdns/TableCDNsController.js
new file mode 100644
index 0000000..094a81a
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cdns/TableCDNsController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableCDNsController = function(cdns, $scope, $state, locationUtils) {
+
+    $scope.cdns = cdns;
+
+    $scope.editCDN = function(id) {
+        locationUtils.navigateToPath('/admin/cdns/' + id);
+    };
+
+    $scope.createCDN = function() {
+        locationUtils.navigateToPath('/admin/cdns/new');
+    };
+
+    $scope.refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+    angular.element(document).ready(function () {
+        $('#cdnsTable').dataTable({
+            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+            "iDisplayLength": 25,
+            "aaSorting": []
+        });
+    });
+
+};
+
+TableCDNsController.$inject = ['cdns', '$scope', '$state', 'locationUtils'];
+module.exports = TableCDNsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cdns/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cdns/index.js b/traffic_portal/app/src/common/modules/table/cdns/index.js
new file mode 100644
index 0000000..9fa0a3d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cdns/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.cdns', [])
+    .controller('TableCDNsController', require('./TableCDNsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/cdns/table.cdns.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/cdns/table.cdns.tpl.html b/traffic_portal/app/src/common/modules/table/cdns/table.cdns.tpl.html
new file mode 100644
index 0000000..f8d1fab
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/cdns/table.cdns.tpl.html
@@ -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.
+-->
+
+<div class="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">CDNs</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Create CDN" ng-click="createCDN()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="cdnsTable" class="table responsive-utilities jambo_table">
+            <thead>
+                <tr class="headings">
+                    <th>name</th>
+                    <th>domainName</th>
+                    <th>dnssecEnabled</th>
+                </tr>
+            </thead>
+            <tbody>
+                <tr ng-click="editCDN(cdn.id)" ng-repeat="cdn in ::cdns">
+                    <td>{{::cdn.name}}</td>
+                    <td>{{::cdn.domainName}}</td>
+                    <td>{{::cdn.dnssecEnabled}}</td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/changeLogs/TableChangeLogsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/changeLogs/TableChangeLogsController.js b/traffic_portal/app/src/common/modules/table/changeLogs/TableChangeLogsController.js
new file mode 100644
index 0000000..18a5cd9
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/changeLogs/TableChangeLogsController.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.
+ */
+
+var TableChangeLogsController = function(changeLogs, $scope, $state, locationUtils) {
+
+	$scope.changeLogs = changeLogs;
+
+	$scope.getRelativeTime = function(date) {
+		return moment(date).fromNow();
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	angular.element(document).ready(function () {
+		$('#changeLogsTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableChangeLogsController.$inject = ['changeLogs', '$scope', '$state', 'locationUtils'];
+module.exports = TableChangeLogsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/changeLogs/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/changeLogs/index.js b/traffic_portal/app/src/common/modules/table/changeLogs/index.js
new file mode 100644
index 0000000..541f117
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/changeLogs/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.changeLogs', [])
+	.controller('TableChangeLogsController', require('./TableChangeLogsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/changeLogs/table.changeLogs.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/changeLogs/table.changeLogs.tpl.html b/traffic_portal/app/src/common/modules/table/changeLogs/table.changeLogs.tpl.html
new file mode 100644
index 0000000..40d33ff
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/changeLogs/table.changeLogs.tpl.html
@@ -0,0 +1,54 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Change Logs</li>
+        </ol>
+        <div class="pull-right" role="group">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="changeLogsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>occurred</th>
+                <th>timestamp (UTC)</th>
+                <th>user</th>
+                <th>type</th>
+                <th>message</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="changeLog in ::changeLogs">
+                <td>{{::getRelativeTime(changeLog.lastUpdated)}}</td>
+                <td>{{::changeLog.lastUpdated}}</td>
+                <td>{{::changeLog.user}}</td>
+                <td>{{::changeLog.level}}</td>
+                <td>{{::changeLog.message}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/TableDeliveryServiceJobsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/TableDeliveryServiceJobsController.js b/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/TableDeliveryServiceJobsController.js
new file mode 100644
index 0000000..58f2deb
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/TableDeliveryServiceJobsController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableDeliveryServiceJobsController = function(deliveryService, jobs, $scope, $state, $location, locationUtils) {
+
+	$scope.deliveryService = deliveryService;
+
+	$scope.dsJobs = jobs;
+
+	$scope.createJob = function() {
+		$location.path($location.path() + '/new');
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#dsJobsTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableDeliveryServiceJobsController.$inject = ['deliveryService', 'jobs', '$scope', '$state', '$location', 'locationUtils'];
+module.exports = TableDeliveryServiceJobsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/index.js b/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/index.js
new file mode 100644
index 0000000..b5024a8
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.deliveryServiceJobs', [])
+	.controller('TableDeliveryServiceJobsController', require('./TableDeliveryServiceJobsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html b/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html
new file mode 100644
index 0000000..ea3967c
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html
@@ -0,0 +1,55 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
+            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
+            <li class="active">Invalidate Content Jobs</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Create Invalidate Content Job" ng-click="createJob(deliveryService.id)"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="dsJobsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>assetUrl</th>
+                <th>parameters</th>
+                <th>start (UTC)</th>
+                <th>createdBy</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="dsJob in ::dsJobs">
+                <td>{{::dsJob.assetUrl}}</td>
+                <td>{{::dsJob.parameters}}</td>
+                <td>{{::dsJob.startTime}}</td>
+                <td>{{::dsJob.createdBy}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/TableDeliveryServiceRegexesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/TableDeliveryServiceRegexesController.js b/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/TableDeliveryServiceRegexesController.js
new file mode 100644
index 0000000..736c265
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/TableDeliveryServiceRegexesController.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.
+ */
+
+var TableDeliveryServiceRegexesController = function(deliveryService, regexes, $scope, $state, locationUtils) {
+
+	$scope.deliveryService = deliveryService;
+
+	$scope.regexes = regexes;
+
+	$scope.editRegex = function(dsId, regexId) {
+		locationUtils.navigateToPath('/configure/delivery-services/' + dsId + '/regexes/' + regexId);
+	};
+
+	$scope.createRegex = function(dsId) {
+		locationUtils.navigateToPath('/configure/delivery-services/' + dsId + '/regexes/new');
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#regexesTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableDeliveryServiceRegexesController.$inject = ['deliveryService', 'regexes', '$scope', '$state', 'locationUtils'];
+module.exports = TableDeliveryServiceRegexesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/index.js b/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/index.js
new file mode 100644
index 0000000..5db1048
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/deliveryServiceRegexes/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.deliveryServiceRegexes', [])
+	.controller('TableDeliveryServiceRegexesController', require('./TableDeliveryServiceRegexesController'));



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

Posted by da...@apache.org.
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



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

Posted by da...@apache.org.
promotes TO experimental UI to the new Traffic Portal


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/commit/3195e0cc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/tree/3195e0cc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/diff/3195e0cc

Branch: refs/heads/master
Commit: 3195e0cc85dcf1dca22ad153f29b938e7d64c1e5
Parents: 2303ddd
Author: Jeremy Mitchell <mi...@gmail.com>
Authored: Fri Jun 30 15:50:30 2017 -0600
Committer: Dan Kirkwood <da...@gmail.com>
Committed: Fri Jun 30 16:33:10 2017 -0600

----------------------------------------------------------------------
 traffic_ops/experimental/ui/.bowerrc            |    3 -
 traffic_ops/experimental/ui/.gitattributes      |    1 -
 traffic_ops/experimental/ui/.gitignore          |    6 -
 traffic_ops/experimental/ui/.jshintrc           |   23 -
 traffic_ops/experimental/ui/Dockerfile          |   24 -
 traffic_ops/experimental/ui/Gruntfile.js        |   93 -
 traffic_ops/experimental/ui/README.md           |   54 -
 traffic_ops/experimental/ui/app/src/app.js      |  379 --
 .../ui/app/src/assets/css/custom.css            |   20 -
 .../src/assets/css/jquery.dataTables.min.css    |    1 -
 .../ui/app/src/assets/fonts/FontAwesome.otf     |  Bin 109688 -> 0 bytes
 .../src/assets/fonts/fontawesome-webfont.eot    |  Bin 70807 -> 0 bytes
 .../src/assets/fonts/fontawesome-webfont.ttf    |  Bin 142072 -> 0 bytes
 .../src/assets/fonts/fontawesome-webfont.woff   |  Bin 83588 -> 0 bytes
 .../src/assets/fonts/fontawesome-webfont.woff2  |  Bin 66624 -> 0 bytes
 .../ui/app/src/assets/images/favicon.png        |  Bin 49588 -> 0 bytes
 .../ui/app/src/assets/images/sort_asc.png       |  Bin 160 -> 0 bytes
 .../app/src/assets/images/sort_asc_disabled.png |  Bin 148 -> 0 bytes
 .../ui/app/src/assets/images/sort_both.png      |  Bin 201 -> 0 bytes
 .../ui/app/src/assets/images/sort_desc.png      |  Bin 158 -> 0 bytes
 .../src/assets/images/sort_desc_disabled.png    |  Bin 146 -> 0 bytes
 .../app/src/assets/js/dataTables.tableTools.js  | 3084 -------------
 .../app/src/assets/js/jquery.dataTables.min.js  |  166 -
 .../ui/app/src/assets/js/ng-map_1.17.6.min.js   |   26 -
 .../app/src/assets/js/underscore-min_1.8.3.js   |    6 -
 .../ui/app/src/common/api/ASNService.js         |   70 -
 .../ui/app/src/common/api/AuthService.js        |   71 -
 .../ui/app/src/common/api/CDNService.js         |  216 -
 .../common/api/CacheGroupParameterService.js    |   53 -
 .../ui/app/src/common/api/CacheGroupService.js  |  115 -
 .../ui/app/src/common/api/CacheStatsService.js  |   63 -
 .../ui/app/src/common/api/ChangeLogService.js   |   35 -
 .../common/api/DeliveryServiceRegexService.js   |   70 -
 .../src/common/api/DeliveryServiceService.js    |  103 -
 .../ui/app/src/common/api/DivisionService.js    |   70 -
 .../ui/app/src/common/api/HttpService.js        |   89 -
 .../ui/app/src/common/api/JobService.js         |   33 -
 .../ui/app/src/common/api/ParameterService.js   |   82 -
 .../app/src/common/api/PhysLocationService.js   |   71 -
 .../src/common/api/ProfileParameterService.js   |   49 -
 .../ui/app/src/common/api/ProfileService.js     |   79 -
 .../ui/app/src/common/api/RegexService.js       |   29 -
 .../ui/app/src/common/api/RegionService.js      |   69 -
 .../ui/app/src/common/api/RoleService.js        |   57 -
 .../ui/app/src/common/api/ServerService.js      |  138 -
 .../app/src/common/api/StaticDnsEntryService.js |   29 -
 .../ui/app/src/common/api/StatusService.js      |   70 -
 .../ui/app/src/common/api/TenantService.js      |   69 -
 .../app/src/common/api/TrafficPortalService.js  |   57 -
 .../ui/app/src/common/api/TypeService.js        |   70 -
 .../ui/app/src/common/api/UserService.js        |  144 -
 .../experimental/ui/app/src/common/api/index.js |   46 -
 .../common/directives/match/MatchDirective.js   |   33 -
 .../ui/app/src/common/directives/match/index.js |   23 -
 .../ui/app/src/common/filters/OffsetFilter.js   |   30 -
 .../ui/app/src/common/filters/PercentFilter.js  |   35 -
 .../ui/app/src/common/filters/index.js          |   23 -
 .../ui/app/src/common/models/ChangeLogModel.js  |   73 -
 .../ui/app/src/common/models/MessageModel.js    |   68 -
 .../ui/app/src/common/models/PropertiesModel.js |   31 -
 .../ui/app/src/common/models/UserModel.js       |   42 -
 .../ui/app/src/common/models/index.js           |   24 -
 .../dialog/confirm/DialogConfirmController.js   |   35 -
 .../modules/dialog/confirm/_dialog.confirm.scss |   16 -
 .../dialog/confirm/dialog.confirm.tpl.html      |   30 -
 .../src/common/modules/dialog/confirm/index.js  |   21 -
 .../dialog/delete/DialogDeleteController.js     |   35 -
 .../dialog/delete/dialog.delete.tpl.html        |   32 -
 .../src/common/modules/dialog/delete/index.js   |   21 -
 .../dialog/reset/DialogResetController.js       |   45 -
 .../modules/dialog/reset/_dialog.reset.scss     |   16 -
 .../modules/dialog/reset/dialog.reset.tpl.html  |   40 -
 .../src/common/modules/dialog/reset/index.js    |   21 -
 .../dialog/select/DialogSelectController.js     |   40 -
 .../dialog/select/dialog.select.tpl.html        |   35 -
 .../src/common/modules/dialog/select/index.js   |   21 -
 .../status/DialogSelectStatusController.js      |   57 -
 .../select/status/dialog.select.status.tpl.html |   55 -
 .../modules/dialog/select/status/index.js       |   21 -
 .../modules/form/asn/FormASNController.js       |   45 -
 .../form/asn/edit/FormEditASNController.js      |   72 -
 .../src/common/modules/form/asn/edit/index.js   |   21 -
 .../common/modules/form/asn/form.asn.tpl.html   |   56 -
 .../ui/app/src/common/modules/form/asn/index.js |   21 -
 .../form/asn/new/FormNewASNController.js        |   39 -
 .../src/common/modules/form/asn/new/index.js    |   21 -
 .../form/cacheGroup/FormCacheGroupController.js |   69 -
 .../edit/FormEditCacheGroupController.js        |  130 -
 .../modules/form/cacheGroup/edit/index.js       |   21 -
 .../form/cacheGroup/form.cacheGroup.tpl.html    |  123 -
 .../src/common/modules/form/cacheGroup/index.js |   21 -
 .../new/FormNewCacheGroupController.js          |   39 -
 .../common/modules/form/cacheGroup/new/index.js |   21 -
 .../modules/form/cdn/FormCDNController.js       |   70 -
 .../form/cdn/edit/FormEditCDNController.js      |   72 -
 .../src/common/modules/form/cdn/edit/index.js   |   21 -
 .../common/modules/form/cdn/form.cdn.tpl.html   |   89 -
 .../ui/app/src/common/modules/form/cdn/index.js |   21 -
 .../form/cdn/new/FormNewCDNController.js        |   39 -
 .../src/common/modules/form/cdn/new/index.js    |   21 -
 .../FormDeliveryServiceController.js            |  161 -
 .../edit/FormEditDeliveryServiceController.js   |   76 -
 .../modules/form/deliveryService/edit/index.js  |   21 -
 .../form.deliveryService.DNS.tpl.html           |  457 --
 .../form.deliveryService.HTTP.tpl.html          |  420 --
 .../form.deliveryService.Steering.tpl.html      |  200 -
 .../form.deliveryService.anyMap.tpl.html        |  225 -
 .../modules/form/deliveryService/index.js       |   21 -
 .../new/FormNewDeliveryServiceController.js     |   43 -
 .../modules/form/deliveryService/new/index.js   |   21 -
 .../FormDeliveryServiceJobController.js         |   35 -
 .../form.deliveryServiceJob.tpl.html            |   58 -
 .../modules/form/deliveryServiceJob/index.js    |   21 -
 .../new/FormNewDeliveryServiceJobController.js  |   48 -
 .../form/deliveryServiceJob/new/index.js        |   21 -
 .../FormDeliveryServiceRegexController.js       |   47 -
 .../FormEditDeliveryServiceRegexController.js   |   72 -
 .../form/deliveryServiceRegex/edit/index.js     |   21 -
 .../form.deliveryServiceRegex.tpl.html          |   68 -
 .../modules/form/deliveryServiceRegex/index.js  |   21 -
 .../FormNewDeliveryServiceRegexController.js    |   39 -
 .../form/deliveryServiceRegex/new/index.js      |   21 -
 .../form/division/FormDivisionController.js     |   43 -
 .../division/edit/FormEditDivisionController.js |   72 -
 .../common/modules/form/division/edit/index.js  |   21 -
 .../form/division/form.division.tpl.html        |   49 -
 .../src/common/modules/form/division/index.js   |   21 -
 .../division/new/FormNewDivisionController.js   |   39 -
 .../common/modules/form/division/new/index.js   |   21 -
 .../modules/form/job/FormJobController.js       |   45 -
 .../common/modules/form/job/form.job.tpl.html   |   65 -
 .../ui/app/src/common/modules/form/job/index.js |   21 -
 .../form/job/new/FormNewJobController.js        |   48 -
 .../src/common/modules/form/job/new/index.js    |   21 -
 .../form/parameter/FormParameterController.js   |   49 -
 .../edit/FormEditParameterController.js         |   72 -
 .../common/modules/form/parameter/edit/index.js |   21 -
 .../form/parameter/form.parameter.tpl.html      |   51 -
 .../src/common/modules/form/parameter/index.js  |   21 -
 .../parameter/new/FormNewParameterController.js |   39 -
 .../common/modules/form/parameter/new/index.js  |   21 -
 .../physLocation/FormPhysLocationController.js  |   63 -
 .../edit/FormEditPhysLocationController.js      |   72 -
 .../modules/form/physLocation/edit/index.js     |   21 -
 .../physLocation/form.physLocation.tpl.html     |   64 -
 .../common/modules/form/physLocation/index.js   |   21 -
 .../new/FormNewPhysLocationController.js        |   39 -
 .../modules/form/physLocation/new/index.js      |   21 -
 .../form/profile/FormProfileController.js       |   82 -
 .../profile/edit/FormEditProfileController.js   |   72 -
 .../common/modules/form/profile/edit/index.js   |   21 -
 .../modules/form/profile/form.profile.tpl.html  |   87 -
 .../src/common/modules/form/profile/index.js    |   21 -
 .../profile/new/FormNewProfileController.js     |   39 -
 .../common/modules/form/profile/new/index.js    |   21 -
 .../modules/form/region/FormRegionController.js |   55 -
 .../region/edit/FormEditRegionController.js     |   72 -
 .../common/modules/form/region/edit/index.js    |   21 -
 .../modules/form/region/form.region.tpl.html    |   58 -
 .../app/src/common/modules/form/region/index.js |   21 -
 .../form/region/new/FormNewRegionController.js  |   42 -
 .../src/common/modules/form/region/new/index.js |   21 -
 .../modules/form/server/FormServerController.js |  164 -
 .../server/edit/FormEditServerController.js     |   72 -
 .../common/modules/form/server/edit/index.js    |   21 -
 .../modules/form/server/form.server.tpl.html    |  336 --
 .../app/src/common/modules/form/server/index.js |   21 -
 .../form/server/new/FormNewServerController.js  |   39 -
 .../src/common/modules/form/server/new/index.js |   21 -
 .../modules/form/status/FormStatusController.js |   43 -
 .../status/edit/FormEditStatusController.js     |   72 -
 .../common/modules/form/status/edit/index.js    |   21 -
 .../modules/form/status/form.status.tpl.html    |   55 -
 .../app/src/common/modules/form/status/index.js |   21 -
 .../form/status/new/FormNewStatusController.js  |   39 -
 .../src/common/modules/form/status/new/index.js |   21 -
 .../modules/form/tenant/FormTenantController.js |   50 -
 .../tenant/edit/FormEditTenantController.js     |   72 -
 .../common/modules/form/tenant/edit/index.js    |   21 -
 .../modules/form/tenant/form.tenant.tpl.html    |   62 -
 .../app/src/common/modules/form/tenant/index.js |   21 -
 .../form/tenant/new/FormNewTenantController.js  |   42 -
 .../src/common/modules/form/tenant/new/index.js |   21 -
 .../modules/form/type/FormTypeController.js     |   56 -
 .../form/type/edit/FormEditTypeController.js    |   72 -
 .../src/common/modules/form/type/edit/index.js  |   21 -
 .../common/modules/form/type/form.type.tpl.html |   58 -
 .../app/src/common/modules/form/type/index.js   |   21 -
 .../form/type/new/FormNewTypeController.js      |   39 -
 .../src/common/modules/form/type/new/index.js   |   21 -
 .../modules/form/user/FormUserController.js     |   59 -
 .../common/modules/form/user/_form.user.scss    |   16 -
 .../form/user/edit/FormEditUserController.js    |   76 -
 .../src/common/modules/form/user/edit/index.js  |   21 -
 .../common/modules/form/user/form.user.tpl.html |  109 -
 .../app/src/common/modules/form/user/index.js   |   21 -
 .../form/user/new/FormNewUserController.js      |   39 -
 .../src/common/modules/form/user/new/index.js   |   21 -
 .../common/modules/header/HeaderController.js   |  163 -
 .../app/src/common/modules/header/_header.scss  |  136 -
 .../src/common/modules/header/header.tpl.html   |   81 -
 .../ui/app/src/common/modules/header/index.js   |   21 -
 .../common/modules/message/MessageController.js |   31 -
 .../src/common/modules/message/_message.scss    |   19 -
 .../ui/app/src/common/modules/message/index.js  |   21 -
 .../src/common/modules/message/message.tpl.html |   27 -
 .../modules/navigation/NavigationController.js  |  152 -
 .../common/modules/navigation/_navigation.scss  |  299 --
 .../app/src/common/modules/navigation/index.js  |   21 -
 .../modules/navigation/navigation.tpl.html      |   73 -
 .../common/modules/release/ReleaseController.js |   31 -
 .../src/common/modules/release/_release.scss    |   16 -
 .../ui/app/src/common/modules/release/index.js  |   21 -
 .../src/common/modules/release/release.tpl.html |   26 -
 .../ui/app/src/common/modules/table/_table.scss |   23 -
 .../modules/table/asns/TableASNsController.js   |   47 -
 .../app/src/common/modules/table/asns/index.js  |   21 -
 .../modules/table/asns/table.asns.tpl.html      |   49 -
 .../TableCacheGroupAsnsController.js            |   47 -
 .../modules/table/cacheGroupAsns/index.js       |   21 -
 .../table.cacheGroupAsns.tpl.html               |   50 -
 .../TableCacheGroupParametersController.js      |   82 -
 ...TableCacheGroupParamsUnassignedController.js |   69 -
 .../modules/table/cacheGroupParameters/index.js |   22 -
 .../table.cacheGroupParameters.tpl.html         |   55 -
 .../table.cacheGroupParamsUnassigned.tpl.html   |   49 -
 .../TableCacheGroupServersController.js         |  119 -
 .../modules/table/cacheGroupServers/index.js    |   21 -
 .../table.cacheGroupServers.tpl.html            |   90 -
 ...TableCacheGroupStaticDnsEntriesController.js |   43 -
 .../table/cacheGroupStaticDnsEntries/index.js   |   21 -
 .../table.cacheGroupStaticDnsEntries.tpl.html   |   58 -
 .../cacheGroups/TableCacheGroupsController.js   |   47 -
 .../common/modules/table/cacheGroups/index.js   |   21 -
 .../cacheGroups/table.cacheGroups.tpl.html      |   54 -
 .../TableCDNDeliveryServicesController.js       |   47 -
 .../modules/table/cdnDeliveryServices/index.js  |   21 -
 .../table.cdnDeliveryServices.tpl.html          |   69 -
 .../cdnProfiles/TableCDNProfilesController.js   |   47 -
 .../common/modules/table/cdnProfiles/index.js   |   21 -
 .../cdnProfiles/table.cdnProfiles.tpl.html      |   55 -
 .../cdnServers/TableCDNServersController.js     |   69 -
 .../common/modules/table/cdnServers/index.js    |   21 -
 .../table/cdnServers/table.cdnServers.tpl.html  |   85 -
 .../modules/table/cdns/TableCDNsController.js   |   47 -
 .../app/src/common/modules/table/cdns/index.js  |   21 -
 .../modules/table/cdns/table.cdns.tpl.html      |   51 -
 .../changeLogs/TableChangeLogsController.js     |   43 -
 .../common/modules/table/changeLogs/index.js    |   21 -
 .../table/changeLogs/table.changeLogs.tpl.html  |   54 -
 .../TableDeliveryServiceJobsController.js       |   47 -
 .../modules/table/deliveryServiceJobs/index.js  |   21 -
 .../table.deliveryServiceJobs.tpl.html          |   55 -
 .../TableDeliveryServiceRegexesController.js    |   51 -
 .../table/deliveryServiceRegexes/index.js       |   21 -
 .../table.deliveryServiceRegexes.tpl.html       |   53 -
 .../TableDSServersUnassignedController.js       |  107 -
 .../TableDeliveryServiceServersController.js    |   86 -
 .../table/deliveryServiceServers/index.js       |   22 -
 .../table.deliveryServiceServers.tpl.html       |   78 -
 .../table.dsServersUnassigned.tpl.html          |   49 -
 ...DeliveryServiceStaticDnsEntriesController.js |   43 -
 .../deliveryServiceStaticDnsEntries/index.js    |   21 -
 ...ble.deliveryServiceStaticDnsEntries.tpl.html |   58 -
 .../TableDeliveryServiceUsersController.js      |   55 -
 .../modules/table/deliveryServiceUsers/index.js |   21 -
 .../table.deliveryServiceUsers.tpl.html         |   60 -
 .../TableDeliveryServicesController.js          |   74 -
 .../modules/table/deliveryServices/index.js     |   21 -
 .../table.deliveryServices.tpl.html             |   65 -
 .../TableDivisionRegionsController.js           |   47 -
 .../modules/table/divisionRegions/index.js      |   21 -
 .../table.divisionRegions.tpl.html              |   52 -
 .../table/divisions/TableDivisionsController.js |   47 -
 .../src/common/modules/table/divisions/index.js |   21 -
 .../table/divisions/table.divisions.tpl.html    |   47 -
 .../modules/table/jobs/TableJobsController.js   |   43 -
 .../app/src/common/modules/table/jobs/index.js  |   21 -
 .../modules/table/jobs/table.jobs.tpl.html      |   55 -
 .../TableParameterCacheGroupsController.js      |   51 -
 .../modules/table/parameterCacheGroups/index.js |   21 -
 .../table.parameterCacheGroups.tpl.html         |   59 -
 .../TableParamProfilesUnassignedController.js   |   69 -
 .../TableParameterProfilesController.js         |   87 -
 .../modules/table/parameterProfiles/index.js    |   22 -
 .../table.paramProfilesUnassigned.tpl.html      |   51 -
 .../table.parameterProfiles.tpl.html            |   53 -
 .../parameters/TableParametersController.js     |   47 -
 .../common/modules/table/parameters/index.js    |   21 -
 .../table/parameters/table.parameters.tpl.html  |   51 -
 .../TablePhysLocationServersController.js       |   51 -
 .../modules/table/physLocationServers/index.js  |   21 -
 .../table.physLocationServers.tpl.html          |   81 -
 .../TablePhysLocationsController.js             |   47 -
 .../common/modules/table/physLocations/index.js |   21 -
 .../physLocations/table.physLocations.tpl.html  |   58 -
 .../TableProfileDeliveryServicesController.js   |   47 -
 .../table/profileDeliveryServices/index.js      |   22 -
 .../table.profileDeliveryServices.tpl.html      |   74 -
 .../TableProfileParametersController.js         |   82 -
 .../TableProfileParamsUnassignedController.js   |   69 -
 .../modules/table/profileParameters/index.js    |   22 -
 .../table.profileParameters.tpl.html            |   57 -
 .../table.profileParamsUnassigned.tpl.html      |   49 -
 .../TableProfileServersController.js            |   51 -
 .../modules/table/profileServers/index.js       |   22 -
 .../table.profileServers.tpl.html               |   78 -
 .../table/profiles/TableProfilesController.js   |   55 -
 .../src/common/modules/table/profiles/index.js  |   21 -
 .../table/profiles/table.profiles.tpl.html      |   63 -
 .../TableRegionPhysLocationsController.js       |   51 -
 .../modules/table/regionPhysLocations/index.js  |   21 -
 .../table.regionPhysLocations.tpl.html          |   59 -
 .../table/regions/TableRegionsController.js     |   47 -
 .../src/common/modules/table/regions/index.js   |   21 -
 .../table/regions/table.regions.tpl.html        |   51 -
 .../TableServerDeliveryServicesController.js    |   60 -
 .../table/serverDeliveryServices/index.js       |   21 -
 .../table.serverDeliveryServices.tpl.html       |   78 -
 .../table/servers/TableServersController.js     |  124 -
 .../src/common/modules/table/servers/index.js   |   21 -
 .../table/servers/table.servers.tpl.html        |   86 -
 .../TableStatusServersController.js             |   51 -
 .../common/modules/table/statusServers/index.js |   22 -
 .../statusServers/table.statusServers.tpl.html  |   72 -
 .../table/statuses/TableStatusesController.js   |   47 -
 .../src/common/modules/table/statuses/index.js  |   21 -
 .../table/statuses/table.statuses.tpl.html      |   49 -
 .../table/tenants/TableTenantsController.js     |   47 -
 .../src/common/modules/table/tenants/index.js   |   21 -
 .../table/tenants/table.tenants.tpl.html        |   55 -
 .../TableTypeCacheGroupsController.js           |   47 -
 .../modules/table/typeCacheGroups/index.js      |   22 -
 .../table.typeCacheGroups.tpl.html              |   56 -
 .../TableTypeDeliveryServicesController.js      |   47 -
 .../modules/table/typeDeliveryServices/index.js |   22 -
 .../table.typeDeliveryServices.tpl.html         |   66 -
 .../typeServers/TableTypeServersController.js   |   51 -
 .../common/modules/table/typeServers/index.js   |   22 -
 .../typeServers/table.typeServers.tpl.html      |   72 -
 .../TableTypeStaticDnsEntriesController.js      |   43 -
 .../modules/table/typeStaticDnsEntries/index.js |   22 -
 .../table.typeStaticDnsEntries.tpl.html         |   58 -
 .../modules/table/types/TableTypesController.js |   47 -
 .../app/src/common/modules/table/types/index.js |   21 -
 .../modules/table/types/table.types.tpl.html    |   51 -
 .../TableUserDSUnassignedController.js          |  107 -
 .../TableUserDeliveryServicesController.js      |   82 -
 .../modules/table/userDeliveryServices/index.js |   22 -
 .../table.userDSUnassigned.tpl.html             |   47 -
 .../table.userDeliveryServices.tpl.html         |   55 -
 .../modules/table/users/TableUsersController.js |   47 -
 .../app/src/common/modules/table/users/index.js |   21 -
 .../modules/table/users/table.users.tpl.html    |   57 -
 .../cacheGroups/WidgetCacheGroupsController.js  |   43 -
 .../widget/cacheGroups/_widget.cacheGroups.scss |   62 -
 .../common/modules/widget/cacheGroups/index.js  |   21 -
 .../cacheGroups/widget.cacheGroups.tpl.html     |   69 -
 .../widget/capacity/WidgetCapacityController.js |  101 -
 .../widget/capacity/_widget.capacity.scss       |   31 -
 .../src/common/modules/widget/capacity/index.js |   21 -
 .../widget/capacity/widget.capacity.tpl.html    |   64 -
 .../widget/cdnChart/WidgetCDNChartController.js |  186 -
 .../widget/cdnChart/_widget.cdnChart.scss       |   30 -
 .../src/common/modules/widget/cdnChart/index.js |   21 -
 .../widget/cdnChart/widget.cdnChart.tpl.html    |   59 -
 .../changeLogs/WidgetChangeLogsController.js    |   39 -
 .../common/modules/widget/changeLogs/index.js   |   21 -
 .../changeLogs/widget.changeLogs.tpl.html       |   50 -
 .../widget/routing/WidgetRoutingController.js   |   45 -
 .../modules/widget/routing/_widget.routing.scss |   20 -
 .../src/common/modules/widget/routing/index.js  |   21 -
 .../widget/routing/widget.routing.tpl.html      |  157 -
 .../service/application/ApplicationService.js   |   38 -
 .../app/src/common/service/application/index.js |   21 -
 .../app/src/common/service/utils/DateUtils.js   |  131 -
 .../app/src/common/service/utils/FormUtils.js   |   33 -
 .../src/common/service/utils/LocationUtils.js   |   29 -
 .../app/src/common/service/utils/NumberUtils.js |   80 -
 .../app/src/common/service/utils/ServerUtils.js |   33 -
 .../app/src/common/service/utils/StringUtils.js |   29 -
 .../ui/app/src/common/service/utils/index.js    |   26 -
 .../ui/app/src/common/templates/master.tpl.html |   40 -
 traffic_ops/experimental/ui/app/src/index.html  |   59 -
 .../modules/private/admin/AdminController.js    |   23 -
 .../app/src/modules/private/admin/_admin.scss   |   16 -
 .../src/modules/private/admin/admin.tpl.html    |   22 -
 .../private/admin/asns/AsnsController.js        |   24 -
 .../modules/private/admin/asns/asns.tpl.html    |   22 -
 .../modules/private/admin/asns/edit/index.js    |   39 -
 .../app/src/modules/private/admin/asns/index.js |   36 -
 .../modules/private/admin/asns/list/index.js    |   39 -
 .../src/modules/private/admin/asns/new/index.js |   39 -
 .../private/admin/cdns/CdnsController.js        |   24 -
 .../modules/private/admin/cdns/cdns.tpl.html    |   22 -
 .../admin/cdns/config/ConfigController.js       |  212 -
 .../private/admin/cdns/config/_config.scss      |   50 -
 .../private/admin/cdns/config/config.tpl.html   |  124 -
 .../modules/private/admin/cdns/config/index.js  |   46 -
 .../admin/cdns/deliveryServices/index.js        |   42 -
 .../modules/private/admin/cdns/edit/index.js    |   39 -
 .../app/src/modules/private/admin/cdns/index.js |   36 -
 .../modules/private/admin/cdns/list/index.js    |   39 -
 .../src/modules/private/admin/cdns/new/index.js |   42 -
 .../private/admin/cdns/profiles/index.js        |   42 -
 .../modules/private/admin/cdns/servers/index.js |   42 -
 .../admin/changeLogs/ChangeLogsController.js    |   24 -
 .../admin/changeLogs/changeLogs.tpl.html        |   22 -
 .../modules/private/admin/changeLogs/index.js   |   36 -
 .../private/admin/changeLogs/list/index.js      |   39 -
 .../admin/divisions/DivisionsController.js      |   24 -
 .../private/admin/divisions/_divisions.scss     |   16 -
 .../private/admin/divisions/divisions.tpl.html  |   22 -
 .../private/admin/divisions/edit/index.js       |   39 -
 .../modules/private/admin/divisions/index.js    |   36 -
 .../private/admin/divisions/list/index.js       |   39 -
 .../private/admin/divisions/new/index.js        |   39 -
 .../private/admin/divisions/regions/index.js    |   42 -
 .../ui/app/src/modules/private/admin/index.js   |   35 -
 .../private/admin/jobs/JobsController.js        |   24 -
 .../app/src/modules/private/admin/jobs/index.js |   36 -
 .../modules/private/admin/jobs/jobs.tpl.html    |   22 -
 .../modules/private/admin/jobs/list/index.js    |   39 -
 .../src/modules/private/admin/jobs/new/index.js |   39 -
 .../admin/parameters/ParametersController.js    |   24 -
 .../admin/parameters/cacheGroups/index.js       |   42 -
 .../private/admin/parameters/edit/index.js      |   39 -
 .../modules/private/admin/parameters/index.js   |   36 -
 .../private/admin/parameters/list/index.js      |   39 -
 .../private/admin/parameters/new/index.js       |   39 -
 .../admin/parameters/parameters.tpl.html        |   22 -
 .../private/admin/parameters/profiles/index.js  |   42 -
 .../physLocations/PhysLocationsController.js    |   24 -
 .../private/admin/physLocations/edit/index.js   |   39 -
 .../private/admin/physLocations/index.js        |   36 -
 .../private/admin/physLocations/list/index.js   |   39 -
 .../private/admin/physLocations/new/index.js    |   39 -
 .../admin/physLocations/physLocations.tpl.html  |   22 -
 .../admin/physLocations/servers/index.js        |   42 -
 .../admin/profiles/ProfilesController.js        |   24 -
 .../admin/profiles/deliveryServices/index.js    |   42 -
 .../private/admin/profiles/edit/index.js        |   39 -
 .../src/modules/private/admin/profiles/index.js |   36 -
 .../private/admin/profiles/list/index.js        |   39 -
 .../modules/private/admin/profiles/new/index.js |   39 -
 .../private/admin/profiles/parameters/index.js  |   42 -
 .../private/admin/profiles/profiles.tpl.html    |   22 -
 .../private/admin/profiles/servers/index.js     |   42 -
 .../private/admin/regions/RegionsController.js  |   24 -
 .../modules/private/admin/regions/_regions.scss |   16 -
 .../modules/private/admin/regions/edit/index.js |   39 -
 .../src/modules/private/admin/regions/index.js  |   36 -
 .../modules/private/admin/regions/list/index.js |   39 -
 .../modules/private/admin/regions/new/index.js  |   39 -
 .../admin/regions/physLocations/index.js        |   42 -
 .../private/admin/regions/regions.tpl.html      |   22 -
 .../admin/statuses/StatusesController.js        |   24 -
 .../private/admin/statuses/edit/index.js        |   39 -
 .../src/modules/private/admin/statuses/index.js |   36 -
 .../private/admin/statuses/list/index.js        |   39 -
 .../modules/private/admin/statuses/new/index.js |   39 -
 .../private/admin/statuses/servers/index.js     |   42 -
 .../private/admin/statuses/statuses.tpl.html    |   22 -
 .../private/admin/tenants/TenantsController.js  |   24 -
 .../modules/private/admin/tenants/_tenants.scss |   16 -
 .../modules/private/admin/tenants/edit/index.js |   39 -
 .../src/modules/private/admin/tenants/index.js  |   36 -
 .../modules/private/admin/tenants/list/index.js |   39 -
 .../modules/private/admin/tenants/new/index.js  |   39 -
 .../private/admin/tenants/tenants.tpl.html      |   22 -
 .../private/admin/types/TypesController.js      |   24 -
 .../private/admin/types/cacheGroups/index.js    |   42 -
 .../admin/types/deliveryServices/index.js       |   42 -
 .../modules/private/admin/types/edit/index.js   |   39 -
 .../src/modules/private/admin/types/index.js    |   36 -
 .../modules/private/admin/types/list/index.js   |   39 -
 .../modules/private/admin/types/new/index.js    |   39 -
 .../private/admin/types/servers/index.js        |   42 -
 .../admin/types/staticDnsEntries/index.js       |   42 -
 .../modules/private/admin/types/types.tpl.html  |   22 -
 .../private/admin/users/UsersController.js      |   24 -
 .../src/modules/private/admin/users/_users.scss |   16 -
 .../admin/users/deliveryServices/index.js       |   42 -
 .../modules/private/admin/users/edit/index.js   |   39 -
 .../src/modules/private/admin/users/index.js    |   36 -
 .../modules/private/admin/users/list/index.js   |   39 -
 .../modules/private/admin/users/new/index.js    |   39 -
 .../modules/private/admin/users/users.tpl.html  |   22 -
 .../private/configure/ConfigureController.js    |   29 -
 .../modules/private/configure/_configure.scss   |   16 -
 .../cacheGroups/CacheGroupsController.js        |   24 -
 .../configure/cacheGroups/_cacheGroups.scss     |   16 -
 .../private/configure/cacheGroups/asns/index.js |   42 -
 .../configure/cacheGroups/cacheGroups.tpl.html  |   22 -
 .../private/configure/cacheGroups/edit/index.js |   39 -
 .../private/configure/cacheGroups/index.js      |   36 -
 .../private/configure/cacheGroups/list/index.js |   39 -
 .../private/configure/cacheGroups/new/index.js  |   39 -
 .../configure/cacheGroups/parameters/index.js   |   42 -
 .../configure/cacheGroups/servers/index.js      |   42 -
 .../cacheGroups/staticDnsEntries/index.js       |   42 -
 .../private/configure/configure.tpl.html        |   22 -
 .../DeliveryServicesController.js               |   24 -
 .../deliveryServices/_deliveryServices.scss     |   16 -
 .../deliveryServices/deliveryServices.tpl.html  |   22 -
 .../configure/deliveryServices/edit/index.js    |   62 -
 .../private/configure/deliveryServices/index.js |   36 -
 .../jobs/DeliveryServiceJobsController.js       |   24 -
 .../jobs/deliveryServiceJobs.tpl.html           |   22 -
 .../configure/deliveryServices/jobs/index.js    |   36 -
 .../deliveryServices/jobs/list/index.js         |   42 -
 .../deliveryServices/jobs/new/index.js          |   42 -
 .../configure/deliveryServices/list/index.js    |   39 -
 .../configure/deliveryServices/new/index.js     |   76 -
 .../regexes/DeliveryServiceRegexesController.js |   24 -
 .../regexes/deliveryServiceRegexes.tpl.html     |   22 -
 .../deliveryServices/regexes/edit/index.js      |   42 -
 .../configure/deliveryServices/regexes/index.js |   36 -
 .../deliveryServices/regexes/list/index.js      |   42 -
 .../deliveryServices/regexes/new/index.js       |   42 -
 .../configure/deliveryServices/servers/index.js |   42 -
 .../deliveryServices/staticDnsEntries/index.js  |   42 -
 .../configure/deliveryServices/users/index.js   |   42 -
 .../app/src/modules/private/configure/index.js  |   35 -
 .../configure/servers/ServersController.js      |   24 -
 .../private/configure/servers/_servers.scss     |   16 -
 .../configure/servers/deliveryServices/index.js |   42 -
 .../private/configure/servers/edit/index.js     |   39 -
 .../modules/private/configure/servers/index.js  |   36 -
 .../private/configure/servers/list/index.js     |   39 -
 .../private/configure/servers/new/index.js      |   42 -
 .../private/configure/servers/servers.tpl.html  |   22 -
 .../modules/private/custom/CustomController.js  |   42 -
 .../app/src/modules/private/custom/_custom.scss |   36 -
 .../src/modules/private/custom/custom.tpl.html  |   20 -
 .../ui/app/src/modules/private/custom/index.js  |   33 -
 .../ui/app/src/modules/private/index.js         |   54 -
 .../private/monitor/MonitorController.js        |   23 -
 .../src/modules/private/monitor/_monitor.scss   |   16 -
 .../monitor/dashboard/DashboardController.js    |   36 -
 .../private/monitor/dashboard/_dashboard.scss   |   16 -
 .../monitor/dashboard/dashboard.tpl.html        |   85 -
 .../modules/private/monitor/dashboard/index.js  |   51 -
 .../private/monitor/dashboard/view/index.js     |   72 -
 .../ui/app/src/modules/private/monitor/index.js |   35 -
 .../private/monitor/map/MapController.js        |  101 -
 .../src/modules/private/monitor/map/_map.scss   |   21 -
 .../src/modules/private/monitor/map/index.js    |   43 -
 .../modules/private/monitor/map/map.tpl.html    |   38 -
 .../modules/private/monitor/monitor.tpl.html    |   22 -
 .../ui/app/src/modules/private/private.tpl.html |   22 -
 .../src/modules/private/user/UserController.js  |   94 -
 .../ui/app/src/modules/private/user/_user.scss  |   32 -
 .../private/user/edit/UserEditController.js     |   30 -
 .../app/src/modules/private/user/edit/index.js  |   36 -
 .../ui/app/src/modules/private/user/index.js    |   35 -
 .../app/src/modules/private/user/user.tpl.html  |   22 -
 .../ui/app/src/modules/public/index.js          |   45 -
 .../src/modules/public/login/LoginController.js |   49 -
 .../ui/app/src/modules/public/login/_login.scss |   16 -
 .../ui/app/src/modules/public/login/index.js    |   35 -
 .../app/src/modules/public/login/login.tpl.html |   53 -
 .../ui/app/src/modules/public/public.tpl.html   |   22 -
 .../experimental/ui/app/src/package.json        |   22 -
 traffic_ops/experimental/ui/app/src/robots.txt  |   17 -
 .../experimental/ui/app/src/scripts/config.js   |   28 -
 .../ui/app/src/scripts/shared-libs.js           |   58 -
 .../experimental/ui/app/src/styles/loading.scss |  110 -
 .../experimental/ui/app/src/styles/main.scss    |  154 -
 .../experimental/ui/app/src/styles/theme.scss   | 4159 ------------------
 .../ui/app/src/styles/variables.scss            |   28 -
 .../ui/app/src/traffic_ops_release.json         |    5 -
 .../ui/app/src/traffic_portal_properties.json   |   10 -
 traffic_ops/experimental/ui/bower.json          |   25 -
 traffic_ops/experimental/ui/build/Dockerfile    |   56 -
 traffic_ops/experimental/ui/build/README.md     |   63 -
 traffic_ops/experimental/ui/build/build_rpm.sh  |   57 -
 .../ui/build/etc/init.d/traffic_ops_v2          |  153 -
 .../ui/build/etc/logrotate.d/traffic_ops_v2     |   26 -
 .../build/etc/logrotate.d/traffic_ops_v2-access |   26 -
 traffic_ops/experimental/ui/build/run-build.sh  |   37 -
 .../experimental/ui/build/traffic_ops_v2.spec   |   89 -
 traffic_ops/experimental/ui/conf/config.js      |   42 -
 traffic_ops/experimental/ui/docker/Dockerfile   |   24 -
 .../experimental/ui/docker/docker-compose.yml   |   32 -
 traffic_ops/experimental/ui/docker/reset.sh     |   28 -
 .../etc/systemd/system/traffic_portal.service   |   30 -
 .../experimental/ui/grunt/browserify2.js        |  167 -
 traffic_ops/experimental/ui/grunt/clean.js      |   29 -
 traffic_ops/experimental/ui/grunt/compass.js    |   47 -
 traffic_ops/experimental/ui/grunt/copy.js       |   75 -
 traffic_ops/experimental/ui/grunt/express.js    |   27 -
 .../experimental/ui/grunt/globalConfig.js       |   35 -
 traffic_ops/experimental/ui/grunt/html2js.js    |   30 -
 traffic_ops/experimental/ui/grunt/jshint.js     |   26 -
 traffic_ops/experimental/ui/grunt/uglify.js     |   28 -
 traffic_ops/experimental/ui/grunt/watch.js      |   37 -
 traffic_ops/experimental/ui/package.json        |   42 -
 traffic_ops/experimental/ui/server.js           |  160 -
 traffic_ops/experimental/ui/server/log/.keep    |    0
 traffic_portal/.gitattributes                   |    1 +
 traffic_portal/.gitignore                       |    7 +-
 traffic_portal/Dockerfile                       |   24 +
 traffic_portal/Gruntfile.js                     |   41 +-
 traffic_portal/README.md                        |    4 +-
 traffic_portal/app/src/AppController.js         |   21 -
 traffic_portal/app/src/app.js                   |  350 +-
 traffic_portal/app/src/assets/css/custom.css    |   39 +-
 .../src/assets/css/jquery.dataTables.min.css    |    1 +
 .../app/src/assets/fonts/FontAwesome.otf        |  Bin 0 -> 109688 bytes
 .../src/assets/fonts/fontawesome-webfont.eot    |  Bin 0 -> 70807 bytes
 .../src/assets/fonts/fontawesome-webfont.ttf    |  Bin 0 -> 142072 bytes
 .../src/assets/fonts/fontawesome-webfont.woff   |  Bin 0 -> 83588 bytes
 .../src/assets/fonts/fontawesome-webfont.woff2  |  Bin 0 -> 66624 bytes
 .../app/src/assets/images/favicon.png           |  Bin 1386 -> 49588 bytes
 .../app/src/assets/images/sort_asc.png          |  Bin 0 -> 160 bytes
 .../app/src/assets/images/sort_asc_disabled.png |  Bin 0 -> 148 bytes
 .../app/src/assets/images/sort_both.png         |  Bin 0 -> 201 bytes
 .../app/src/assets/images/sort_desc.png         |  Bin 0 -> 158 bytes
 .../src/assets/images/sort_desc_disabled.png    |  Bin 0 -> 146 bytes
 traffic_portal/app/src/assets/js/.keep          |    0
 .../app/src/assets/js/dataTables.tableTools.js  | 3084 +++++++++++++
 .../app/src/assets/js/jquery.dataTables.min.js  |  166 +
 .../app/src/assets/js/ng-map_1.17.6.min.js      |   26 +
 .../app/src/assets/js/underscore-min_1.8.3.js   |    6 +
 .../app/src/assets/other/collateral.txt         |    1 -
 traffic_portal/app/src/common/api/ASNService.js |   70 +
 .../app/src/common/api/AuthService.js           |  111 +-
 traffic_portal/app/src/common/api/CDNService.js |  216 +
 .../common/api/CacheGroupParameterService.js    |   53 +
 .../app/src/common/api/CacheGroupService.js     |  115 +
 .../app/src/common/api/CacheStatsService.js     |   63 +
 .../app/src/common/api/ChangeLogService.js      |   35 +
 .../common/api/DeliveryServiceRegexService.js   |   70 +
 .../src/common/api/DeliveryServiceService.js    |  230 +-
 .../app/src/common/api/DivisionService.js       |   70 +
 .../app/src/common/api/HealthService.js         |   45 -
 .../app/src/common/api/HttpService.js           |   89 +
 traffic_portal/app/src/common/api/JobService.js |   33 +
 .../app/src/common/api/ParameterService.js      |   82 +
 .../app/src/common/api/PhysLocationService.js   |   71 +
 .../app/src/common/api/PortalService.js         |   43 -
 .../src/common/api/ProfileParameterService.js   |   49 +
 .../app/src/common/api/ProfileService.js        |   79 +
 .../app/src/common/api/RegexService.js          |   29 +
 .../app/src/common/api/RegionService.js         |   69 +
 .../app/src/common/api/RoleService.js           |   57 +
 .../app/src/common/api/ServerService.js         |  138 +
 .../app/src/common/api/StaticDnsEntryService.js |   29 +
 .../app/src/common/api/StatsService.js          |  159 -
 .../app/src/common/api/StatusService.js         |   70 +
 .../app/src/common/api/TenantService.js         |   69 +
 .../app/src/common/api/TrafficPortalService.js  |   57 +
 .../app/src/common/api/TypeService.js           |   70 +
 .../app/src/common/api/UserService.js           |  169 +-
 traffic_portal/app/src/common/api/index.js      |   57 +-
 .../common/directives/enter/EnterDirective.js   |   31 -
 .../app/src/common/directives/enter/index.js    |   20 -
 .../formattedDate/FormattedDateDirective.js     |   34 -
 .../common/directives/formattedDate/index.js    |   20 -
 .../common/directives/match/MatchDirective.js   |   30 +-
 .../app/src/common/directives/match/index.js    |   31 +-
 .../directives/rcSubmit/RCSubmitDirective.js    |   91 -
 .../app/src/common/directives/rcSubmit/index.js |   19 -
 .../rcVerifySet/RCVerifySetDirective.js         |   33 -
 .../src/common/directives/rcVerifySet/index.js  |   19 -
 .../selectOnClick/SelectOnClickDirective.js     |   29 -
 .../common/directives/selectOnClick/index.js    |   19 -
 .../app/src/common/filters/DateRangeFilter.js   |   32 -
 .../app/src/common/filters/OffsetFilter.js      |   32 +-
 .../app/src/common/filters/PartitionFilter.js   |   37 -
 .../app/src/common/filters/PercentFilter.js     |   52 +-
 .../app/src/common/filters/UnitsFilter.js       |   26 -
 traffic_portal/app/src/common/filters/index.js  |   36 +-
 .../app/src/common/models/AuthModel.js          |   21 -
 .../app/src/common/models/ChangeLogModel.js     |   73 +
 .../app/src/common/models/ChartModel.js         |  138 -
 .../src/common/models/DeliveryServicesModel.js  |   45 -
 .../app/src/common/models/MessageModel.js       |   30 +-
 .../app/src/common/models/PropertiesModel.js    |   14 +-
 .../app/src/common/models/UserModel.js          |   62 +-
 traffic_portal/app/src/common/models/index.js   |   38 +-
 .../cacheGroups/CacheGroupsController.js        |   83 -
 .../modules/cacheGroups/_cacheGroups.scss       |   74 -
 .../modules/cacheGroups/cacheGroups.tpl.html    |   55 -
 .../app/src/common/modules/cacheGroups/index.js |   19 -
 .../app/src/common/modules/chart/_chart.scss    |   89 -
 .../ChartBandwidthPerSecondController.js        |  224 -
 .../_chart.bandwidthPerSecond.scss              |   40 -
 .../chart.bandwidthPerSecond.tpl.html           |   66 -
 .../modules/chart/bandwidthPerSecond/index.js   |   19 -
 .../chart/capacity/ChartCapacityController.js   |  117 -
 .../modules/chart/capacity/_chart.capacity.scss |   25 -
 .../chart/capacity/chart.capacity.tpl.html      |   22 -
 .../src/common/modules/chart/capacity/index.js  |   19 -
 .../modules/chart/dates/ChartDatesController.js |  139 -
 .../modules/chart/dates/_chart.dates.scss       |   68 -
 .../modules/chart/dates/chart.dates.tpl.html    |   57 -
 .../app/src/common/modules/chart/dates/index.js |   26 -
 .../httpStatus/ChartHttpStatusController.js     |  175 -
 .../chart/httpStatus/_chart.httpStatus.scss     |   99 -
 .../chart/httpStatus/chart.httpStatus.tpl.html  |   27 -
 .../common/modules/chart/httpStatus/index.js    |   19 -
 .../chart/routing/ChartRoutingController.js     |  141 -
 .../modules/chart/routing/_chart.routing.scss   |   25 -
 .../chart/routing/chart.routing.tpl.html        |   22 -
 .../src/common/modules/chart/routing/index.js   |   19 -
 .../ChartTransactionsPerSecondController.js     |  214 -
 .../_chart.transactionsPerSecond.scss           |   39 -
 .../chart.transactionsPerSecond.tpl.html        |   64 -
 .../chart/transactionsPerSecond/index.js        |   19 -
 .../src/common/modules/dates/DatesController.js |   55 -
 .../app/src/common/modules/dates/_dates.scss    |   47 -
 .../app/src/common/modules/dates/dates.tpl.html |   42 -
 .../app/src/common/modules/dates/index.js       |   19 -
 .../config/edit/DSConfigEditController.js       |   55 -
 .../edit/_deliveryService.config.edit.scss      |   36 -
 .../edit/deliveryService.config.edit.tpl.html   |  126 -
 .../deliveryService/config/edit/index.js        |   19 -
 .../dialog/confirm/DialogConfirmController.js   |   30 +-
 .../modules/dialog/confirm/_dialog.confirm.scss |    1 -
 .../dialog/confirm/dialog.confirm.tpl.html      |   33 +-
 .../src/common/modules/dialog/confirm/index.js  |   30 +-
 .../dialog/delete/DialogDeleteController.js     |   35 +
 .../dialog/delete/dialog.delete.tpl.html        |   32 +
 .../src/common/modules/dialog/delete/index.js   |   21 +
 .../dialog/reset/DialogResetController.js       |   42 +-
 .../modules/dialog/reset/_dialog.reset.scss     |    1 -
 .../modules/dialog/reset/dialog.reset.tpl.html  |   32 +-
 .../src/common/modules/dialog/reset/index.js    |   30 +-
 .../dialog/select/DialogSelectController.js     |   40 +
 .../dialog/select/dialog.select.tpl.html        |   35 +
 .../src/common/modules/dialog/select/index.js   |   21 +
 .../status/DialogSelectStatusController.js      |   57 +
 .../select/status/dialog.select.status.tpl.html |   55 +
 .../modules/dialog/select/status/index.js       |   21 +
 .../common/modules/footer/FooterController.js   |   33 -
 .../src/common/modules/footer/footer.tpl.html   |   26 -
 .../app/src/common/modules/footer/index.js      |   19 -
 .../modules/form/asn/FormASNController.js       |   45 +
 .../form/asn/edit/FormEditASNController.js      |   72 +
 .../src/common/modules/form/asn/edit/index.js   |   21 +
 .../common/modules/form/asn/form.asn.tpl.html   |   56 +
 .../app/src/common/modules/form/asn/index.js    |   21 +
 .../form/asn/new/FormNewASNController.js        |   39 +
 .../src/common/modules/form/asn/new/index.js    |   21 +
 .../form/cacheGroup/FormCacheGroupController.js |   69 +
 .../edit/FormEditCacheGroupController.js        |  130 +
 .../modules/form/cacheGroup/edit/index.js       |   21 +
 .../form/cacheGroup/form.cacheGroup.tpl.html    |  123 +
 .../src/common/modules/form/cacheGroup/index.js |   21 +
 .../new/FormNewCacheGroupController.js          |   39 +
 .../common/modules/form/cacheGroup/new/index.js |   21 +
 .../modules/form/cdn/FormCDNController.js       |   70 +
 .../form/cdn/edit/FormEditCDNController.js      |   72 +
 .../src/common/modules/form/cdn/edit/index.js   |   21 +
 .../common/modules/form/cdn/form.cdn.tpl.html   |   89 +
 .../app/src/common/modules/form/cdn/index.js    |   21 +
 .../form/cdn/new/FormNewCDNController.js        |   39 +
 .../src/common/modules/form/cdn/new/index.js    |   21 +
 .../FormDeliveryServiceController.js            |  161 +
 .../edit/FormEditDeliveryServiceController.js   |   76 +
 .../modules/form/deliveryService/edit/index.js  |   21 +
 .../form.deliveryService.DNS.tpl.html           |  457 ++
 .../form.deliveryService.HTTP.tpl.html          |  420 ++
 .../form.deliveryService.Steering.tpl.html      |  200 +
 .../form.deliveryService.anyMap.tpl.html        |  225 +
 .../modules/form/deliveryService/index.js       |   21 +
 .../new/FormNewDeliveryServiceController.js     |   43 +
 .../modules/form/deliveryService/new/index.js   |   21 +
 .../FormDeliveryServiceJobController.js         |   35 +
 .../form.deliveryServiceJob.tpl.html            |   58 +
 .../modules/form/deliveryServiceJob/index.js    |   21 +
 .../new/FormNewDeliveryServiceJobController.js  |   48 +
 .../form/deliveryServiceJob/new/index.js        |   21 +
 .../FormDeliveryServiceRegexController.js       |   47 +
 .../FormEditDeliveryServiceRegexController.js   |   72 +
 .../form/deliveryServiceRegex/edit/index.js     |   21 +
 .../form.deliveryServiceRegex.tpl.html          |   68 +
 .../modules/form/deliveryServiceRegex/index.js  |   21 +
 .../FormNewDeliveryServiceRegexController.js    |   39 +
 .../form/deliveryServiceRegex/new/index.js      |   21 +
 .../form/division/FormDivisionController.js     |   43 +
 .../division/edit/FormEditDivisionController.js |   72 +
 .../common/modules/form/division/edit/index.js  |   21 +
 .../form/division/form.division.tpl.html        |   49 +
 .../src/common/modules/form/division/index.js   |   21 +
 .../division/new/FormNewDivisionController.js   |   39 +
 .../common/modules/form/division/new/index.js   |   21 +
 .../modules/form/job/FormJobController.js       |   45 +
 .../common/modules/form/job/form.job.tpl.html   |   65 +
 .../app/src/common/modules/form/job/index.js    |   21 +
 .../form/job/new/FormNewJobController.js        |   48 +
 .../src/common/modules/form/job/new/index.js    |   21 +
 .../form/parameter/FormParameterController.js   |   49 +
 .../edit/FormEditParameterController.js         |   72 +
 .../common/modules/form/parameter/edit/index.js |   21 +
 .../form/parameter/form.parameter.tpl.html      |   51 +
 .../src/common/modules/form/parameter/index.js  |   21 +
 .../parameter/new/FormNewParameterController.js |   39 +
 .../common/modules/form/parameter/new/index.js  |   21 +
 .../physLocation/FormPhysLocationController.js  |   63 +
 .../edit/FormEditPhysLocationController.js      |   72 +
 .../modules/form/physLocation/edit/index.js     |   21 +
 .../physLocation/form.physLocation.tpl.html     |   64 +
 .../common/modules/form/physLocation/index.js   |   21 +
 .../new/FormNewPhysLocationController.js        |   39 +
 .../modules/form/physLocation/new/index.js      |   21 +
 .../form/profile/FormProfileController.js       |   82 +
 .../profile/edit/FormEditProfileController.js   |   72 +
 .../common/modules/form/profile/edit/index.js   |   21 +
 .../modules/form/profile/form.profile.tpl.html  |   87 +
 .../src/common/modules/form/profile/index.js    |   21 +
 .../profile/new/FormNewProfileController.js     |   39 +
 .../common/modules/form/profile/new/index.js    |   21 +
 .../modules/form/region/FormRegionController.js |   55 +
 .../region/edit/FormEditRegionController.js     |   72 +
 .../common/modules/form/region/edit/index.js    |   21 +
 .../modules/form/region/form.region.tpl.html    |   58 +
 .../app/src/common/modules/form/region/index.js |   21 +
 .../form/region/new/FormNewRegionController.js  |   42 +
 .../src/common/modules/form/region/new/index.js |   21 +
 .../modules/form/server/FormServerController.js |  164 +
 .../server/edit/FormEditServerController.js     |   72 +
 .../common/modules/form/server/edit/index.js    |   21 +
 .../modules/form/server/form.server.tpl.html    |  336 ++
 .../app/src/common/modules/form/server/index.js |   21 +
 .../form/server/new/FormNewServerController.js  |   39 +
 .../src/common/modules/form/server/new/index.js |   21 +
 .../modules/form/status/FormStatusController.js |   43 +
 .../status/edit/FormEditStatusController.js     |   72 +
 .../common/modules/form/status/edit/index.js    |   21 +
 .../modules/form/status/form.status.tpl.html    |   55 +
 .../app/src/common/modules/form/status/index.js |   21 +
 .../form/status/new/FormNewStatusController.js  |   39 +
 .../src/common/modules/form/status/new/index.js |   21 +
 .../modules/form/tenant/FormTenantController.js |   50 +
 .../tenant/edit/FormEditTenantController.js     |   72 +
 .../common/modules/form/tenant/edit/index.js    |   21 +
 .../modules/form/tenant/form.tenant.tpl.html    |   62 +
 .../app/src/common/modules/form/tenant/index.js |   21 +
 .../form/tenant/new/FormNewTenantController.js  |   42 +
 .../src/common/modules/form/tenant/new/index.js |   21 +
 .../modules/form/type/FormTypeController.js     |   56 +
 .../form/type/edit/FormEditTypeController.js    |   72 +
 .../src/common/modules/form/type/edit/index.js  |   21 +
 .../common/modules/form/type/form.type.tpl.html |   58 +
 .../app/src/common/modules/form/type/index.js   |   21 +
 .../form/type/new/FormNewTypeController.js      |   39 +
 .../src/common/modules/form/type/new/index.js   |   21 +
 .../modules/form/user/FormUserController.js     |   59 +
 .../common/modules/form/user/_form.user.scss    |   16 +
 .../form/user/edit/FormEditUserController.js    |   76 +
 .../src/common/modules/form/user/edit/index.js  |   21 +
 .../common/modules/form/user/form.user.tpl.html |  109 +
 .../app/src/common/modules/form/user/index.js   |   21 +
 .../form/user/new/FormNewUserController.js      |   39 +
 .../src/common/modules/form/user/new/index.js   |   21 +
 .../common/modules/header/HeaderController.js   |  173 +-
 .../app/src/common/modules/header/_header.scss  |  146 +-
 .../src/common/modules/header/header.tpl.html   |  124 +-
 .../app/src/common/modules/header/index.js      |   32 +-
 .../common/modules/message/MessageController.js |   50 +-
 .../src/common/modules/message/_message.scss    |    7 +-
 .../app/src/common/modules/message/index.js     |   30 +-
 .../src/common/modules/message/message.tpl.html |   40 +-
 .../modules/navigation/NavigationController.js  |  152 +
 .../common/modules/navigation/_navigation.scss  |  299 ++
 .../app/src/common/modules/navigation/index.js  |   21 +
 .../modules/navigation/navigation.tpl.html      |   73 +
 .../common/modules/release/ReleaseController.js |   31 +
 .../src/common/modules/release/_release.scss    |   16 +
 .../app/src/common/modules/release/index.js     |   21 +
 .../src/common/modules/release/release.tpl.html |   26 +
 .../release/version/ReleaseVersionController.js |   29 -
 .../release/version/_release.version.scss       |   17 -
 .../src/common/modules/release/version/index.js |   19 -
 .../release/version/release.version.tpl.html    |   24 -
 .../app/src/common/modules/table/_table.scss    |   23 +
 .../modules/table/asns/TableASNsController.js   |   47 +
 .../app/src/common/modules/table/asns/index.js  |   21 +
 .../modules/table/asns/table.asns.tpl.html      |   49 +
 .../TableCacheGroupAsnsController.js            |   47 +
 .../modules/table/cacheGroupAsns/index.js       |   21 +
 .../table.cacheGroupAsns.tpl.html               |   50 +
 .../TableCacheGroupParametersController.js      |   82 +
 ...TableCacheGroupParamsUnassignedController.js |   69 +
 .../modules/table/cacheGroupParameters/index.js |   22 +
 .../table.cacheGroupParameters.tpl.html         |   55 +
 .../table.cacheGroupParamsUnassigned.tpl.html   |   49 +
 .../TableCacheGroupServersController.js         |  119 +
 .../modules/table/cacheGroupServers/index.js    |   21 +
 .../table.cacheGroupServers.tpl.html            |   90 +
 ...TableCacheGroupStaticDnsEntriesController.js |   43 +
 .../table/cacheGroupStaticDnsEntries/index.js   |   21 +
 .../table.cacheGroupStaticDnsEntries.tpl.html   |   58 +
 .../cacheGroups/TableCacheGroupsController.js   |   47 +
 .../common/modules/table/cacheGroups/index.js   |   21 +
 .../cacheGroups/table.cacheGroups.tpl.html      |   54 +
 .../TableCDNDeliveryServicesController.js       |   47 +
 .../modules/table/cdnDeliveryServices/index.js  |   21 +
 .../table.cdnDeliveryServices.tpl.html          |   69 +
 .../cdnProfiles/TableCDNProfilesController.js   |   47 +
 .../common/modules/table/cdnProfiles/index.js   |   21 +
 .../cdnProfiles/table.cdnProfiles.tpl.html      |   55 +
 .../cdnServers/TableCDNServersController.js     |   69 +
 .../common/modules/table/cdnServers/index.js    |   21 +
 .../table/cdnServers/table.cdnServers.tpl.html  |   85 +
 .../modules/table/cdns/TableCDNsController.js   |   47 +
 .../app/src/common/modules/table/cdns/index.js  |   21 +
 .../modules/table/cdns/table.cdns.tpl.html      |   51 +
 .../changeLogs/TableChangeLogsController.js     |   43 +
 .../common/modules/table/changeLogs/index.js    |   21 +
 .../table/changeLogs/table.changeLogs.tpl.html  |   54 +
 .../TableDeliveryServiceJobsController.js       |   47 +
 .../modules/table/deliveryServiceJobs/index.js  |   21 +
 .../table.deliveryServiceJobs.tpl.html          |   55 +
 .../TableDeliveryServiceRegexesController.js    |   51 +
 .../table/deliveryServiceRegexes/index.js       |   21 +
 .../table.deliveryServiceRegexes.tpl.html       |   53 +
 .../TableDSServersUnassignedController.js       |  107 +
 .../TableDeliveryServiceServersController.js    |   86 +
 .../table/deliveryServiceServers/index.js       |   22 +
 .../table.deliveryServiceServers.tpl.html       |   78 +
 .../table.dsServersUnassigned.tpl.html          |   49 +
 ...DeliveryServiceStaticDnsEntriesController.js |   43 +
 .../deliveryServiceStaticDnsEntries/index.js    |   21 +
 ...ble.deliveryServiceStaticDnsEntries.tpl.html |   58 +
 .../TableDeliveryServiceUsersController.js      |   55 +
 .../modules/table/deliveryServiceUsers/index.js |   21 +
 .../table.deliveryServiceUsers.tpl.html         |   60 +
 .../TableDeliveryServicesController.js          |   74 +
 .../modules/table/deliveryServices/index.js     |   21 +
 .../table.deliveryServices.tpl.html             |   65 +
 .../TableDivisionRegionsController.js           |   47 +
 .../modules/table/divisionRegions/index.js      |   21 +
 .../table.divisionRegions.tpl.html              |   52 +
 .../table/divisions/TableDivisionsController.js |   47 +
 .../src/common/modules/table/divisions/index.js |   21 +
 .../table/divisions/table.divisions.tpl.html    |   47 +
 .../modules/table/jobs/TableJobsController.js   |   43 +
 .../app/src/common/modules/table/jobs/index.js  |   21 +
 .../modules/table/jobs/table.jobs.tpl.html      |   55 +
 .../TableParameterCacheGroupsController.js      |   51 +
 .../modules/table/parameterCacheGroups/index.js |   21 +
 .../table.parameterCacheGroups.tpl.html         |   59 +
 .../TableParamProfilesUnassignedController.js   |   69 +
 .../TableParameterProfilesController.js         |   87 +
 .../modules/table/parameterProfiles/index.js    |   22 +
 .../table.paramProfilesUnassigned.tpl.html      |   51 +
 .../table.parameterProfiles.tpl.html            |   53 +
 .../parameters/TableParametersController.js     |   47 +
 .../common/modules/table/parameters/index.js    |   21 +
 .../table/parameters/table.parameters.tpl.html  |   51 +
 .../TablePhysLocationServersController.js       |   51 +
 .../modules/table/physLocationServers/index.js  |   21 +
 .../table.physLocationServers.tpl.html          |   81 +
 .../TablePhysLocationsController.js             |   47 +
 .../common/modules/table/physLocations/index.js |   21 +
 .../physLocations/table.physLocations.tpl.html  |   58 +
 .../TableProfileDeliveryServicesController.js   |   47 +
 .../table/profileDeliveryServices/index.js      |   22 +
 .../table.profileDeliveryServices.tpl.html      |   74 +
 .../TableProfileParametersController.js         |   82 +
 .../TableProfileParamsUnassignedController.js   |   69 +
 .../modules/table/profileParameters/index.js    |   22 +
 .../table.profileParameters.tpl.html            |   57 +
 .../table.profileParamsUnassigned.tpl.html      |   49 +
 .../TableProfileServersController.js            |   51 +
 .../modules/table/profileServers/index.js       |   22 +
 .../table.profileServers.tpl.html               |   78 +
 .../table/profiles/TableProfilesController.js   |   55 +
 .../src/common/modules/table/profiles/index.js  |   21 +
 .../table/profiles/table.profiles.tpl.html      |   63 +
 .../TableRegionPhysLocationsController.js       |   51 +
 .../modules/table/regionPhysLocations/index.js  |   21 +
 .../table.regionPhysLocations.tpl.html          |   59 +
 .../table/regions/TableRegionsController.js     |   47 +
 .../src/common/modules/table/regions/index.js   |   21 +
 .../table/regions/table.regions.tpl.html        |   51 +
 .../TableServerDeliveryServicesController.js    |   60 +
 .../table/serverDeliveryServices/index.js       |   21 +
 .../table.serverDeliveryServices.tpl.html       |   78 +
 .../table/servers/TableServersController.js     |  124 +
 .../src/common/modules/table/servers/index.js   |   21 +
 .../table/servers/table.servers.tpl.html        |   86 +
 .../TableStatusServersController.js             |   51 +
 .../common/modules/table/statusServers/index.js |   22 +
 .../statusServers/table.statusServers.tpl.html  |   72 +
 .../table/statuses/TableStatusesController.js   |   47 +
 .../src/common/modules/table/statuses/index.js  |   21 +
 .../table/statuses/table.statuses.tpl.html      |   49 +
 .../table/tenants/TableTenantsController.js     |   47 +
 .../src/common/modules/table/tenants/index.js   |   21 +
 .../table/tenants/table.tenants.tpl.html        |   55 +
 .../TableTypeCacheGroupsController.js           |   47 +
 .../modules/table/typeCacheGroups/index.js      |   22 +
 .../table.typeCacheGroups.tpl.html              |   56 +
 .../TableTypeDeliveryServicesController.js      |   47 +
 .../modules/table/typeDeliveryServices/index.js |   22 +
 .../table.typeDeliveryServices.tpl.html         |   66 +
 .../typeServers/TableTypeServersController.js   |   51 +
 .../common/modules/table/typeServers/index.js   |   22 +
 .../typeServers/table.typeServers.tpl.html      |   72 +
 .../TableTypeStaticDnsEntriesController.js      |   43 +
 .../modules/table/typeStaticDnsEntries/index.js |   22 +
 .../table.typeStaticDnsEntries.tpl.html         |   58 +
 .../modules/table/types/TableTypesController.js |   47 +
 .../app/src/common/modules/table/types/index.js |   21 +
 .../modules/table/types/table.types.tpl.html    |   51 +
 .../TableUserDSUnassignedController.js          |  107 +
 .../TableUserDeliveryServicesController.js      |   82 +
 .../modules/table/userDeliveryServices/index.js |   22 +
 .../table.userDSUnassigned.tpl.html             |   47 +
 .../table.userDeliveryServices.tpl.html         |   55 +
 .../modules/table/users/TableUsersController.js |   47 +
 .../app/src/common/modules/table/users/index.js |   21 +
 .../modules/table/users/table.users.tpl.html    |   57 +
 .../modules/tools/purge/ToolsPurgeController.js |   92 -
 .../modules/tools/purge/_tools.purge.scss       |   54 -
 .../app/src/common/modules/tools/purge/index.js |   19 -
 .../modules/tools/purge/tools.purge.tpl.html    |   47 -
 .../cacheGroups/WidgetCacheGroupsController.js  |   43 +
 .../widget/cacheGroups/_widget.cacheGroups.scss |   62 +
 .../common/modules/widget/cacheGroups/index.js  |   21 +
 .../cacheGroups/widget.cacheGroups.tpl.html     |   69 +
 .../widget/capacity/WidgetCapacityController.js |  101 +
 .../widget/capacity/_widget.capacity.scss       |   31 +
 .../src/common/modules/widget/capacity/index.js |   21 +
 .../widget/capacity/widget.capacity.tpl.html    |   64 +
 .../widget/cdnChart/WidgetCDNChartController.js |  186 +
 .../widget/cdnChart/_widget.cdnChart.scss       |   30 +
 .../src/common/modules/widget/cdnChart/index.js |   21 +
 .../widget/cdnChart/widget.cdnChart.tpl.html    |   59 +
 .../changeLogs/WidgetChangeLogsController.js    |   39 +
 .../common/modules/widget/changeLogs/index.js   |   21 +
 .../changeLogs/widget.changeLogs.tpl.html       |   50 +
 .../widget/routing/WidgetRoutingController.js   |   45 +
 .../modules/widget/routing/_widget.routing.scss |   20 +
 .../src/common/modules/widget/routing/index.js  |   21 +
 .../widget/routing/widget.routing.tpl.html      |  157 +
 .../service/application/ApplicationService.js   |   55 +-
 .../app/src/common/service/application/index.js |   32 +-
 .../app/src/common/service/utils/ChartUtils.js  |   38 -
 .../app/src/common/service/utils/DateUtils.js   |  131 +
 .../app/src/common/service/utils/FormUtils.js   |   34 +-
 .../app/src/common/service/utils/JSONUtils.js   |   99 -
 .../src/common/service/utils/LocationUtils.js   |   29 +
 .../app/src/common/service/utils/NumberUtils.js |  102 +-
 .../app/src/common/service/utils/ServerUtils.js |   33 +
 .../app/src/common/service/utils/StringUtils.js |   29 +
 .../src/common/service/utils/date/DateUtils.js  |  131 -
 .../app/src/common/service/utils/date/index.js  |   19 -
 .../app/src/common/service/utils/index.js       |   38 +-
 .../app/src/common/templates/master.tpl.html    |   50 +-
 traffic_portal/app/src/index.html               |   86 +-
 .../modules/private/admin/AdminController.js    |   23 +
 .../app/src/modules/private/admin/_admin.scss   |   16 +
 .../src/modules/private/admin/admin.tpl.html    |   22 +
 .../private/admin/asns/AsnsController.js        |   24 +
 .../modules/private/admin/asns/asns.tpl.html    |   22 +
 .../modules/private/admin/asns/edit/index.js    |   39 +
 .../app/src/modules/private/admin/asns/index.js |   36 +
 .../modules/private/admin/asns/list/index.js    |   39 +
 .../src/modules/private/admin/asns/new/index.js |   39 +
 .../private/admin/cdns/CdnsController.js        |   24 +
 .../modules/private/admin/cdns/cdns.tpl.html    |   22 +
 .../admin/cdns/config/ConfigController.js       |  212 +
 .../private/admin/cdns/config/_config.scss      |   50 +
 .../private/admin/cdns/config/config.tpl.html   |  124 +
 .../modules/private/admin/cdns/config/index.js  |   46 +
 .../admin/cdns/deliveryServices/index.js        |   42 +
 .../modules/private/admin/cdns/edit/index.js    |   39 +
 .../app/src/modules/private/admin/cdns/index.js |   36 +
 .../modules/private/admin/cdns/list/index.js    |   39 +
 .../src/modules/private/admin/cdns/new/index.js |   42 +
 .../private/admin/cdns/profiles/index.js        |   42 +
 .../modules/private/admin/cdns/servers/index.js |   42 +
 .../admin/changeLogs/ChangeLogsController.js    |   24 +
 .../admin/changeLogs/changeLogs.tpl.html        |   22 +
 .../modules/private/admin/changeLogs/index.js   |   36 +
 .../private/admin/changeLogs/list/index.js      |   39 +
 .../admin/divisions/DivisionsController.js      |   24 +
 .../private/admin/divisions/_divisions.scss     |   16 +
 .../private/admin/divisions/divisions.tpl.html  |   22 +
 .../private/admin/divisions/edit/index.js       |   39 +
 .../modules/private/admin/divisions/index.js    |   36 +
 .../private/admin/divisions/list/index.js       |   39 +
 .../private/admin/divisions/new/index.js        |   39 +
 .../private/admin/divisions/regions/index.js    |   42 +
 .../app/src/modules/private/admin/index.js      |   35 +
 .../private/admin/jobs/JobsController.js        |   24 +
 .../app/src/modules/private/admin/jobs/index.js |   36 +
 .../modules/private/admin/jobs/jobs.tpl.html    |   22 +
 .../modules/private/admin/jobs/list/index.js    |   39 +
 .../src/modules/private/admin/jobs/new/index.js |   39 +
 .../admin/parameters/ParametersController.js    |   24 +
 .../admin/parameters/cacheGroups/index.js       |   42 +
 .../private/admin/parameters/edit/index.js      |   39 +
 .../modules/private/admin/parameters/index.js   |   36 +
 .../private/admin/parameters/list/index.js      |   39 +
 .../private/admin/parameters/new/index.js       |   39 +
 .../admin/parameters/parameters.tpl.html        |   22 +
 .../private/admin/parameters/profiles/index.js  |   42 +
 .../physLocations/PhysLocationsController.js    |   24 +
 .../private/admin/physLocations/edit/index.js   |   39 +
 .../private/admin/physLocations/index.js        |   36 +
 .../private/admin/physLocations/list/index.js   |   39 +
 .../private/admin/physLocations/new/index.js    |   39 +
 .../admin/physLocations/physLocations.tpl.html  |   22 +
 .../admin/physLocations/servers/index.js        |   42 +
 .../admin/profiles/ProfilesController.js        |   24 +
 .../admin/profiles/deliveryServices/index.js    |   42 +
 .../private/admin/profiles/edit/index.js        |   39 +
 .../src/modules/private/admin/profiles/index.js |   36 +
 .../private/admin/profiles/list/index.js        |   39 +
 .../modules/private/admin/profiles/new/index.js |   39 +
 .../private/admin/profiles/parameters/index.js  |   42 +
 .../private/admin/profiles/profiles.tpl.html    |   22 +
 .../private/admin/profiles/servers/index.js     |   42 +
 .../private/admin/regions/RegionsController.js  |   24 +
 .../modules/private/admin/regions/_regions.scss |   16 +
 .../modules/private/admin/regions/edit/index.js |   39 +
 .../src/modules/private/admin/regions/index.js  |   36 +
 .../modules/private/admin/regions/list/index.js |   39 +
 .../modules/private/admin/regions/new/index.js  |   39 +
 .../admin/regions/physLocations/index.js        |   42 +
 .../private/admin/regions/regions.tpl.html      |   22 +
 .../admin/statuses/StatusesController.js        |   24 +
 .../private/admin/statuses/edit/index.js        |   39 +
 .../src/modules/private/admin/statuses/index.js |   36 +
 .../private/admin/statuses/list/index.js        |   39 +
 .../modules/private/admin/statuses/new/index.js |   39 +
 .../private/admin/statuses/servers/index.js     |   42 +
 .../private/admin/statuses/statuses.tpl.html    |   22 +
 .../private/admin/tenants/TenantsController.js  |   24 +
 .../modules/private/admin/tenants/_tenants.scss |   16 +
 .../modules/private/admin/tenants/edit/index.js |   39 +
 .../src/modules/private/admin/tenants/index.js  |   36 +
 .../modules/private/admin/tenants/list/index.js |   39 +
 .../modules/private/admin/tenants/new/index.js  |   39 +
 .../private/admin/tenants/tenants.tpl.html      |   22 +
 .../private/admin/types/TypesController.js      |   24 +
 .../private/admin/types/cacheGroups/index.js    |   42 +
 .../admin/types/deliveryServices/index.js       |   42 +
 .../modules/private/admin/types/edit/index.js   |   39 +
 .../src/modules/private/admin/types/index.js    |   36 +
 .../modules/private/admin/types/list/index.js   |   39 +
 .../modules/private/admin/types/new/index.js    |   39 +
 .../private/admin/types/servers/index.js        |   42 +
 .../admin/types/staticDnsEntries/index.js       |   42 +
 .../modules/private/admin/types/types.tpl.html  |   22 +
 .../private/admin/users/UsersController.js      |   24 +
 .../src/modules/private/admin/users/_users.scss |   16 +
 .../admin/users/deliveryServices/index.js       |   42 +
 .../modules/private/admin/users/edit/index.js   |   39 +
 .../src/modules/private/admin/users/index.js    |   36 +
 .../modules/private/admin/users/list/index.js   |   39 +
 .../modules/private/admin/users/new/index.js    |   39 +
 .../modules/private/admin/users/users.tpl.html  |   22 +
 .../private/collateral/CollateralController.js  |   25 -
 .../modules/private/collateral/_collateral.scss |   29 -
 .../private/collateral/collateral.tpl.html      |   34 -
 .../app/src/modules/private/collateral/index.js |   32 -
 .../private/configure/ConfigureController.js    |   29 +
 .../modules/private/configure/_configure.scss   |   16 +
 .../cacheGroups/CacheGroupsController.js        |   24 +
 .../configure/cacheGroups/_cacheGroups.scss     |   16 +
 .../private/configure/cacheGroups/asns/index.js |   42 +
 .../configure/cacheGroups/cacheGroups.tpl.html  |   22 +
 .../private/configure/cacheGroups/edit/index.js |   39 +
 .../private/configure/cacheGroups/index.js      |   36 +
 .../private/configure/cacheGroups/list/index.js |   39 +
 .../private/configure/cacheGroups/new/index.js  |   39 +
 .../configure/cacheGroups/parameters/index.js   |   42 +
 .../configure/cacheGroups/servers/index.js      |   42 +
 .../cacheGroups/staticDnsEntries/index.js       |   42 +
 .../private/configure/configure.tpl.html        |   22 +
 .../DeliveryServicesController.js               |   24 +
 .../deliveryServices/_deliveryServices.scss     |   16 +
 .../deliveryServices/deliveryServices.tpl.html  |   22 +
 .../configure/deliveryServices/edit/index.js    |   62 +
 .../private/configure/deliveryServices/index.js |   36 +
 .../jobs/DeliveryServiceJobsController.js       |   24 +
 .../jobs/deliveryServiceJobs.tpl.html           |   22 +
 .../configure/deliveryServices/jobs/index.js    |   36 +
 .../deliveryServices/jobs/list/index.js         |   42 +
 .../deliveryServices/jobs/new/index.js          |   42 +
 .../configure/deliveryServices/list/index.js    |   39 +
 .../configure/deliveryServices/new/index.js     |   76 +
 .../regexes/DeliveryServiceRegexesController.js |   24 +
 .../regexes/deliveryServiceRegexes.tpl.html     |   22 +
 .../deliveryServices/regexes/edit/index.js      |   42 +
 .../configure/deliveryServices/regexes/index.js |   36 +
 .../deliveryServices/regexes/list/index.js      |   42 +
 .../deliveryServices/regexes/new/index.js       |   42 +
 .../configure/deliveryServices/servers/index.js |   42 +
 .../deliveryServices/staticDnsEntries/index.js  |   42 +
 .../configure/deliveryServices/users/index.js   |   42 +
 .../app/src/modules/private/configure/index.js  |   35 +
 .../configure/servers/ServersController.js      |   24 +
 .../private/configure/servers/_servers.scss     |   16 +
 .../configure/servers/deliveryServices/index.js |   42 +
 .../private/configure/servers/edit/index.js     |   39 +
 .../modules/private/configure/servers/index.js  |   36 +
 .../private/configure/servers/list/index.js     |   39 +
 .../private/configure/servers/new/index.js      |   42 +
 .../private/configure/servers/servers.tpl.html  |   22 +
 .../modules/private/custom/CustomController.js  |   42 +
 .../app/src/modules/private/custom/_custom.scss |   36 +
 .../src/modules/private/custom/custom.tpl.html  |   20 +
 .../app/src/modules/private/custom/index.js     |   33 +
 .../private/dashboard/DashboardController.js    |   37 -
 .../modules/private/dashboard/_dashboard.scss   |   33 -
 .../private/dashboard/dashboard.tpl.html        |   38 -
 .../app/src/modules/private/dashboard/index.js  |   33 -
 .../DashboardDeliveryServicesController.js      |  188 -
 .../_dashboard.deliveryServices.scss            |   20 -
 .../dashboard.deliveryServices.tpl.html         |   52 -
 .../modules/private/dashboard/overview/index.js |   48 -
 .../DeliveryServiceController.js                |   25 -
 .../deliveryService/_deliveryService.scss       |   17 -
 .../deliveryService/deliveryService.tpl.html    |   18 -
 .../modules/private/deliveryService/index.js    |   33 -
 .../new/DeliveryServiceNewController.js         |  147 -
 .../new/_deliveryService.new.scss               |   75 -
 .../new/deliveryService.new.tpl.html            |  601 ---
 .../private/deliveryService/new/index.js        |   32 -
 .../view/DeliveryServiceViewController.js       |   25 -
 .../view/_deliveryService.view.scss             |   17 -
 .../DeliveryServiceViewChartsController.js      |   58 -
 .../charts/_deliveryService.view.charts.scss    |  112 -
 .../view/charts/bandwidthPerSecond/index.js     |   51 -
 .../charts/deliveryService.view.charts.tpl.html |   64 -
 .../view/charts/httpStatus/index.js             |   48 -
 .../deliveryService/view/charts/index.js        |   33 -
 .../view/charts/transactionsPerSecond/index.js  |   51 -
 .../view/deliveryService.view.tpl.html          |   18 -
 .../private/deliveryService/view/index.js       |   38 -
 .../DeliveryServiceViewOverviewController.js    |   73 -
 .../_deliveryService.view.overview.scss         |   98 -
 .../deliveryService.view.overview.tpl.html      |   58 -
 .../view/overview/detail/index.js               |   95 -
 .../deliveryService/view/overview/index.js      |   33 -
 traffic_portal/app/src/modules/private/index.js |   49 +-
 .../private/monitor/MonitorController.js        |   23 +
 .../src/modules/private/monitor/_monitor.scss   |   16 +
 .../monitor/dashboard/DashboardController.js    |   36 +
 .../private/monitor/dashboard/_dashboard.scss   |   16 +
 .../monitor/dashboard/dashboard.tpl.html        |   85 +
 .../modules/private/monitor/dashboard/index.js  |   51 +
 .../private/monitor/dashboard/view/index.js     |   72 +
 .../app/src/modules/private/monitor/index.js    |   35 +
 .../private/monitor/map/MapController.js        |  101 +
 .../src/modules/private/monitor/map/_map.scss   |   21 +
 .../src/modules/private/monitor/map/index.js    |   43 +
 .../modules/private/monitor/map/map.tpl.html    |   38 +
 .../modules/private/monitor/monitor.tpl.html    |   22 +
 .../app/src/modules/private/private.tpl.html    |   26 +-
 .../src/modules/private/user/UserController.js  |   77 +-
 .../app/src/modules/private/user/_user.scss     |   23 +-
 .../private/user/edit/UserEditController.js     |   35 +-
 .../modules/private/user/edit/_user.edit.scss   |   22 -
 .../app/src/modules/private/user/edit/index.js  |   35 +-
 .../private/user/edit/user.edit.tpl.html        |  182 -
 .../app/src/modules/private/user/index.js       |   32 +-
 .../user/register/UserRegisterController.js     |   27 -
 .../private/user/register/_user.register.scss   |   17 -
 .../src/modules/private/user/register/index.js  |   33 -
 .../private/user/reset/UserResetController.js   |   38 -
 .../modules/private/user/reset/_user.reset.scss |   17 -
 .../app/src/modules/private/user/reset/index.js |   33 -
 .../app/src/modules/private/user/user.tpl.html  |   38 +-
 .../src/modules/public/about/AboutController.js |   44 -
 .../app/src/modules/public/about/_about.scss    |   28 -
 .../app/src/modules/public/about/about.tpl.html |   20 -
 .../app/src/modules/public/about/index.js       |   33 -
 .../src/modules/public/home/HomeController.js   |   47 -
 .../app/src/modules/public/home/_home.scss      |   63 -
 .../app/src/modules/public/home/home.tpl.html   |   49 -
 .../app/src/modules/public/home/index.js        |   34 -
 .../src/modules/public/home/landing/index.js    |   26 -
 traffic_portal/app/src/modules/public/index.js  |   38 +-
 .../src/modules/public/login/LoginController.js |   49 +
 .../app/src/modules/public/login/_login.scss    |   16 +
 .../app/src/modules/public/login/index.js       |   35 +
 .../app/src/modules/public/login/login.tpl.html |   53 +
 .../app/src/modules/public/public.tpl.html      |   26 +-
 traffic_portal/app/src/package.json             |    8 +-
 traffic_portal/app/src/robots.txt               |    2 +-
 traffic_portal/app/src/scripts/config.js        |   28 +
 traffic_portal/app/src/scripts/shared-libs.js   |   38 +-
 traffic_portal/app/src/styles/main.scss         |  343 +-
 traffic_portal/app/src/styles/theme.scss        | 4159 ++++++++++++++++++
 .../app/src/traffic_portal_properties.json      |  103 +-
 .../app/src/traffic_portal_release.json         |    6 +-
 traffic_portal/bower.json                       |   41 +-
 traffic_portal/build/README.md                  |    4 +-
 traffic_portal/build/build_rpm.sh               |    5 +-
 traffic_portal/build/etc/init.d/traffic_portal  |    1 +
 traffic_portal/build/traffic_portal.spec        |    1 -
 traffic_portal/conf/config-template.js          |   47 -
 traffic_portal/conf/config.js                   |   48 +-
 traffic_portal/docker/Dockerfile                |   25 +
 traffic_portal/docker/docker-compose.yml        |   32 +
 traffic_portal/docker/reset.sh                  |   28 +
 .../etc/systemd/system/traffic_portal.service   |   30 +
 traffic_portal/grunt/browserify2.js             |   48 +-
 traffic_portal/grunt/clean.js                   |   38 +-
 traffic_portal/grunt/compass.js                 |   33 +-
 traffic_portal/grunt/copy.js                    |   39 +-
 traffic_portal/grunt/express.js                 |   32 +-
 traffic_portal/grunt/globalConfig.js            |   31 +-
 traffic_portal/grunt/html2js.js                 |   33 +-
 traffic_portal/grunt/install-dependencies.js    |    8 +-
 traffic_portal/grunt/jshint.js                  |   33 +-
 traffic_portal/grunt/ngconstant.js              |   46 -
 traffic_portal/grunt/uglify.js                  |   32 +-
 traffic_portal/grunt/watch.js                   |   33 +-
 traffic_portal/package.json                     |   21 +-
 traffic_portal/server/server.js                 |  106 +-
 traffic_portal/v1/.bowerrc                      |    3 +
 traffic_portal/v1/.gitignore                    |    9 +
 traffic_portal/v1/.jshintrc                     |   23 +
 traffic_portal/v1/Gruntfile.js                  |   96 +
 traffic_portal/v1/README.md                     |    5 +
 traffic_portal/v1/app/src/AppController.js      |   21 +
 traffic_portal/v1/app/src/app.js                |  181 +
 traffic_portal/v1/app/src/assets/css/custom.css |   23 +
 .../v1/app/src/assets/images/favicon.png        |  Bin 0 -> 1386 bytes
 traffic_portal/v1/app/src/assets/js/.keep       |    0
 .../v1/app/src/assets/other/collateral.txt      |    1 +
 .../v1/app/src/common/api/AuthService.js        |   82 +
 .../src/common/api/DeliveryServiceService.js    |  177 +
 .../v1/app/src/common/api/HealthService.js      |   45 +
 .../v1/app/src/common/api/PortalService.js      |   43 +
 .../v1/app/src/common/api/StatsService.js       |  159 +
 .../v1/app/src/common/api/UserService.js        |  105 +
 traffic_portal/v1/app/src/common/api/index.js   |   25 +
 .../common/directives/enter/EnterDirective.js   |   31 +
 .../v1/app/src/common/directives/enter/index.js |   20 +
 .../formattedDate/FormattedDateDirective.js     |   34 +
 .../common/directives/formattedDate/index.js    |   20 +
 .../common/directives/match/MatchDirective.js   |   31 +
 .../v1/app/src/common/directives/match/index.js |   20 +
 .../directives/rcSubmit/RCSubmitDirective.js    |   91 +
 .../app/src/common/directives/rcSubmit/index.js |   19 +
 .../rcVerifySet/RCVerifySetDirective.js         |   33 +
 .../src/common/directives/rcVerifySet/index.js  |   19 +
 .../selectOnClick/SelectOnClickDirective.js     |   29 +
 .../common/directives/selectOnClick/index.js    |   19 +
 .../app/src/common/filters/DateRangeFilter.js   |   32 +
 .../v1/app/src/common/filters/OffsetFilter.js   |   28 +
 .../app/src/common/filters/PartitionFilter.js   |   37 +
 .../v1/app/src/common/filters/PercentFilter.js  |   33 +
 .../v1/app/src/common/filters/UnitsFilter.js    |   26 +
 .../v1/app/src/common/filters/index.js          |   25 +
 .../v1/app/src/common/models/AuthModel.js       |   21 +
 .../v1/app/src/common/models/ChartModel.js      |  138 +
 .../src/common/models/DeliveryServicesModel.js  |   45 +
 .../v1/app/src/common/models/MessageModel.js    |   66 +
 .../v1/app/src/common/models/PropertiesModel.js |   31 +
 .../v1/app/src/common/models/UserModel.js       |   46 +
 .../v1/app/src/common/models/index.js           |   24 +
 .../cacheGroups/CacheGroupsController.js        |   83 +
 .../modules/cacheGroups/_cacheGroups.scss       |   74 +
 .../modules/cacheGroups/cacheGroups.tpl.html    |   55 +
 .../app/src/common/modules/cacheGroups/index.js |   19 +
 .../v1/app/src/common/modules/chart/_chart.scss |   89 +
 .../ChartBandwidthPerSecondController.js        |  224 +
 .../_chart.bandwidthPerSecond.scss              |   40 +
 .../chart.bandwidthPerSecond.tpl.html           |   66 +
 .../modules/chart/bandwidthPerSecond/index.js   |   19 +
 .../chart/capacity/ChartCapacityController.js   |  117 +
 .../modules/chart/capacity/_chart.capacity.scss |   25 +
 .../chart/capacity/chart.capacity.tpl.html      |   22 +
 .../src/common/modules/chart/capacity/index.js  |   19 +
 .../modules/chart/dates/ChartDatesController.js |  139 +
 .../modules/chart/dates/_chart.dates.scss       |   68 +
 .../modules/chart/dates/chart.dates.tpl.html    |   57 +
 .../app/src/common/modules/chart/dates/index.js |   26 +
 .../httpStatus/ChartHttpStatusController.js     |  175 +
 .../chart/httpStatus/_chart.httpStatus.scss     |   99 +
 .../chart/httpStatus/chart.httpStatus.tpl.html  |   27 +
 .../common/modules/chart/httpStatus/index.js    |   19 +
 .../chart/routing/ChartRoutingController.js     |  141 +
 .../modules/chart/routing/_chart.routing.scss   |   25 +
 .../chart/routing/chart.routing.tpl.html        |   22 +
 .../src/common/modules/chart/routing/index.js   |   19 +
 .../ChartTransactionsPerSecondController.js     |  214 +
 .../_chart.transactionsPerSecond.scss           |   39 +
 .../chart.transactionsPerSecond.tpl.html        |   64 +
 .../chart/transactionsPerSecond/index.js        |   19 +
 .../src/common/modules/dates/DatesController.js |   55 +
 .../v1/app/src/common/modules/dates/_dates.scss |   47 +
 .../app/src/common/modules/dates/dates.tpl.html |   42 +
 .../v1/app/src/common/modules/dates/index.js    |   19 +
 .../config/edit/DSConfigEditController.js       |   55 +
 .../edit/_deliveryService.config.edit.scss      |   36 +
 .../edit/deliveryService.config.edit.tpl.html   |  126 +
 .../deliveryService/config/edit/index.js        |   19 +
 .../dialog/confirm/DialogConfirmController.js   |   33 +
 .../modules/dialog/confirm/_dialog.confirm.scss |   17 +
 .../dialog/confirm/dialog.confirm.tpl.html      |   27 +
 .../src/common/modules/dialog/confirm/index.js  |   19 +
 .../dialog/reset/DialogResetController.js       |   39 +
 .../modules/dialog/reset/_dialog.reset.scss     |   17 +
 .../modules/dialog/reset/dialog.reset.tpl.html  |   38 +
 .../src/common/modules/dialog/reset/index.js    |   19 +
 .../common/modules/footer/FooterController.js   |   33 +
 .../src/common/modules/footer/footer.tpl.html   |   26 +
 .../v1/app/src/common/modules/footer/index.js   |   19 +
 .../common/modules/header/HeaderController.js   |   86 +
 .../app/src/common/modules/header/_header.scss  |   80 +
 .../src/common/modules/header/header.tpl.html   |   75 +
 .../v1/app/src/common/modules/header/index.js   |   19 +
 .../common/modules/message/MessageController.js |   45 +
 .../src/common/modules/message/_message.scss    |   24 +
 .../v1/app/src/common/modules/message/index.js  |   19 +
 .../src/common/modules/message/message.tpl.html |   29 +
 .../release/version/ReleaseVersionController.js |   29 +
 .../release/version/_release.version.scss       |   17 +
 .../src/common/modules/release/version/index.js |   19 +
 .../release/version/release.version.tpl.html    |   24 +
 .../modules/tools/purge/ToolsPurgeController.js |   92 +
 .../modules/tools/purge/_tools.purge.scss       |   54 +
 .../app/src/common/modules/tools/purge/index.js |   19 +
 .../modules/tools/purge/tools.purge.tpl.html    |   47 +
 .../service/application/ApplicationService.js   |   49 +
 .../app/src/common/service/application/index.js |   19 +
 .../app/src/common/service/utils/ChartUtils.js  |   38 +
 .../app/src/common/service/utils/FormUtils.js   |   31 +
 .../app/src/common/service/utils/JSONUtils.js   |   99 +
 .../app/src/common/service/utils/NumberUtils.js |   80 +
 .../src/common/service/utils/date/DateUtils.js  |  131 +
 .../app/src/common/service/utils/date/index.js  |   19 +
 .../v1/app/src/common/service/utils/index.js    |   22 +
 .../v1/app/src/common/templates/master.tpl.html |   32 +
 traffic_portal/v1/app/src/index.html            |   63 +
 .../private/collateral/CollateralController.js  |   25 +
 .../modules/private/collateral/_collateral.scss |   29 +
 .../private/collateral/collateral.tpl.html      |   34 +
 .../app/src/modules/private/collateral/index.js |   32 +
 .../private/dashboard/DashboardController.js    |   37 +
 .../modules/private/dashboard/_dashboard.scss   |   33 +
 .../private/dashboard/dashboard.tpl.html        |   38 +
 .../app/src/modules/private/dashboard/index.js  |   33 +
 .../DashboardDeliveryServicesController.js      |  188 +
 .../_dashboard.deliveryServices.scss            |   20 +
 .../dashboard.deliveryServices.tpl.html         |   52 +
 .../modules/private/dashboard/overview/index.js |   48 +
 .../DeliveryServiceController.js                |   25 +
 .../deliveryService/_deliveryService.scss       |   17 +
 .../deliveryService/deliveryService.tpl.html    |   18 +
 .../modules/private/deliveryService/index.js    |   33 +
 .../new/DeliveryServiceNewController.js         |  147 +
 .../new/_deliveryService.new.scss               |   75 +
 .../new/deliveryService.new.tpl.html            |  601 +++
 .../private/deliveryService/new/index.js        |   32 +
 .../view/DeliveryServiceViewController.js       |   25 +
 .../view/_deliveryService.view.scss             |   17 +
 .../DeliveryServiceViewChartsController.js      |   58 +
 .../charts/_deliveryService.view.charts.scss    |  112 +
 .../view/charts/bandwidthPerSecond/index.js     |   51 +
 .../charts/deliveryService.view.charts.tpl.html |   64 +
 .../view/charts/httpStatus/index.js             |   48 +
 .../deliveryService/view/charts/index.js        |   33 +
 .../view/charts/transactionsPerSecond/index.js  |   51 +
 .../view/deliveryService.view.tpl.html          |   18 +
 .../private/deliveryService/view/index.js       |   38 +
 .../DeliveryServiceViewOverviewController.js    |   73 +
 .../_deliveryService.view.overview.scss         |   98 +
 .../deliveryService.view.overview.tpl.html      |   58 +
 .../view/overview/detail/index.js               |   95 +
 .../deliveryService/view/overview/index.js      |   33 +
 .../v1/app/src/modules/private/index.js         |   57 +
 .../v1/app/src/modules/private/private.tpl.html |   20 +
 .../src/modules/private/user/UserController.js  |   79 +
 .../v1/app/src/modules/private/user/_user.scss  |   27 +
 .../private/user/edit/UserEditController.js     |   25 +
 .../modules/private/user/edit/_user.edit.scss   |   22 +
 .../app/src/modules/private/user/edit/index.js  |   33 +
 .../private/user/edit/user.edit.tpl.html        |  182 +
 .../v1/app/src/modules/private/user/index.js    |   33 +
 .../user/register/UserRegisterController.js     |   27 +
 .../private/user/register/_user.register.scss   |   17 +
 .../src/modules/private/user/register/index.js  |   33 +
 .../private/user/reset/UserResetController.js   |   38 +
 .../modules/private/user/reset/_user.reset.scss |   17 +
 .../app/src/modules/private/user/reset/index.js |   33 +
 .../app/src/modules/private/user/user.tpl.html  |   32 +
 .../src/modules/public/about/AboutController.js |   44 +
 .../v1/app/src/modules/public/about/_about.scss |   28 +
 .../app/src/modules/public/about/about.tpl.html |   20 +
 .../v1/app/src/modules/public/about/index.js    |   33 +
 .../src/modules/public/home/HomeController.js   |   47 +
 .../v1/app/src/modules/public/home/_home.scss   |   63 +
 .../app/src/modules/public/home/home.tpl.html   |   49 +
 .../v1/app/src/modules/public/home/index.js     |   34 +
 .../src/modules/public/home/landing/index.js    |   26 +
 .../v1/app/src/modules/public/index.js          |   43 +
 .../v1/app/src/modules/public/public.tpl.html   |   20 +
 traffic_portal/v1/app/src/package.json          |   16 +
 traffic_portal/v1/app/src/robots.txt            |   17 +
 .../v1/app/src/scripts/shared-libs.js           |   50 +
 traffic_portal/v1/app/src/styles/loading.scss   |  110 +
 traffic_portal/v1/app/src/styles/main.scss      |  349 ++
 traffic_portal/v1/app/src/styles/variables.scss |   28 +
 .../v1/app/src/traffic_portal_properties.json   |   99 +
 .../v1/app/src/traffic_portal_release.json      |    5 +
 traffic_portal/v1/bower.json                    |   22 +
 traffic_portal/v1/build/build_rpm.sh            |   54 +
 .../v1/build/etc/init.d/traffic_portal          |  152 +
 .../v1/build/etc/logrotate.d/traffic_portal     |   26 +
 .../build/etc/logrotate.d/traffic_portal-access |   26 +
 traffic_portal/v1/build/traffic_portal.spec     |   89 +
 traffic_portal/v1/conf/config-template.js       |   47 +
 traffic_portal/v1/conf/config.js                |   42 +
 traffic_portal/v1/grunt/browserify2.js          |  151 +
 traffic_portal/v1/grunt/clean.js                |   23 +
 traffic_portal/v1/grunt/compass.js              |   44 +
 traffic_portal/v1/grunt/copy.js                 |   81 +
 traffic_portal/v1/grunt/express.js              |   25 +
 traffic_portal/v1/grunt/globalConfig.js         |   34 +
 traffic_portal/v1/grunt/html2js.js              |   27 +
 traffic_portal/v1/grunt/install-dependencies.js |   23 +
 traffic_portal/v1/grunt/jshint.js               |   23 +
 traffic_portal/v1/grunt/ngconstant.js           |   46 +
 traffic_portal/v1/grunt/uglify.js               |   26 +
 traffic_portal/v1/grunt/watch.js                |   34 +
 traffic_portal/v1/package.json                  |   36 +
 traffic_portal/v1/server/log/.keep              |    0
 traffic_portal/v1/server/server.js              |  110 +
 1533 files changed, 44361 insertions(+), 44543 deletions(-)
----------------------------------------------------------------------




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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html
deleted file mode 100644
index 5f67348..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.Steering.tpl.html
+++ /dev/null
@@ -1,200 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
-            <li class="active">{{deliveryServiceName}}</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <div class="btn-group" role="group" uib-dropdown is-open="keys.isopen">
-                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    <i class="fa fa-key"></i>&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="manageSslKeys()">Manage SSL Keys</a></li>
-                    <li role="menuitem"><a ng-click="manageUrlSigKeys()">Manage URL Sig Keys</a></li>
-                </ul>
-            </div>
-            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
-                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    More&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="viewServers()">View Servers</a></li>
-                    <li role="menuitem"><a ng-click="viewRegexes()">View Regexes</a></li>
-                    <li role="menuitem"><a ng-click="viewJobs()">View Invalidate Content Jobs</a></li>
-                    <li role="menuitem"><a ng-click="viewStaticDnsEntries()">View Static DNS Entries</a></li>
-                </ul>
-            </div>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="deliveryServiceForm" class="form-horizontal form-label-left" novalidate>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.type.id), 'has-feedback': hasError(deliveryServiceForm.type.id)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Content Routing Type *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="type" name="type" class="form-control" ng-model="deliveryService.typeId" ng-options="type.id as type.name for type in types" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.type, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.xmlId), 'has-feedback': hasError(deliveryServiceForm.xmlId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">XML ID *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="xmlId" name="xmlId" type="text" class="form-control" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">No spaces</small>
-                    <span ng-show="hasError(deliveryServiceForm.xmlId)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.displayName), 'has-feedback': hasError(deliveryServiceForm.displayName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Display Name *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="displayName" name="displayName" type="text" class="form-control" ng-model="deliveryService.displayName" ng-required="true" ng-maxlength="48" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.displayName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.active), 'has-feedback': hasError(deliveryServiceForm.active)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Active *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="active" name="active" class="form-control" ng-model="deliveryService.active" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.active, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cdn), 'has-feedback': hasError(deliveryServiceForm.cdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="cdn" name="cdn" class="form-control" ng-model="deliveryService.cdnId" ng-options="cdn.id as cdn.name for cdn in cdns" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cdn, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.protocol), 'has-feedback': hasError(deliveryServiceForm.protocol)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Protocol *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="protocol" name="protocol" class="form-control" ng-model="deliveryService.protocol" ng-options="protocol.value as protocol.label for protocol in protocols" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.protocol, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.ipv6RoutingEnabled), 'has-feedback': hasError(deliveryServiceForm.ipv6RoutingEnabled)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">IPv6 Routing Enabled *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="ipv6RoutingEnabled" name="ipv6RoutingEnabled" class="form-control" ng-model="deliveryService.ipv6RoutingEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.ipv6RoutingEnabled, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.profile), 'has-feedback': hasError(deliveryServiceForm.profile)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Profile</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="profile" name="profile" class="form-control" ng-model="deliveryService.profileId" ng-options="profile.id as profile.name for profile in profiles">
-                        <option value="">Select...</option>
-                    </select>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc), 'has-feedback': hasError(deliveryServiceForm.longDesc)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="longDesc" name="longDesc" type="text" class="form-control" ng-model="deliveryService.longDesc" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.longDesc)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc1), 'has-feedback': hasError(deliveryServiceForm.longDesc1)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 1</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="longDesc1" name="longDesc1" type="text" class="form-control" ng-model="deliveryService.longDesc1" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc1, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.longDesc1)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc2), 'has-feedback': hasError(deliveryServiceForm.longDesc2)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 2</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="longDesc2" name="longDesc2" type="text" class="form-control" ng-model="deliveryService.longDesc2" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc2, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.longDesc2)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.infoUrl), 'has-feedback': hasError(deliveryServiceForm.infoUrl)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Info URL</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="infoUrl" name="infoUrl" type="text" class="form-control" ng-model="deliveryService.infoUrl" ng-maxlength="255" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.infoUrl, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.infoUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.checkPath), 'has-feedback': hasError(deliveryServiceForm.checkPath)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Check Path</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="checkPath" name="checkPath" type="text" class="form-control" ng-model="deliveryService.checkPath" ng-maxlength="255" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.checkPath, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.checkPath)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.sslKeyVersion), 'has-feedback': hasError(deliveryServiceForm.sslKeyVersion)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">SSL Key Version</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="sslKeyVersion" name="sslKeyVersion" type="text" class="form-control" ng-model="deliveryService.sslKeyVersion" ng-maxlength="11" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.sslKeyVersion, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.sslKeyVersion)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.logsEnabled), 'has-feedback': hasError(deliveryServiceForm.logsEnabled)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Logs Enabled *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="logsEnabled" name="logsEnabled" class="form-control" ng-model="deliveryService.logsEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.logsEnabled, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(deliveryService)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html
deleted file mode 100644
index ca04ef2..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/form.deliveryService.anyMap.tpl.html
+++ /dev/null
@@ -1,225 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
-            <li class="active">{{deliveryServiceName}}</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <div class="btn-group" role="group" uib-dropdown is-open="keys.isopen">
-                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    <i class="fa fa-key"></i>&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="manageSslKeys()">Manage SSL Keys</a></li>
-                    <li role="menuitem"><a ng-click="manageUrlSigKeys()">Manage URL Sig Keys</a></li>
-                </ul>
-            </div>
-            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
-                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    More&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="viewServers()">View Servers</a></li>
-                    <li role="menuitem"><a ng-click="viewRegexes()">View Regexes</a></li>
-                    <li role="menuitem"><a ng-click="viewJobs()">View Invalidate Content Jobs</a></li>
-                    <li role="menuitem"><a ng-click="viewStaticDnsEntries()">View Static DNS Entries</a></li>
-                </ul>
-            </div>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="deliveryServiceForm" class="form-horizontal form-label-left" novalidate>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.type.id), 'has-feedback': hasError(deliveryServiceForm.type.id)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Content Routing Type *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="type" name="type" class="form-control" ng-model="deliveryService.typeId" ng-options="type.id as type.name for type in types" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.type, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.xmlId), 'has-feedback': hasError(deliveryServiceForm.xmlId)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">XML ID *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="xmlId" name="xmlId" type="text" class="form-control" ng-model="deliveryService.xmlId" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.xmlId, 'pattern')">No spaces</small>
-                    <span ng-show="hasError(deliveryServiceForm.xmlId)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.displayName), 'has-feedback': hasError(deliveryServiceForm.displayName)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Display Name *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="displayName" name="displayName" type="text" class="form-control" ng-model="deliveryService.displayName" ng-required="true" ng-maxlength="48" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.displayName, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.displayName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.active), 'has-feedback': hasError(deliveryServiceForm.active)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Active *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="active" name="active" class="form-control" ng-model="deliveryService.active" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.active, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cdn), 'has-feedback': hasError(deliveryServiceForm.cdn)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">CDN *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="cdn" name="cdn" class="form-control" ng-model="deliveryService.cdnId" ng-options="cdn.id as cdn.name for cdn in cdns" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cdn, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.geoProvider), 'has-feedback': hasError(deliveryServiceForm.geoProvider)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Geo Provider *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="geoProvider" name="geoProvider" class="form-control" ng-model="deliveryService.geoProvider" ng-options="gp.value as gp.label for gp in geoProviders" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.geoProvider, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.profile), 'has-feedback': hasError(deliveryServiceForm.profile)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Profile</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="profile" name="profile" class="form-control" ng-model="deliveryService.profileId" ng-options="profile.id as profile.name for profile in profiles">
-                        <option value="">Select...</option>
-                    </select>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.trRequestHeaders), 'has-feedback': hasError(deliveryServiceForm.trRequestHeaders)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Traffic Router Log Request Headers</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="trRequestHeaders" name="trRequestHeaders" type="text" class="form-control" ng-model="deliveryService.trRequestHeaders" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.trRequestHeaders, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.trRequestHeaders)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.cacheurl), 'has-feedback': hasError(deliveryServiceForm.cacheurl)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Cache URL expression</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="cacheurl" name="cacheurl" type="text" class="form-control" ng-model="deliveryService.cacheurl" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.cacheurl, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.cacheurl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.remapText), 'has-feedback': hasError(deliveryServiceForm.remapText)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Raw remap text</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="remapText" name="remapText" type="text" class="form-control" ng-model="deliveryService.remapText" ng-maxlength="2048" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.remapText, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.remapText)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc), 'has-feedback': hasError(deliveryServiceForm.longDesc)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="longDesc" name="longDesc" type="text" class="form-control" ng-model="deliveryService.longDesc" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.longDesc)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc1), 'has-feedback': hasError(deliveryServiceForm.longDesc1)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 1</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="longDesc1" name="longDesc1" type="text" class="form-control" ng-model="deliveryService.longDesc1" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc1, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.longDesc1)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.longDesc2), 'has-feedback': hasError(deliveryServiceForm.longDesc2)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Long Description 2</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="longDesc2" name="longDesc2" type="text" class="form-control" ng-model="deliveryService.longDesc2" ng-maxlength="1024" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.longDesc2, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.longDesc2)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.infoUrl), 'has-feedback': hasError(deliveryServiceForm.infoUrl)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Info URL</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="infoUrl" name="infoUrl" type="text" class="form-control" ng-model="deliveryService.infoUrl" ng-maxlength="255" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.infoUrl, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.infoUrl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.checkPath), 'has-feedback': hasError(deliveryServiceForm.checkPath)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Check Path</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="checkPath" name="checkPath" type="text" class="form-control" ng-model="deliveryService.checkPath" ng-maxlength="255" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.checkPath, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.checkPath)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.sslKeyVersion), 'has-feedback': hasError(deliveryServiceForm.sslKeyVersion)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">SSL Key Version</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="sslKeyVersion" name="sslKeyVersion" type="text" class="form-control" ng-model="deliveryService.sslKeyVersion" ng-maxlength="11" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.sslKeyVersion, 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(deliveryServiceForm.sslKeyVersion)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.regionalGeoBlocking), 'has-feedback': hasError(deliveryServiceForm.regionalGeoBlocking)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Regional Geoblocking *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="regionalGeoBlocking" name="regionalGeoBlocking" class="form-control" ng-model="deliveryService.regionalGeoBlocking" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.regionalGeoBlocking, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="form-group" ng-class="{'has-error': hasError(deliveryServiceForm.logsEnabled), 'has-feedback': hasError(deliveryServiceForm.logsEnabled)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Logs Enabled *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="logsEnabled" name="logsEnabled" class="form-control" ng-model="deliveryService.logsEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
-                    <small class="input-error" ng-show="hasPropertyError(deliveryServiceForm.logsEnabled, 'required')">Required</small>
-                </div>
-            </div>
-
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(deliveryService)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="deliveryServiceForm.$pristine || deliveryServiceForm.$invalid" ng-click="save(deliveryService)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/index.js
deleted file mode 100644
index 4a08c54..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.deliveryService', [])
-    .controller('FormDeliveryServiceController', require('./FormDeliveryServiceController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/new/FormNewDeliveryServiceController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/new/FormNewDeliveryServiceController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/new/FormNewDeliveryServiceController.js
deleted file mode 100644
index 01b764b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/new/FormNewDeliveryServiceController.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewDeliveryServiceController = function(deliveryService, type, types, $scope, $controller, deliveryServiceService) {
-
-	var filteredTypes = _.filter(types, function(currentType) {
-		return currentType.name.indexOf(type) != -1;
-	});
-
-	// extends the FormDeliveryServiceController to inherit common methods
-	angular.extend(this, $controller('FormDeliveryServiceController', { deliveryService: deliveryService, types: filteredTypes, $scope: $scope }));
-
-	$scope.deliveryServiceName = 'New';
-
-	$scope.settings = {
-		isNew: true,
-		saveLabel: 'Create'
-	};
-
-	$scope.save = function(deliveryService) {
-		deliveryServiceService.createDeliveryService(deliveryService);
-	};
-
-};
-
-FormNewDeliveryServiceController.$inject = ['deliveryService', 'type', 'types', '$scope', '$controller', 'deliveryServiceService'];
-module.exports = FormNewDeliveryServiceController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/new/index.js
deleted file mode 100644
index ed659ba..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryService/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.deliveryService.new', [])
-	.controller('FormNewDeliveryServiceController', require('./FormNewDeliveryServiceController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/FormDeliveryServiceJobController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/FormDeliveryServiceJobController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/FormDeliveryServiceJobController.js
deleted file mode 100644
index a672874..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/FormDeliveryServiceJobController.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormDeliveryServiceJobController = function(deliveryService, job, $scope, formUtils, locationUtils) {
-
-	$scope.deliveryService = deliveryService;
-
-	$scope.job = job;
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	$scope.hasError = formUtils.hasError;
-
-	$scope.hasPropertyError = formUtils.hasPropertyError;
-
-};
-
-FormDeliveryServiceJobController.$inject = ['deliveryService', 'job', '$scope', 'formUtils', 'locationUtils'];
-module.exports = FormDeliveryServiceJobController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html
deleted file mode 100644
index 3b735d5..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/form.deliveryServiceJob.tpl.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
-            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{deliveryService.displayName}}</a></li>
-            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '/jobs')">Invalidate Content Jobs</a></li>
-            <li class="active">{{jobName}}</li>
-        </ol>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="jobForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(jobForm.regex), 'has-feedback': hasError(jobForm.regex)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Path Regex *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="regex" name="regex" type="text" class="form-control" placeholder="eg. /path/to/content/.*\.jpg" ng-model="job.regex" ng-required="true" ng-maxlength="255" ng-pattern="/^\//" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(jobForm.regex, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(jobForm.regex, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(jobForm.regex, 'pattern')">Must Start with /</small>
-                    <span ng-show="hasError(jobForm.regex)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(jobForm.ttl), 'has-feedback': hasError(jobForm.ttl)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">TTL (hours) *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="ttl" name="ttl" type="text" class="form-control" ng-model="job.ttl" ng-required="true" ng-maxlength="1000" ng-pattern="/^\d+$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(jobForm.ttl, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(jobForm.ttl, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(jobForm.ttl, 'pattern')">Number</small>
-                    <span ng-show="hasError(jobForm.ttl)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-success" ng-disabled="jobForm.$pristine || jobForm.$invalid" ng-click="save(job)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/index.js
deleted file mode 100644
index f1cbba8..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.deliveryServiceJob', [])
-	.controller('FormDeliveryServiceJobController', require('./FormDeliveryServiceJobController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/FormNewDeliveryServiceJobController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/FormNewDeliveryServiceJobController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/FormNewDeliveryServiceJobController.js
deleted file mode 100644
index bace310..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/FormNewDeliveryServiceJobController.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewDeliveryServiceJobController = function(deliveryService, job, $scope, $controller, jobService, messageModel, locationUtils) {
-
-	// extends the FormDeliveryServiceJobController to inherit common methods
-	angular.extend(this, $controller('FormDeliveryServiceJobController', { deliveryService: deliveryService, job: job, $scope: $scope }));
-
-	$scope.jobName = 'New';
-
-	$scope.settings = {
-		isNew: true,
-		saveLabel: 'Create'
-	};
-
-	$scope.save = function(job) {
-		jobService.createJob(job)
-			.then(
-				function() {
-					messageModel.setMessages([ { level: 'success', text: 'Delivery Service Invalidate Content Job Created' } ], true);
-					locationUtils.navigateToPath('/configure/delivery-services/' + deliveryService.id + '/jobs');
-				},
-				function(fault) {
-					messageModel.setMessages(fault.data.alerts, false);
-				}
-			);
-	};
-
-};
-
-FormNewDeliveryServiceJobController.$inject = ['deliveryService', 'job', '$scope', '$controller', 'jobService', 'messageModel', 'locationUtils'];
-module.exports = FormNewDeliveryServiceJobController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/index.js
deleted file mode 100644
index a06c4d9..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceJob/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.deliveryServiceJob.new', [])
-	.controller('FormNewDeliveryServiceJobController', require('./FormNewDeliveryServiceJobController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/FormDeliveryServiceRegexController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/FormDeliveryServiceRegexController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/FormDeliveryServiceRegexController.js
deleted file mode 100644
index 8494256..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/FormDeliveryServiceRegexController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormDeliveryServiceRegexController = function(deliveryService, regex, $scope, formUtils, locationUtils, typeService) {
-
-	var getTypes = function() {
-		typeService.getTypes({ useInTable: 'regex' })
-			.then(function(result) {
-				$scope.types = result;
-			});
-	};
-
-	$scope.deliveryService = deliveryService;
-
-	$scope.regex = regex;
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	$scope.hasError = formUtils.hasError;
-
-	$scope.hasPropertyError = formUtils.hasPropertyError;
-
-	var init = function () {
-		getTypes();
-	};
-	init();
-
-};
-
-FormDeliveryServiceRegexController.$inject = ['deliveryService', 'regex', '$scope', 'formUtils', 'locationUtils', 'typeService'];
-module.exports = FormDeliveryServiceRegexController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/edit/FormEditDeliveryServiceRegexController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/edit/FormEditDeliveryServiceRegexController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/edit/FormEditDeliveryServiceRegexController.js
deleted file mode 100644
index bcfab5c..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/edit/FormEditDeliveryServiceRegexController.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditDeliveryServiceRegexController = function(deliveryService, regex, $scope, $controller, $uibModal, $anchorScroll, locationUtils, deliveryServiceRegexService) {
-
-	// extends the FormDeliveryServiceController to inherit common methods
-	angular.extend(this, $controller('FormDeliveryServiceRegexController', { deliveryService: deliveryService, regex: regex, $scope: $scope }));
-
-	var deleteDeliveryServiceRegex = function(dsId, regexId) {
-		deliveryServiceRegexService.deleteDeliveryServiceRegex(dsId, regexId)
-			.then(function() {
-				locationUtils.navigateToPath('/configure/delivery-services/' + dsId + '/regexes');
-			});
-	};
-
-	$scope.regexPattern = angular.copy(regex.pattern);
-
-	$scope.settings = {
-		isNew: false,
-		saveLabel: 'Update'
-	};
-
-	$scope.save = function(dsId, regex) {
-		deliveryServiceRegexService.updateDeliveryServiceRegex(regex).
-			then(function() {
-				$scope.regexPattern = angular.copy(regex.pattern);
-				$anchorScroll(); // scrolls window to top
-			});
-	};
-
-	$scope.confirmDelete = function(regex) {
-		var params = {
-			title: 'Delete Delivery Service Regex: ' + regex.pattern,
-			key: regex.pattern
-		};
-		var modalInstance = $uibModal.open({
-			templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-			controller: 'DialogDeleteController',
-			size: 'md',
-			resolve: {
-				params: function () {
-					return params;
-				}
-			}
-		});
-		modalInstance.result.then(function() {
-			deleteDeliveryServiceRegex(deliveryService.id, regex.id);
-		}, function () {
-			// do nothing
-		});
-	};
-
-};
-
-FormEditDeliveryServiceRegexController.$inject = ['deliveryService', 'regex', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'deliveryServiceRegexService'];
-module.exports = FormEditDeliveryServiceRegexController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/edit/index.js
deleted file mode 100644
index fcd723a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.deliveryServiceRegex.edit', [])
-	.controller('FormEditDeliveryServiceRegexController', require('./FormEditDeliveryServiceRegexController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html
deleted file mode 100644
index 77a0802..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
-            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{deliveryService.displayName}}</a></li>
-            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '/regexes')">Regexes</a></li>
-            <li class="active">{{regexPattern}}</li>
-        </ol>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="dsRegexForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(dsRegexForm.pattern), 'has-feedback': hasError(dsRegexForm.pattern)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Pattern *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="pattern" name="pattern" type="text" class="form-control" ng-model="regex.pattern" ng-required="true" ng-maxlength="48" ng-pattern="/^\S*$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(dsRegexForm.pattern, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(dsRegexForm.pattern, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(dsRegexForm.pattern, 'pattern')">No spaces</small>
-                    <span ng-show="hasError(dsRegexForm.pattern)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(dsRegexForm.type), 'has-feedback': hasError(dsRegexForm.type)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Type *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <select id="type" name="type" class="form-control" ng-model="regex.type" ng-options="type.id as type.name for type in types" required>
-                        <option value="">Select...</option>
-                    </select>
-                    <small class="input-error" ng-show="hasPropertyError(dsRegexForm.type, 'required')">Required</small>
-                </div>
-            </div>
-            <div class="form-group" ng-class="{'has-error': hasError(dsRegexForm.setNumber), 'has-feedback': hasError(dsRegexForm.setNumber)}">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">Order *</label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="setNumber" name="setNumber" type="text" class="form-control" ng-model="regex.setNumber" ng-required="true" ng-maxlength="3" ng-pattern="/^\d+$/" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(dsRegexForm.setNumber, 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(dsRegexForm.setNumber, 'maxlength')">Too Long</small>
-                    <small class="input-error" ng-show="hasPropertyError(dsRegexForm.setNumber, 'pattern')">Number</small>
-                    <span ng-show="hasError(dsRegexForm.setNumber)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(regex)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="dsRegexForm.$pristine || dsRegexForm.$invalid" ng-click="save(deliveryService.id, regex)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/index.js
deleted file mode 100644
index 7bf4ab0..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.deliveryServiceRegex', [])
-	.controller('FormDeliveryServiceRegexController', require('./FormDeliveryServiceRegexController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/new/FormNewDeliveryServiceRegexController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/new/FormNewDeliveryServiceRegexController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/new/FormNewDeliveryServiceRegexController.js
deleted file mode 100644
index 5b314b7..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/new/FormNewDeliveryServiceRegexController.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewDeliveryServiceRegexController = function(deliveryService, regex, $scope, $controller, deliveryServiceRegexService) {
-
-	// extends the FormDeliveryServiceRegexController to inherit common methods
-	angular.extend(this, $controller('FormDeliveryServiceRegexController', { deliveryService: deliveryService, regex: regex, $scope: $scope }));
-
-	$scope.regexPattern = 'New';
-
-	$scope.settings = {
-		isNew: true,
-		saveLabel: 'Create'
-	};
-
-	$scope.save = function(dsId, regex) {
-		deliveryServiceRegexService.createDeliveryServiceRegex(dsId, regex);
-	};
-
-};
-
-FormNewDeliveryServiceRegexController.$inject = ['deliveryService', 'regex', '$scope', '$controller', 'deliveryServiceRegexService'];
-module.exports = FormNewDeliveryServiceRegexController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/new/index.js
deleted file mode 100644
index 8e69467..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/deliveryServiceRegex/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.deliveryServiceRegex.new', [])
-	.controller('FormNewDeliveryServiceRegexController', require('./FormNewDeliveryServiceRegexController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/division/FormDivisionController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/division/FormDivisionController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/division/FormDivisionController.js
deleted file mode 100644
index b977a1b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/division/FormDivisionController.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormDivisionController = function(division, $scope, $location, formUtils, stringUtils, locationUtils) {
-
-    $scope.division = division;
-
-    $scope.props = [
-        { name: 'name', type: 'text', required: true, maxLength: 45 }
-    ];
-
-    $scope.labelize = stringUtils.labelize;
-
-    $scope.viewRegions = function() {
-        $location.path($location.path() + '/regions');
-    };
-
-    $scope.navigateToPath = locationUtils.navigateToPath;
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-};
-
-FormDivisionController.$inject = ['division', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils'];
-module.exports = FormDivisionController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/division/edit/FormEditDivisionController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/division/edit/FormEditDivisionController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/division/edit/FormEditDivisionController.js
deleted file mode 100644
index 883f43d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/division/edit/FormEditDivisionController.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormEditDivisionController = function(division, $scope, $controller, $uibModal, $anchorScroll, locationUtils, divisionService) {
-
-    // extends the FormDivisionController to inherit common methods
-    angular.extend(this, $controller('FormDivisionController', { division: division, $scope: $scope }));
-
-    var deleteDivision = function(division) {
-        divisionService.deleteDivision(division.id)
-            .then(function() {
-                locationUtils.navigateToPath('/admin/divisions');
-            });
-    };
-
-    $scope.divisionName = angular.copy(division.name);
-
-    $scope.settings = {
-        isNew: false,
-        saveLabel: 'Update'
-    };
-
-    $scope.save = function(division) {
-        divisionService.updateDivision(division).
-            then(function() {
-                $scope.divisionName = angular.copy(division.name);
-                $anchorScroll(); // scrolls window to top
-            });
-    };
-
-    $scope.confirmDelete = function(division) {
-        var params = {
-            title: 'Delete Division: ' + division.name,
-            key: division.name
-        };
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
-            controller: 'DialogDeleteController',
-            size: 'md',
-            resolve: {
-                params: function () {
-                    return params;
-                }
-            }
-        });
-        modalInstance.result.then(function() {
-            deleteDivision(division);
-        }, function () {
-            // do nothing
-        });
-    };
-
-};
-
-FormEditDivisionController.$inject = ['division', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'divisionService'];
-module.exports = FormEditDivisionController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/division/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/division/edit/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/division/edit/index.js
deleted file mode 100644
index f87106d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/division/edit/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.division.edit', [])
-    .controller('FormEditDivisionController', require('./FormEditDivisionController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/division/form.division.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/division/form.division.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/form/division/form.division.tpl.html
deleted file mode 100644
index bd87a3c..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/division/form.division.tpl.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/divisions')">Divisions</a></li>
-            <li class="active">{{divisionName}}</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <button class="btn btn-primary" title="View Regions" ng-click="viewRegions()">View Regions</button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <form name="divisionForm" class="form-horizontal form-label-left" novalidate>
-            <div class="form-group" ng-class="{'has-error': hasError(divisionForm[prop.name]), 'has-feedback': hasError(divisionForm[prop.name])}" ng-repeat="prop in props">
-                <label class="control-label col-md-2 col-sm-2 col-xs-12">{{labelize(prop.name)}} <span ng-show="prop.required">*</span></label>
-                <div class="col-md-10 col-sm-10 col-xs-12">
-                    <input id="{{prop.name}}" name="{{prop.name}}" type="{{prop.type}}" class="form-control" ng-model="division[prop.name]" ng-readonly="prop.readonly" ng-required="prop.required" ng-maxlength="prop.maxLength" autofocus>
-                    <small class="input-error" ng-show="hasPropertyError(divisionForm[prop.name], 'required')">Required</small>
-                    <small class="input-error" ng-show="hasPropertyError(divisionForm[prop.name], 'maxlength')">Too Long</small>
-                    <span ng-show="hasError(divisionForm[prop.name])" class="form-control-feedback"><i class="fa fa-times"></i></span>
-                </div>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(division)">Delete</button>
-                <button type="button" class="btn btn-success" ng-disabled="divisionForm.$pristine || divisionForm.$invalid" ng-click="save(division)">{{settings.saveLabel}}</button>
-            </div>
-        </form>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/division/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/division/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/division/index.js
deleted file mode 100644
index 6cc20d8..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/division/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.division', [])
-    .controller('FormDivisionController', require('./FormDivisionController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/division/new/FormNewDivisionController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/division/new/FormNewDivisionController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/division/new/FormNewDivisionController.js
deleted file mode 100644
index 077bf06..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/division/new/FormNewDivisionController.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormNewDivisionController = function(division, $scope, $controller, divisionService) {
-
-    // extends the FormDivisionController to inherit common methods
-    angular.extend(this, $controller('FormDivisionController', { division: division, $scope: $scope }));
-
-    $scope.divisionName = 'New';
-
-    $scope.settings = {
-        isNew: true,
-        saveLabel: 'Create'
-    };
-
-    $scope.save = function(division) {
-        divisionService.createDivision(division)
-    };
-
-};
-
-FormNewDivisionController.$inject = ['division', '$scope', '$controller', 'divisionService'];
-module.exports = FormNewDivisionController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/division/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/division/new/index.js b/traffic_ops/experimental/ui/app/src/common/modules/form/division/new/index.js
deleted file mode 100644
index c1b28de..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/division/new/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.form.division.new', [])
-    .controller('FormNewDivisionController', require('./FormNewDivisionController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/form/job/FormJobController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/form/job/FormJobController.js b/traffic_ops/experimental/ui/app/src/common/modules/form/job/FormJobController.js
deleted file mode 100644
index 7bf157b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/form/job/FormJobController.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var FormJobController = function(job, $scope, formUtils, locationUtils, deliveryServiceService) {
-
-	var getDeliveryServices = function() {
-		deliveryServiceService.getDeliveryServices()
-			.then(function(result) {
-				$scope.deliveryservices = result;
-			});
-	};
-
-	$scope.job = job;
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	$scope.hasError = formUtils.hasError;
-
-	$scope.hasPropertyError = formUtils.hasPropertyError;
-
-	var init = function () {
-		getDeliveryServices();
-	};
-	init();
-
-};
-
-FormJobController.$inject = ['job', '$scope', 'formUtils', 'locationUtils', 'deliveryServiceService'];
-module.exports = FormJobController;


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/assets/js/jquery.dataTables.min.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/assets/js/jquery.dataTables.min.js b/traffic_portal/app/src/assets/js/jquery.dataTables.min.js
new file mode 100644
index 0000000..e28e037
--- /dev/null
+++ b/traffic_portal/app/src/assets/js/jquery.dataTables.min.js
@@ -0,0 +1,166 @@
+/*!
+ DataTables 1.10.11
+ ©2008-2015 SpryMedia Ltd - datatables.net/license
+*/
+(function(h){"function"===typeof define&&define.amd?define(["jquery"],function(D){return h(D,window,document)}):"object"===typeof exports?module.exports=function(D,I){D||(D=window);I||(I="undefined"!==typeof window?require("jquery"):require("jquery")(D));return h(I,D,D.document)}:h(jQuery,window,document)})(function(h,D,I,k){function Y(a){var b,c,d={};h.each(a,function(e){if((b=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(b[1]+" "))c=e.replace(b[0],b[2].toLowerCase()),
+d[c]=e,"o"===b[1]&&Y(a[e])});a._hungarianMap=d}function K(a,b,c){a._hungarianMap||Y(a);var d;h.each(b,function(e){d=a._hungarianMap[e];if(d!==k&&(c||b[d]===k))"o"===d.charAt(0)?(b[d]||(b[d]={}),h.extend(!0,b[d],b[e]),K(a[d],b[d],c)):b[d]=b[e]})}function Fa(a){var b=m.defaults.oLanguage,c=a.sZeroRecords;!a.sEmptyTable&&(c&&"No data available in table"===b.sEmptyTable)&&E(a,a,"sZeroRecords","sEmptyTable");!a.sLoadingRecords&&(c&&"Loading..."===b.sLoadingRecords)&&E(a,a,"sZeroRecords","sLoadingRecords");
+a.sInfoThousands&&(a.sThousands=a.sInfoThousands);(a=a.sDecimal)&&db(a)}function eb(a){A(a,"ordering","bSort");A(a,"orderMulti","bSortMulti");A(a,"orderClasses","bSortClasses");A(a,"orderCellsTop","bSortCellsTop");A(a,"order","aaSorting");A(a,"orderFixed","aaSortingFixed");A(a,"paging","bPaginate");A(a,"pagingType","sPaginationType");A(a,"pageLength","iDisplayLength");A(a,"searching","bFilter");"boolean"===typeof a.sScrollX&&(a.sScrollX=a.sScrollX?"100%":"");"boolean"===typeof a.scrollX&&(a.scrollX=
+a.scrollX?"100%":"");if(a=a.aoSearchCols)for(var b=0,c=a.length;b<c;b++)a[b]&&K(m.models.oSearch,a[b])}function fb(a){A(a,"orderable","bSortable");A(a,"orderData","aDataSort");A(a,"orderSequence","asSorting");A(a,"orderDataType","sortDataType");var b=a.aDataSort;b&&!h.isArray(b)&&(a.aDataSort=[b])}function gb(a){if(!m.__browser){var b={};m.__browser=b;var c=h("<div/>").css({position:"fixed",top:0,left:0,height:1,width:1,overflow:"hidden"}).append(h("<div/>").css({position:"absolute",top:1,left:1,
+width:100,overflow:"scroll"}).append(h("<div/>").css({width:"100%",height:10}))).appendTo("body"),d=c.children(),e=d.children();b.barWidth=d[0].offsetWidth-d[0].clientWidth;b.bScrollOversize=100===e[0].offsetWidth&&100!==d[0].clientWidth;b.bScrollbarLeft=1!==Math.round(e.offset().left);b.bBounding=c[0].getBoundingClientRect().width?!0:!1;c.remove()}h.extend(a.oBrowser,m.__browser);a.oScroll.iBarWidth=m.__browser.barWidth}function hb(a,b,c,d,e,f){var g,j=!1;c!==k&&(g=c,j=!0);for(;d!==e;)a.hasOwnProperty(d)&&
+(g=j?b(g,a[d],d,a):a[d],j=!0,d+=f);return g}function Ga(a,b){var c=m.defaults.column,d=a.aoColumns.length,c=h.extend({},m.models.oColumn,c,{nTh:b?b:I.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.mData:d,idx:d});a.aoColumns.push(c);c=a.aoPreSearchCols;c[d]=h.extend({},m.models.oSearch,c[d]);ja(a,d,h(b).data())}function ja(a,b,c){var b=a.aoColumns[b],d=a.oClasses,e=h(b.nTh);if(!b.sWidthOrig){b.sWidthOrig=e.attr("width")||null;var f=
+(e.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);f&&(b.sWidthOrig=f[1])}c!==k&&null!==c&&(fb(c),K(m.defaults.column,c),c.mDataProp!==k&&!c.mData&&(c.mData=c.mDataProp),c.sType&&(b._sManualType=c.sType),c.className&&!c.sClass&&(c.sClass=c.className),h.extend(b,c),E(b,c,"sWidth","sWidthOrig"),c.iDataSort!==k&&(b.aDataSort=[c.iDataSort]),E(b,c,"aDataSort"));var g=b.mData,j=Q(g),i=b.mRender?Q(b.mRender):null,c=function(a){return"string"===typeof a&&-1!==a.indexOf("@")};b._bAttrSrc=h.isPlainObject(g)&&
+(c(g.sort)||c(g.type)||c(g.filter));b._setter=null;b.fnGetData=function(a,b,c){var d=j(a,b,k,c);return i&&b?i(d,b,a,c):d};b.fnSetData=function(a,b,c){return R(g)(a,b,c)};"number"!==typeof g&&(a._rowReadObject=!0);a.oFeatures.bSort||(b.bSortable=!1,e.addClass(d.sSortableNone));a=-1!==h.inArray("asc",b.asSorting);c=-1!==h.inArray("desc",b.asSorting);!b.bSortable||!a&&!c?(b.sSortingClass=d.sSortableNone,b.sSortingClassJUI=""):a&&!c?(b.sSortingClass=d.sSortableAsc,b.sSortingClassJUI=d.sSortJUIAscAllowed):
+!a&&c?(b.sSortingClass=d.sSortableDesc,b.sSortingClassJUI=d.sSortJUIDescAllowed):(b.sSortingClass=d.sSortable,b.sSortingClassJUI=d.sSortJUI)}function U(a){if(!1!==a.oFeatures.bAutoWidth){var b=a.aoColumns;Ha(a);for(var c=0,d=b.length;c<d;c++)b[c].nTh.style.width=b[c].sWidth}b=a.oScroll;(""!==b.sY||""!==b.sX)&&ka(a);u(a,null,"column-sizing",[a])}function Z(a,b){var c=la(a,"bVisible");return"number"===typeof c[b]?c[b]:null}function $(a,b){var c=la(a,"bVisible"),c=h.inArray(b,c);return-1!==c?c:null}
+function aa(a){return h(F(a.aoColumns,"nTh")).filter(":visible").length}function la(a,b){var c=[];h.map(a.aoColumns,function(a,e){a[b]&&c.push(e)});return c}function Ia(a){var b=a.aoColumns,c=a.aoData,d=m.ext.type.detect,e,f,g,j,i,h,l,q,t;e=0;for(f=b.length;e<f;e++)if(l=b[e],t=[],!l.sType&&l._sManualType)l.sType=l._sManualType;else if(!l.sType){g=0;for(j=d.length;g<j;g++){i=0;for(h=c.length;i<h;i++){t[i]===k&&(t[i]=B(a,i,e,"type"));q=d[g](t[i],a);if(!q&&g!==d.length-1)break;if("html"===q)break}if(q){l.sType=
+q;break}}l.sType||(l.sType="string")}}function ib(a,b,c,d){var e,f,g,j,i,n,l=a.aoColumns;if(b)for(e=b.length-1;0<=e;e--){n=b[e];var q=n.targets!==k?n.targets:n.aTargets;h.isArray(q)||(q=[q]);f=0;for(g=q.length;f<g;f++)if("number"===typeof q[f]&&0<=q[f]){for(;l.length<=q[f];)Ga(a);d(q[f],n)}else if("number"===typeof q[f]&&0>q[f])d(l.length+q[f],n);else if("string"===typeof q[f]){j=0;for(i=l.length;j<i;j++)("_all"==q[f]||h(l[j].nTh).hasClass(q[f]))&&d(j,n)}}if(c){e=0;for(a=c.length;e<a;e++)d(e,c[e])}}
+function N(a,b,c,d){var e=a.aoData.length,f=h.extend(!0,{},m.models.oRow,{src:c?"dom":"data",idx:e});f._aData=b;a.aoData.push(f);for(var g=a.aoColumns,j=0,i=g.length;j<i;j++)g[j].sType=null;a.aiDisplayMaster.push(e);b=a.rowIdFn(b);b!==k&&(a.aIds[b]=f);(c||!a.oFeatures.bDeferRender)&&Ja(a,e,c,d);return e}function ma(a,b){var c;b instanceof h||(b=h(b));return b.map(function(b,e){c=Ka(a,e);return N(a,c.data,e,c.cells)})}function B(a,b,c,d){var e=a.iDraw,f=a.aoColumns[c],g=a.aoData[b]._aData,j=f.sDefaultContent,
+i=f.fnGetData(g,d,{settings:a,row:b,col:c});if(i===k)return a.iDrawError!=e&&null===j&&(L(a,0,"Requested unknown parameter "+("function"==typeof f.mData?"{function}":"'"+f.mData+"'")+" for row "+b+", column "+c,4),a.iDrawError=e),j;if((i===g||null===i)&&null!==j&&d!==k)i=j;else if("function"===typeof i)return i.call(g);return null===i&&"display"==d?"":i}function jb(a,b,c,d){a.aoColumns[c].fnSetData(a.aoData[b]._aData,d,{settings:a,row:b,col:c})}function La(a){return h.map(a.match(/(\\.|[^\.])+/g)||
+[""],function(a){return a.replace(/\\./g,".")})}function Q(a){if(h.isPlainObject(a)){var b={};h.each(a,function(a,c){c&&(b[a]=Q(c))});return function(a,c,f,g){var j=b[c]||b._;return j!==k?j(a,c,f,g):a}}if(null===a)return function(a){return a};if("function"===typeof a)return function(b,c,f,g){return a(b,c,f,g)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var c=function(a,b,f){var g,j;if(""!==f){j=La(f);for(var i=0,n=j.length;i<n;i++){f=j[i].match(ba);g=
+j[i].match(V);if(f){j[i]=j[i].replace(ba,"");""!==j[i]&&(a=a[j[i]]);g=[];j.splice(0,i+1);j=j.join(".");if(h.isArray(a)){i=0;for(n=a.length;i<n;i++)g.push(c(a[i],b,j))}a=f[0].substring(1,f[0].length-1);a=""===a?g:g.join(a);break}else if(g){j[i]=j[i].replace(V,"");a=a[j[i]]();continue}if(null===a||a[j[i]]===k)return k;a=a[j[i]]}}return a};return function(b,e){return c(b,e,a)}}return function(b){return b[a]}}function R(a){if(h.isPlainObject(a))return R(a._);if(null===a)return function(){};if("function"===
+typeof a)return function(b,d,e){a(b,"set",d,e)};if("string"===typeof a&&(-1!==a.indexOf(".")||-1!==a.indexOf("[")||-1!==a.indexOf("("))){var b=function(a,d,e){var e=La(e),f;f=e[e.length-1];for(var g,j,i=0,n=e.length-1;i<n;i++){g=e[i].match(ba);j=e[i].match(V);if(g){e[i]=e[i].replace(ba,"");a[e[i]]=[];f=e.slice();f.splice(0,i+1);g=f.join(".");if(h.isArray(d)){j=0;for(n=d.length;j<n;j++)f={},b(f,d[j],g),a[e[i]].push(f)}else a[e[i]]=d;return}j&&(e[i]=e[i].replace(V,""),a=a[e[i]](d));if(null===a[e[i]]||
+a[e[i]]===k)a[e[i]]={};a=a[e[i]]}if(f.match(V))a[f.replace(V,"")](d);else a[f.replace(ba,"")]=d};return function(c,d){return b(c,d,a)}}return function(b,d){b[a]=d}}function Ma(a){return F(a.aoData,"_aData")}function na(a){a.aoData.length=0;a.aiDisplayMaster.length=0;a.aiDisplay.length=0;a.aIds={}}function oa(a,b,c){for(var d=-1,e=0,f=a.length;e<f;e++)a[e]==b?d=e:a[e]>b&&a[e]--; -1!=d&&c===k&&a.splice(d,1)}function ca(a,b,c,d){var e=a.aoData[b],f,g=function(c,d){for(;c.childNodes.length;)c.removeChild(c.firstChild);
+c.innerHTML=B(a,b,d,"display")};if("dom"===c||(!c||"auto"===c)&&"dom"===e.src)e._aData=Ka(a,e,d,d===k?k:e._aData).data;else{var j=e.anCells;if(j)if(d!==k)g(j[d],d);else{c=0;for(f=j.length;c<f;c++)g(j[c],c)}}e._aSortData=null;e._aFilterData=null;g=a.aoColumns;if(d!==k)g[d].sType=null;else{c=0;for(f=g.length;c<f;c++)g[c].sType=null;Na(a,e)}}function Ka(a,b,c,d){var e=[],f=b.firstChild,g,j,i=0,n,l=a.aoColumns,q=a._rowReadObject,d=d!==k?d:q?{}:[],t=function(a,b){if("string"===typeof a){var c=a.indexOf("@");
+-1!==c&&(c=a.substring(c+1),R(a)(d,b.getAttribute(c)))}},S=function(a){if(c===k||c===i)j=l[i],n=h.trim(a.innerHTML),j&&j._bAttrSrc?(R(j.mData._)(d,n),t(j.mData.sort,a),t(j.mData.type,a),t(j.mData.filter,a)):q?(j._setter||(j._setter=R(j.mData)),j._setter(d,n)):d[i]=n;i++};if(f)for(;f;){g=f.nodeName.toUpperCase();if("TD"==g||"TH"==g)S(f),e.push(f);f=f.nextSibling}else{e=b.anCells;f=0;for(g=e.length;f<g;f++)S(e[f])}if(b=b.firstChild?b:b.nTr)(b=b.getAttribute("id"))&&R(a.rowId)(d,b);return{data:d,cells:e}}
+function Ja(a,b,c,d){var e=a.aoData[b],f=e._aData,g=[],j,i,n,l,q;if(null===e.nTr){j=c||I.createElement("tr");e.nTr=j;e.anCells=g;j._DT_RowIndex=b;Na(a,e);l=0;for(q=a.aoColumns.length;l<q;l++){n=a.aoColumns[l];i=c?d[l]:I.createElement(n.sCellType);i._DT_CellIndex={row:b,column:l};g.push(i);if((!c||n.mRender||n.mData!==l)&&(!h.isPlainObject(n.mData)||n.mData._!==l+".display"))i.innerHTML=B(a,b,l,"display");n.sClass&&(i.className+=" "+n.sClass);n.bVisible&&!c?j.appendChild(i):!n.bVisible&&c&&i.parentNode.removeChild(i);
+n.fnCreatedCell&&n.fnCreatedCell.call(a.oInstance,i,B(a,b,l),f,b,l)}u(a,"aoRowCreatedCallback",null,[j,f,b])}e.nTr.setAttribute("role","row")}function Na(a,b){var c=b.nTr,d=b._aData;if(c){var e=a.rowIdFn(d);e&&(c.id=e);d.DT_RowClass&&(e=d.DT_RowClass.split(" "),b.__rowc=b.__rowc?pa(b.__rowc.concat(e)):e,h(c).removeClass(b.__rowc.join(" ")).addClass(d.DT_RowClass));d.DT_RowAttr&&h(c).attr(d.DT_RowAttr);d.DT_RowData&&h(c).data(d.DT_RowData)}}function kb(a){var b,c,d,e,f,g=a.nTHead,j=a.nTFoot,i=0===
+h("th, td",g).length,n=a.oClasses,l=a.aoColumns;i&&(e=h("<tr/>").appendTo(g));b=0;for(c=l.length;b<c;b++)f=l[b],d=h(f.nTh).addClass(f.sClass),i&&d.appendTo(e),a.oFeatures.bSort&&(d.addClass(f.sSortingClass),!1!==f.bSortable&&(d.attr("tabindex",a.iTabIndex).attr("aria-controls",a.sTableId),Oa(a,f.nTh,b))),f.sTitle!=d[0].innerHTML&&d.html(f.sTitle),Pa(a,"header")(a,d,f,n);i&&da(a.aoHeader,g);h(g).find(">tr").attr("role","row");h(g).find(">tr>th, >tr>td").addClass(n.sHeaderTH);h(j).find(">tr>th, >tr>td").addClass(n.sFooterTH);
+if(null!==j){a=a.aoFooter[0];b=0;for(c=a.length;b<c;b++)f=l[b],f.nTf=a[b].cell,f.sClass&&h(f.nTf).addClass(f.sClass)}}function ea(a,b,c){var d,e,f,g=[],j=[],i=a.aoColumns.length,n;if(b){c===k&&(c=!1);d=0;for(e=b.length;d<e;d++){g[d]=b[d].slice();g[d].nTr=b[d].nTr;for(f=i-1;0<=f;f--)!a.aoColumns[f].bVisible&&!c&&g[d].splice(f,1);j.push([])}d=0;for(e=g.length;d<e;d++){if(a=g[d].nTr)for(;f=a.firstChild;)a.removeChild(f);f=0;for(b=g[d].length;f<b;f++)if(n=i=1,j[d][f]===k){a.appendChild(g[d][f].cell);
+for(j[d][f]=1;g[d+i]!==k&&g[d][f].cell==g[d+i][f].cell;)j[d+i][f]=1,i++;for(;g[d][f+n]!==k&&g[d][f].cell==g[d][f+n].cell;){for(c=0;c<i;c++)j[d+c][f+n]=1;n++}h(g[d][f].cell).attr("rowspan",i).attr("colspan",n)}}}}function O(a){var b=u(a,"aoPreDrawCallback","preDraw",[a]);if(-1!==h.inArray(!1,b))C(a,!1);else{var b=[],c=0,d=a.asStripeClasses,e=d.length,f=a.oLanguage,g=a.iInitDisplayStart,j="ssp"==y(a),i=a.aiDisplay;a.bDrawing=!0;g!==k&&-1!==g&&(a._iDisplayStart=j?g:g>=a.fnRecordsDisplay()?0:g,a.iInitDisplayStart=
+-1);var g=a._iDisplayStart,n=a.fnDisplayEnd();if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++,C(a,!1);else if(j){if(!a.bDestroying&&!lb(a))return}else a.iDraw++;if(0!==i.length){f=j?a.aoData.length:n;for(j=j?0:g;j<f;j++){var l=i[j],q=a.aoData[l];null===q.nTr&&Ja(a,l);l=q.nTr;if(0!==e){var t=d[c%e];q._sRowStripe!=t&&(h(l).removeClass(q._sRowStripe).addClass(t),q._sRowStripe=t)}u(a,"aoRowCallback",null,[l,q._aData,c,j]);b.push(l);c++}}else c=f.sZeroRecords,1==a.iDraw&&"ajax"==y(a)?c=f.sLoadingRecords:
+f.sEmptyTable&&0===a.fnRecordsTotal()&&(c=f.sEmptyTable),b[0]=h("<tr/>",{"class":e?d[0]:""}).append(h("<td />",{valign:"top",colSpan:aa(a),"class":a.oClasses.sRowEmpty}).html(c))[0];u(a,"aoHeaderCallback","header",[h(a.nTHead).children("tr")[0],Ma(a),g,n,i]);u(a,"aoFooterCallback","footer",[h(a.nTFoot).children("tr")[0],Ma(a),g,n,i]);d=h(a.nTBody);d.children().detach();d.append(h(b));u(a,"aoDrawCallback","draw",[a]);a.bSorted=!1;a.bFiltered=!1;a.bDrawing=!1}}function T(a,b){var c=a.oFeatures,d=c.bFilter;
+c.bSort&&mb(a);d?fa(a,a.oPreviousSearch):a.aiDisplay=a.aiDisplayMaster.slice();!0!==b&&(a._iDisplayStart=0);a._drawHold=b;O(a);a._drawHold=!1}function nb(a){var b=a.oClasses,c=h(a.nTable),c=h("<div/>").insertBefore(c),d=a.oFeatures,e=h("<div/>",{id:a.sTableId+"_wrapper","class":b.sWrapper+(a.nTFoot?"":" "+b.sNoFooter)});a.nHolding=c[0];a.nTableWrapper=e[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var f=a.sDom.split(""),g,j,i,n,l,q,t=0;t<f.length;t++){g=null;j=f[t];if("<"==j){i=h("<div/>")[0];
+n=f[t+1];if("'"==n||'"'==n){l="";for(q=2;f[t+q]!=n;)l+=f[t+q],q++;"H"==l?l=b.sJUIHeader:"F"==l&&(l=b.sJUIFooter);-1!=l.indexOf(".")?(n=l.split("."),i.id=n[0].substr(1,n[0].length-1),i.className=n[1]):"#"==l.charAt(0)?i.id=l.substr(1,l.length-1):i.className=l;t+=q}e.append(i);e=h(i)}else if(">"==j)e=e.parent();else if("l"==j&&d.bPaginate&&d.bLengthChange)g=ob(a);else if("f"==j&&d.bFilter)g=pb(a);else if("r"==j&&d.bProcessing)g=qb(a);else if("t"==j)g=rb(a);else if("i"==j&&d.bInfo)g=sb(a);else if("p"==
+j&&d.bPaginate)g=tb(a);else if(0!==m.ext.feature.length){i=m.ext.feature;q=0;for(n=i.length;q<n;q++)if(j==i[q].cFeature){g=i[q].fnInit(a);break}}g&&(i=a.aanFeatures,i[j]||(i[j]=[]),i[j].push(g),e.append(g))}c.replaceWith(e);a.nHolding=null}function da(a,b){var c=h(b).children("tr"),d,e,f,g,j,i,n,l,q,t;a.splice(0,a.length);f=0;for(i=c.length;f<i;f++)a.push([]);f=0;for(i=c.length;f<i;f++){d=c[f];for(e=d.firstChild;e;){if("TD"==e.nodeName.toUpperCase()||"TH"==e.nodeName.toUpperCase()){l=1*e.getAttribute("colspan");
+q=1*e.getAttribute("rowspan");l=!l||0===l||1===l?1:l;q=!q||0===q||1===q?1:q;g=0;for(j=a[f];j[g];)g++;n=g;t=1===l?!0:!1;for(j=0;j<l;j++)for(g=0;g<q;g++)a[f+g][n+j]={cell:e,unique:t},a[f+g].nTr=d}e=e.nextSibling}}}function qa(a,b,c){var d=[];c||(c=a.aoHeader,b&&(c=[],da(c,b)));for(var b=0,e=c.length;b<e;b++)for(var f=0,g=c[b].length;f<g;f++)if(c[b][f].unique&&(!d[f]||!a.bSortCellsTop))d[f]=c[b][f].cell;return d}function ra(a,b,c){u(a,"aoServerParams","serverParams",[b]);if(b&&h.isArray(b)){var d={},
+e=/(.*?)\[\]$/;h.each(b,function(a,b){var c=b.name.match(e);c?(c=c[0],d[c]||(d[c]=[]),d[c].push(b.value)):d[b.name]=b.value});b=d}var f,g=a.ajax,j=a.oInstance,i=function(b){u(a,null,"xhr",[a,b,a.jqXHR]);c(b)};if(h.isPlainObject(g)&&g.data){f=g.data;var n=h.isFunction(f)?f(b,a):f,b=h.isFunction(f)&&n?n:h.extend(!0,b,n);delete g.data}n={data:b,success:function(b){var c=b.error||b.sError;c&&L(a,0,c);a.json=b;i(b)},dataType:"json",cache:!1,type:a.sServerMethod,error:function(b,c){var d=u(a,null,"xhr",
+[a,null,a.jqXHR]);-1===h.inArray(!0,d)&&("parsererror"==c?L(a,0,"Invalid JSON response",1):4===b.readyState&&L(a,0,"Ajax error",7));C(a,!1)}};a.oAjaxData=b;u(a,null,"preXhr",[a,b]);a.fnServerData?a.fnServerData.call(j,a.sAjaxSource,h.map(b,function(a,b){return{name:b,value:a}}),i,a):a.sAjaxSource||"string"===typeof g?a.jqXHR=h.ajax(h.extend(n,{url:g||a.sAjaxSource})):h.isFunction(g)?a.jqXHR=g.call(j,b,i,a):(a.jqXHR=h.ajax(h.extend(n,g)),g.data=f)}function lb(a){return a.bAjaxDataGet?(a.iDraw++,C(a,
+!0),ra(a,ub(a),function(b){vb(a,b)}),!1):!0}function ub(a){var b=a.aoColumns,c=b.length,d=a.oFeatures,e=a.oPreviousSearch,f=a.aoPreSearchCols,g,j=[],i,n,l,q=W(a);g=a._iDisplayStart;i=!1!==d.bPaginate?a._iDisplayLength:-1;var k=function(a,b){j.push({name:a,value:b})};k("sEcho",a.iDraw);k("iColumns",c);k("sColumns",F(b,"sName").join(","));k("iDisplayStart",g);k("iDisplayLength",i);var S={draw:a.iDraw,columns:[],order:[],start:g,length:i,search:{value:e.sSearch,regex:e.bRegex}};for(g=0;g<c;g++)n=b[g],
+l=f[g],i="function"==typeof n.mData?"function":n.mData,S.columns.push({data:i,name:n.sName,searchable:n.bSearchable,orderable:n.bSortable,search:{value:l.sSearch,regex:l.bRegex}}),k("mDataProp_"+g,i),d.bFilter&&(k("sSearch_"+g,l.sSearch),k("bRegex_"+g,l.bRegex),k("bSearchable_"+g,n.bSearchable)),d.bSort&&k("bSortable_"+g,n.bSortable);d.bFilter&&(k("sSearch",e.sSearch),k("bRegex",e.bRegex));d.bSort&&(h.each(q,function(a,b){S.order.push({column:b.col,dir:b.dir});k("iSortCol_"+a,b.col);k("sSortDir_"+
+a,b.dir)}),k("iSortingCols",q.length));b=m.ext.legacy.ajax;return null===b?a.sAjaxSource?j:S:b?j:S}function vb(a,b){var c=sa(a,b),d=b.sEcho!==k?b.sEcho:b.draw,e=b.iTotalRecords!==k?b.iTotalRecords:b.recordsTotal,f=b.iTotalDisplayRecords!==k?b.iTotalDisplayRecords:b.recordsFiltered;if(d){if(1*d<a.iDraw)return;a.iDraw=1*d}na(a);a._iRecordsTotal=parseInt(e,10);a._iRecordsDisplay=parseInt(f,10);d=0;for(e=c.length;d<e;d++)N(a,c[d]);a.aiDisplay=a.aiDisplayMaster.slice();a.bAjaxDataGet=!1;O(a);a._bInitComplete||
+ta(a,b);a.bAjaxDataGet=!0;C(a,!1)}function sa(a,b){var c=h.isPlainObject(a.ajax)&&a.ajax.dataSrc!==k?a.ajax.dataSrc:a.sAjaxDataProp;return"data"===c?b.aaData||b[c]:""!==c?Q(c)(b):b}function pb(a){var b=a.oClasses,c=a.sTableId,d=a.oLanguage,e=a.oPreviousSearch,f=a.aanFeatures,g='<input type="search" class="'+b.sFilterInput+'"/>',j=d.sSearch,j=j.match(/_INPUT_/)?j.replace("_INPUT_",g):j+g,b=h("<div/>",{id:!f.f?c+"_filter":null,"class":b.sFilter}).append(h("<label/>").append(j)),f=function(){var b=!this.value?
+"":this.value;b!=e.sSearch&&(fa(a,{sSearch:b,bRegex:e.bRegex,bSmart:e.bSmart,bCaseInsensitive:e.bCaseInsensitive}),a._iDisplayStart=0,O(a))},g=null!==a.searchDelay?a.searchDelay:"ssp"===y(a)?400:0,i=h("input",b).val(e.sSearch).attr("placeholder",d.sSearchPlaceholder).bind("keyup.DT search.DT input.DT paste.DT cut.DT",g?ua(f,g):f).bind("keypress.DT",function(a){if(13==a.keyCode)return!1}).attr("aria-controls",c);h(a.nTable).on("search.dt.DT",function(b,c){if(a===c)try{i[0]!==I.activeElement&&i.val(e.sSearch)}catch(d){}});
+return b[0]}function fa(a,b,c){var d=a.oPreviousSearch,e=a.aoPreSearchCols,f=function(a){d.sSearch=a.sSearch;d.bRegex=a.bRegex;d.bSmart=a.bSmart;d.bCaseInsensitive=a.bCaseInsensitive};Ia(a);if("ssp"!=y(a)){wb(a,b.sSearch,c,b.bEscapeRegex!==k?!b.bEscapeRegex:b.bRegex,b.bSmart,b.bCaseInsensitive);f(b);for(b=0;b<e.length;b++)xb(a,e[b].sSearch,b,e[b].bEscapeRegex!==k?!e[b].bEscapeRegex:e[b].bRegex,e[b].bSmart,e[b].bCaseInsensitive);yb(a)}else f(b);a.bFiltered=!0;u(a,null,"search",[a])}function yb(a){for(var b=
+m.ext.search,c=a.aiDisplay,d,e,f=0,g=b.length;f<g;f++){for(var j=[],i=0,n=c.length;i<n;i++)e=c[i],d=a.aoData[e],b[f](a,d._aFilterData,e,d._aData,i)&&j.push(e);c.length=0;h.merge(c,j)}}function xb(a,b,c,d,e,f){if(""!==b)for(var g=a.aiDisplay,d=Qa(b,d,e,f),e=g.length-1;0<=e;e--)b=a.aoData[g[e]]._aFilterData[c],d.test(b)||g.splice(e,1)}function wb(a,b,c,d,e,f){var d=Qa(b,d,e,f),e=a.oPreviousSearch.sSearch,f=a.aiDisplayMaster,g;0!==m.ext.search.length&&(c=!0);g=zb(a);if(0>=b.length)a.aiDisplay=f.slice();
+else{if(g||c||e.length>b.length||0!==b.indexOf(e)||a.bSorted)a.aiDisplay=f.slice();b=a.aiDisplay;for(c=b.length-1;0<=c;c--)d.test(a.aoData[b[c]]._sFilterRow)||b.splice(c,1)}}function Qa(a,b,c,d){a=b?a:va(a);c&&(a="^(?=.*?"+h.map(a.match(/"[^"]+"|[^ ]+/g)||[""],function(a){if('"'===a.charAt(0))var b=a.match(/^"(.*)"$/),a=b?b[1]:a;return a.replace('"',"")}).join(")(?=.*?")+").*$");return RegExp(a,d?"i":"")}function va(a){return a.replace(Zb,"\\$1")}function zb(a){var b=a.aoColumns,c,d,e,f,g,j,i,h,l=
+m.ext.type.search;c=!1;d=0;for(f=a.aoData.length;d<f;d++)if(h=a.aoData[d],!h._aFilterData){j=[];e=0;for(g=b.length;e<g;e++)c=b[e],c.bSearchable?(i=B(a,d,e,"filter"),l[c.sType]&&(i=l[c.sType](i)),null===i&&(i=""),"string"!==typeof i&&i.toString&&(i=i.toString())):i="",i.indexOf&&-1!==i.indexOf("&")&&(wa.innerHTML=i,i=$b?wa.textContent:wa.innerText),i.replace&&(i=i.replace(/[\r\n]/g,"")),j.push(i);h._aFilterData=j;h._sFilterRow=j.join("  ");c=!0}return c}function Ab(a){return{search:a.sSearch,smart:a.bSmart,
+regex:a.bRegex,caseInsensitive:a.bCaseInsensitive}}function Bb(a){return{sSearch:a.search,bSmart:a.smart,bRegex:a.regex,bCaseInsensitive:a.caseInsensitive}}function sb(a){var b=a.sTableId,c=a.aanFeatures.i,d=h("<div/>",{"class":a.oClasses.sInfo,id:!c?b+"_info":null});c||(a.aoDrawCallback.push({fn:Cb,sName:"information"}),d.attr("role","status").attr("aria-live","polite"),h(a.nTable).attr("aria-describedby",b+"_info"));return d[0]}function Cb(a){var b=a.aanFeatures.i;if(0!==b.length){var c=a.oLanguage,
+d=a._iDisplayStart+1,e=a.fnDisplayEnd(),f=a.fnRecordsTotal(),g=a.fnRecordsDisplay(),j=g?c.sInfo:c.sInfoEmpty;g!==f&&(j+=" "+c.sInfoFiltered);j+=c.sInfoPostFix;j=Db(a,j);c=c.fnInfoCallback;null!==c&&(j=c.call(a.oInstance,a,d,e,f,g,j));h(b).html(j)}}function Db(a,b){var c=a.fnFormatNumber,d=a._iDisplayStart+1,e=a._iDisplayLength,f=a.fnRecordsDisplay(),g=-1===e;return b.replace(/_START_/g,c.call(a,d)).replace(/_END_/g,c.call(a,a.fnDisplayEnd())).replace(/_MAX_/g,c.call(a,a.fnRecordsTotal())).replace(/_TOTAL_/g,
+c.call(a,f)).replace(/_PAGE_/g,c.call(a,g?1:Math.ceil(d/e))).replace(/_PAGES_/g,c.call(a,g?1:Math.ceil(f/e)))}function ga(a){var b,c,d=a.iInitDisplayStart,e=a.aoColumns,f;c=a.oFeatures;var g=a.bDeferLoading;if(a.bInitialised){nb(a);kb(a);ea(a,a.aoHeader);ea(a,a.aoFooter);C(a,!0);c.bAutoWidth&&Ha(a);b=0;for(c=e.length;b<c;b++)f=e[b],f.sWidth&&(f.nTh.style.width=x(f.sWidth));u(a,null,"preInit",[a]);T(a);e=y(a);if("ssp"!=e||g)"ajax"==e?ra(a,[],function(c){var f=sa(a,c);for(b=0;b<f.length;b++)N(a,f[b]);
+a.iInitDisplayStart=d;T(a);C(a,!1);ta(a,c)},a):(C(a,!1),ta(a))}else setTimeout(function(){ga(a)},200)}function ta(a,b){a._bInitComplete=!0;(b||a.oInit.aaData)&&U(a);u(a,null,"plugin-init",[a,b]);u(a,"aoInitComplete","init",[a,b])}function Ra(a,b){var c=parseInt(b,10);a._iDisplayLength=c;Sa(a);u(a,null,"length",[a,c])}function ob(a){for(var b=a.oClasses,c=a.sTableId,d=a.aLengthMenu,e=h.isArray(d[0]),f=e?d[0]:d,d=e?d[1]:d,e=h("<select/>",{name:c+"_length","aria-controls":c,"class":b.sLengthSelect}),
+g=0,j=f.length;g<j;g++)e[0][g]=new Option(d[g],f[g]);var i=h("<div><label/></div>").addClass(b.sLength);a.aanFeatures.l||(i[0].id=c+"_length");i.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",e[0].outerHTML));h("select",i).val(a._iDisplayLength).bind("change.DT",function(){Ra(a,h(this).val());O(a)});h(a.nTable).bind("length.dt.DT",function(b,c,d){a===c&&h("select",i).val(d)});return i[0]}function tb(a){var b=a.sPaginationType,c=m.ext.pager[b],d="function"===typeof c,e=function(a){O(a)},
+b=h("<div/>").addClass(a.oClasses.sPaging+b)[0],f=a.aanFeatures;d||c.fnInit(a,b,e);f.p||(b.id=a.sTableId+"_paginate",a.aoDrawCallback.push({fn:function(a){if(d){var b=a._iDisplayStart,i=a._iDisplayLength,h=a.fnRecordsDisplay(),l=-1===i,b=l?0:Math.ceil(b/i),i=l?1:Math.ceil(h/i),h=c(b,i),k,l=0;for(k=f.p.length;l<k;l++)Pa(a,"pageButton")(a,f.p[l],l,h,b,i)}else c.fnUpdate(a,e)},sName:"pagination"}));return b}function Ta(a,b,c){var d=a._iDisplayStart,e=a._iDisplayLength,f=a.fnRecordsDisplay();0===f||-1===
+e?d=0:"number"===typeof b?(d=b*e,d>f&&(d=0)):"first"==b?d=0:"previous"==b?(d=0<=e?d-e:0,0>d&&(d=0)):"next"==b?d+e<f&&(d+=e):"last"==b?d=Math.floor((f-1)/e)*e:L(a,0,"Unknown paging action: "+b,5);b=a._iDisplayStart!==d;a._iDisplayStart=d;b&&(u(a,null,"page",[a]),c&&O(a));return b}function qb(a){return h("<div/>",{id:!a.aanFeatures.r?a.sTableId+"_processing":null,"class":a.oClasses.sProcessing}).html(a.oLanguage.sProcessing).insertBefore(a.nTable)[0]}function C(a,b){a.oFeatures.bProcessing&&h(a.aanFeatures.r).css("display",
+b?"block":"none");u(a,null,"processing",[a,b])}function rb(a){var b=h(a.nTable);b.attr("role","grid");var c=a.oScroll;if(""===c.sX&&""===c.sY)return a.nTable;var d=c.sX,e=c.sY,f=a.oClasses,g=b.children("caption"),j=g.length?g[0]._captionSide:null,i=h(b[0].cloneNode(!1)),n=h(b[0].cloneNode(!1)),l=b.children("tfoot");l.length||(l=null);i=h("<div/>",{"class":f.sScrollWrapper}).append(h("<div/>",{"class":f.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:d?!d?null:x(d):"100%"}).append(h("<div/>",
+{"class":f.sScrollHeadInner}).css({"box-sizing":"content-box",width:c.sXInner||"100%"}).append(i.removeAttr("id").css("margin-left",0).append("top"===j?g:null).append(b.children("thead"))))).append(h("<div/>",{"class":f.sScrollBody}).css({position:"relative",overflow:"auto",width:!d?null:x(d)}).append(b));l&&i.append(h("<div/>",{"class":f.sScrollFoot}).css({overflow:"hidden",border:0,width:d?!d?null:x(d):"100%"}).append(h("<div/>",{"class":f.sScrollFootInner}).append(n.removeAttr("id").css("margin-left",
+0).append("bottom"===j?g:null).append(b.children("tfoot")))));var b=i.children(),k=b[0],f=b[1],t=l?b[2]:null;if(d)h(f).on("scroll.DT",function(){var a=this.scrollLeft;k.scrollLeft=a;l&&(t.scrollLeft=a)});h(f).css(e&&c.bCollapse?"max-height":"height",e);a.nScrollHead=k;a.nScrollBody=f;a.nScrollFoot=t;a.aoDrawCallback.push({fn:ka,sName:"scrolling"});return i[0]}function ka(a){var b=a.oScroll,c=b.sX,d=b.sXInner,e=b.sY,b=b.iBarWidth,f=h(a.nScrollHead),g=f[0].style,j=f.children("div"),i=j[0].style,n=j.children("table"),
+j=a.nScrollBody,l=h(j),q=j.style,t=h(a.nScrollFoot).children("div"),m=t.children("table"),o=h(a.nTHead),G=h(a.nTable),p=G[0],r=p.style,u=a.nTFoot?h(a.nTFoot):null,Eb=a.oBrowser,Ua=Eb.bScrollOversize,s=F(a.aoColumns,"nTh"),P,v,w,y,z=[],A=[],B=[],C=[],D,E=function(a){a=a.style;a.paddingTop="0";a.paddingBottom="0";a.borderTopWidth="0";a.borderBottomWidth="0";a.height=0};v=j.scrollHeight>j.clientHeight;if(a.scrollBarVis!==v&&a.scrollBarVis!==k)a.scrollBarVis=v,U(a);else{a.scrollBarVis=v;G.children("thead, tfoot").remove();
+u&&(w=u.clone().prependTo(G),P=u.find("tr"),w=w.find("tr"));y=o.clone().prependTo(G);o=o.find("tr");v=y.find("tr");y.find("th, td").removeAttr("tabindex");c||(q.width="100%",f[0].style.width="100%");h.each(qa(a,y),function(b,c){D=Z(a,b);c.style.width=a.aoColumns[D].sWidth});u&&J(function(a){a.style.width=""},w);f=G.outerWidth();if(""===c){r.width="100%";if(Ua&&(G.find("tbody").height()>j.offsetHeight||"scroll"==l.css("overflow-y")))r.width=x(G.outerWidth()-b);f=G.outerWidth()}else""!==d&&(r.width=
+x(d),f=G.outerWidth());J(E,v);J(function(a){B.push(a.innerHTML);z.push(x(h(a).css("width")))},v);J(function(a,b){if(h.inArray(a,s)!==-1)a.style.width=z[b]},o);h(v).height(0);u&&(J(E,w),J(function(a){C.push(a.innerHTML);A.push(x(h(a).css("width")))},w),J(function(a,b){a.style.width=A[b]},P),h(w).height(0));J(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+B[b]+"</div>";a.style.width=z[b]},v);u&&J(function(a,b){a.innerHTML='<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+
+C[b]+"</div>";a.style.width=A[b]},w);if(G.outerWidth()<f){P=j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")?f+b:f;if(Ua&&(j.scrollHeight>j.offsetHeight||"scroll"==l.css("overflow-y")))r.width=x(P-b);(""===c||""!==d)&&L(a,1,"Possible column misalignment",6)}else P="100%";q.width=x(P);g.width=x(P);u&&(a.nScrollFoot.style.width=x(P));!e&&Ua&&(q.height=x(p.offsetHeight+b));c=G.outerWidth();n[0].style.width=x(c);i.width=x(c);d=G.height()>j.clientHeight||"scroll"==l.css("overflow-y");e="padding"+
+(Eb.bScrollbarLeft?"Left":"Right");i[e]=d?b+"px":"0px";u&&(m[0].style.width=x(c),t[0].style.width=x(c),t[0].style[e]=d?b+"px":"0px");G.children("colgroup").insertBefore(G.children("thead"));l.scroll();if((a.bSorted||a.bFiltered)&&!a._drawHold)j.scrollTop=0}}function J(a,b,c){for(var d=0,e=0,f=b.length,g,j;e<f;){g=b[e].firstChild;for(j=c?c[e].firstChild:null;g;)1===g.nodeType&&(c?a(g,j,d):a(g,d),d++),g=g.nextSibling,j=c?j.nextSibling:null;e++}}function Ha(a){var b=a.nTable,c=a.aoColumns,d=a.oScroll,
+e=d.sY,f=d.sX,g=d.sXInner,j=c.length,i=la(a,"bVisible"),n=h("th",a.nTHead),l=b.getAttribute("width"),k=b.parentNode,t=!1,m,o,p=a.oBrowser,d=p.bScrollOversize;(m=b.style.width)&&-1!==m.indexOf("%")&&(l=m);for(m=0;m<i.length;m++)o=c[i[m]],null!==o.sWidth&&(o.sWidth=Fb(o.sWidthOrig,k),t=!0);if(d||!t&&!f&&!e&&j==aa(a)&&j==n.length)for(m=0;m<j;m++)i=Z(a,m),null!==i&&(c[i].sWidth=x(n.eq(m).width()));else{j=h(b).clone().css("visibility","hidden").removeAttr("id");j.find("tbody tr").remove();var r=h("<tr/>").appendTo(j.find("tbody"));
+j.find("thead, tfoot").remove();j.append(h(a.nTHead).clone()).append(h(a.nTFoot).clone());j.find("tfoot th, tfoot td").css("width","");n=qa(a,j.find("thead")[0]);for(m=0;m<i.length;m++)o=c[i[m]],n[m].style.width=null!==o.sWidthOrig&&""!==o.sWidthOrig?x(o.sWidthOrig):"",o.sWidthOrig&&f&&h(n[m]).append(h("<div/>").css({width:o.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(a.aoData.length)for(m=0;m<i.length;m++)t=i[m],o=c[t],h(Gb(a,t)).clone(!1).append(o.sContentPadding).appendTo(r);h("[name]",
+j).removeAttr("name");o=h("<div/>").css(f||e?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(j).appendTo(k);f&&g?j.width(g):f?(j.css("width","auto"),j.removeAttr("width"),j.width()<k.clientWidth&&l&&j.width(k.clientWidth)):e?j.width(k.clientWidth):l&&j.width(l);for(m=e=0;m<i.length;m++)k=h(n[m]),g=k.outerWidth()-k.width(),k=p.bBounding?Math.ceil(n[m].getBoundingClientRect().width):k.outerWidth(),e+=k,c[i[m]].sWidth=x(k-g);b.style.width=x(e);o.remove()}l&&(b.style.width=
+x(l));if((l||f)&&!a._reszEvt)b=function(){h(D).bind("resize.DT-"+a.sInstance,ua(function(){U(a)}))},d?setTimeout(b,1E3):b(),a._reszEvt=!0}function ua(a,b){var c=b!==k?b:200,d,e;return function(){var b=this,g=+new Date,j=arguments;d&&g<d+c?(clearTimeout(e),e=setTimeout(function(){d=k;a.apply(b,j)},c)):(d=g,a.apply(b,j))}}function Fb(a,b){if(!a)return 0;var c=h("<div/>").css("width",x(a)).appendTo(b||I.body),d=c[0].offsetWidth;c.remove();return d}function Gb(a,b){var c=Hb(a,b);if(0>c)return null;var d=
+a.aoData[c];return!d.nTr?h("<td/>").html(B(a,c,b,"display"))[0]:d.anCells[b]}function Hb(a,b){for(var c,d=-1,e=-1,f=0,g=a.aoData.length;f<g;f++)c=B(a,f,b,"display")+"",c=c.replace(ac,""),c=c.replace(/&nbsp;/g," "),c.length>d&&(d=c.length,e=f);return e}function x(a){return null===a?"0px":"number"==typeof a?0>a?"0px":a+"px":a.match(/\d$/)?a+"px":a}function W(a){var b,c,d=[],e=a.aoColumns,f,g,j,i;b=a.aaSortingFixed;c=h.isPlainObject(b);var n=[];f=function(a){a.length&&!h.isArray(a[0])?n.push(a):h.merge(n,
+a)};h.isArray(b)&&f(b);c&&b.pre&&f(b.pre);f(a.aaSorting);c&&b.post&&f(b.post);for(a=0;a<n.length;a++){i=n[a][0];f=e[i].aDataSort;b=0;for(c=f.length;b<c;b++)g=f[b],j=e[g].sType||"string",n[a]._idx===k&&(n[a]._idx=h.inArray(n[a][1],e[g].asSorting)),d.push({src:i,col:g,dir:n[a][1],index:n[a]._idx,type:j,formatter:m.ext.type.order[j+"-pre"]})}return d}function mb(a){var b,c,d=[],e=m.ext.type.order,f=a.aoData,g=0,j,i=a.aiDisplayMaster,h;Ia(a);h=W(a);b=0;for(c=h.length;b<c;b++)j=h[b],j.formatter&&g++,Ib(a,
+j.col);if("ssp"!=y(a)&&0!==h.length){b=0;for(c=i.length;b<c;b++)d[i[b]]=b;g===h.length?i.sort(function(a,b){var c,e,g,j,i=h.length,k=f[a]._aSortData,m=f[b]._aSortData;for(g=0;g<i;g++)if(j=h[g],c=k[j.col],e=m[j.col],c=c<e?-1:c>e?1:0,0!==c)return"asc"===j.dir?c:-c;c=d[a];e=d[b];return c<e?-1:c>e?1:0}):i.sort(function(a,b){var c,g,j,i,k=h.length,m=f[a]._aSortData,p=f[b]._aSortData;for(j=0;j<k;j++)if(i=h[j],c=m[i.col],g=p[i.col],i=e[i.type+"-"+i.dir]||e["string-"+i.dir],c=i(c,g),0!==c)return c;c=d[a];
+g=d[b];return c<g?-1:c>g?1:0})}a.bSorted=!0}function Jb(a){for(var b,c,d=a.aoColumns,e=W(a),a=a.oLanguage.oAria,f=0,g=d.length;f<g;f++){c=d[f];var j=c.asSorting;b=c.sTitle.replace(/<.*?>/g,"");var i=c.nTh;i.removeAttribute("aria-sort");c.bSortable&&(0<e.length&&e[0].col==f?(i.setAttribute("aria-sort","asc"==e[0].dir?"ascending":"descending"),c=j[e[0].index+1]||j[0]):c=j[0],b+="asc"===c?a.sSortAscending:a.sSortDescending);i.setAttribute("aria-label",b)}}function Va(a,b,c,d){var e=a.aaSorting,f=a.aoColumns[b].asSorting,
+g=function(a,b){var c=a._idx;c===k&&(c=h.inArray(a[1],f));return c+1<f.length?c+1:b?null:0};"number"===typeof e[0]&&(e=a.aaSorting=[e]);c&&a.oFeatures.bSortMulti?(c=h.inArray(b,F(e,"0")),-1!==c?(b=g(e[c],!0),null===b&&1===e.length&&(b=0),null===b?e.splice(c,1):(e[c][1]=f[b],e[c]._idx=b)):(e.push([b,f[0],0]),e[e.length-1]._idx=0)):e.length&&e[0][0]==b?(b=g(e[0]),e.length=1,e[0][1]=f[b],e[0]._idx=b):(e.length=0,e.push([b,f[0]]),e[0]._idx=0);T(a);"function"==typeof d&&d(a)}function Oa(a,b,c,d){var e=
+a.aoColumns[c];Wa(b,{},function(b){!1!==e.bSortable&&(a.oFeatures.bProcessing?(C(a,!0),setTimeout(function(){Va(a,c,b.shiftKey,d);"ssp"!==y(a)&&C(a,!1)},0)):Va(a,c,b.shiftKey,d))})}function xa(a){var b=a.aLastSort,c=a.oClasses.sSortColumn,d=W(a),e=a.oFeatures,f,g;if(e.bSort&&e.bSortClasses){e=0;for(f=b.length;e<f;e++)g=b[e].src,h(F(a.aoData,"anCells",g)).removeClass(c+(2>e?e+1:3));e=0;for(f=d.length;e<f;e++)g=d[e].src,h(F(a.aoData,"anCells",g)).addClass(c+(2>e?e+1:3))}a.aLastSort=d}function Ib(a,
+b){var c=a.aoColumns[b],d=m.ext.order[c.sSortDataType],e;d&&(e=d.call(a.oInstance,a,b,$(a,b)));for(var f,g=m.ext.type.order[c.sType+"-pre"],j=0,i=a.aoData.length;j<i;j++)if(c=a.aoData[j],c._aSortData||(c._aSortData=[]),!c._aSortData[b]||d)f=d?e[j]:B(a,j,b,"sort"),c._aSortData[b]=g?g(f):f}function ya(a){if(a.oFeatures.bStateSave&&!a.bDestroying){var b={time:+new Date,start:a._iDisplayStart,length:a._iDisplayLength,order:h.extend(!0,[],a.aaSorting),search:Ab(a.oPreviousSearch),columns:h.map(a.aoColumns,
+function(b,d){return{visible:b.bVisible,search:Ab(a.aoPreSearchCols[d])}})};u(a,"aoStateSaveParams","stateSaveParams",[a,b]);a.oSavedState=b;a.fnStateSaveCallback.call(a.oInstance,a,b)}}function Kb(a){var b,c,d=a.aoColumns;if(a.oFeatures.bStateSave){var e=a.fnStateLoadCallback.call(a.oInstance,a);if(e&&e.time&&(b=u(a,"aoStateLoadParams","stateLoadParams",[a,e]),-1===h.inArray(!1,b)&&(b=a.iStateDuration,!(0<b&&e.time<+new Date-1E3*b)&&d.length===e.columns.length))){a.oLoadedState=h.extend(!0,{},e);
+e.start!==k&&(a._iDisplayStart=e.start,a.iInitDisplayStart=e.start);e.length!==k&&(a._iDisplayLength=e.length);e.order!==k&&(a.aaSorting=[],h.each(e.order,function(b,c){a.aaSorting.push(c[0]>=d.length?[0,c[1]]:c)}));e.search!==k&&h.extend(a.oPreviousSearch,Bb(e.search));b=0;for(c=e.columns.length;b<c;b++){var f=e.columns[b];f.visible!==k&&(d[b].bVisible=f.visible);f.search!==k&&h.extend(a.aoPreSearchCols[b],Bb(f.search))}u(a,"aoStateLoaded","stateLoaded",[a,e])}}}function za(a){var b=m.settings,a=
+h.inArray(a,F(b,"nTable"));return-1!==a?b[a]:null}function L(a,b,c,d){c="DataTables warning: "+(a?"table id="+a.sTableId+" - ":"")+c;d&&(c+=". For more information about this error, please see http://datatables.net/tn/"+d);if(b)D.console&&console.log&&console.log(c);else if(b=m.ext,b=b.sErrMode||b.errMode,a&&u(a,null,"error",[a,d,c]),"alert"==b)alert(c);else{if("throw"==b)throw Error(c);"function"==typeof b&&b(a,d,c)}}function E(a,b,c,d){h.isArray(c)?h.each(c,function(c,d){h.isArray(d)?E(a,b,d[0],
+d[1]):E(a,b,d)}):(d===k&&(d=c),b[c]!==k&&(a[d]=b[c]))}function Lb(a,b,c){var d,e;for(e in b)b.hasOwnProperty(e)&&(d=b[e],h.isPlainObject(d)?(h.isPlainObject(a[e])||(a[e]={}),h.extend(!0,a[e],d)):a[e]=c&&"data"!==e&&"aaData"!==e&&h.isArray(d)?d.slice():d);return a}function Wa(a,b,c){h(a).bind("click.DT",b,function(b){a.blur();c(b)}).bind("keypress.DT",b,function(a){13===a.which&&(a.preventDefault(),c(a))}).bind("selectstart.DT",function(){return!1})}function z(a,b,c,d){c&&a[b].push({fn:c,sName:d})}
+function u(a,b,c,d){var e=[];b&&(e=h.map(a[b].slice().reverse(),function(b){return b.fn.apply(a.oInstance,d)}));null!==c&&(b=h.Event(c+".dt"),h(a.nTable).trigger(b,d),e.push(b.result));return e}function Sa(a){var b=a._iDisplayStart,c=a.fnDisplayEnd(),d=a._iDisplayLength;b>=c&&(b=c-d);b-=b%d;if(-1===d||0>b)b=0;a._iDisplayStart=b}function Pa(a,b){var c=a.renderer,d=m.ext.renderer[b];return h.isPlainObject(c)&&c[b]?d[c[b]]||d._:"string"===typeof c?d[c]||d._:d._}function y(a){return a.oFeatures.bServerSide?
+"ssp":a.ajax||a.sAjaxSource?"ajax":"dom"}function Aa(a,b){var c=[],c=Mb.numbers_length,d=Math.floor(c/2);b<=c?c=X(0,b):a<=d?(c=X(0,c-2),c.push("ellipsis"),c.push(b-1)):(a>=b-1-d?c=X(b-(c-2),b):(c=X(a-d+2,a+d-1),c.push("ellipsis"),c.push(b-1)),c.splice(0,0,"ellipsis"),c.splice(0,0,0));c.DT_el="span";return c}function db(a){h.each({num:function(b){return Ba(b,a)},"num-fmt":function(b){return Ba(b,a,Xa)},"html-num":function(b){return Ba(b,a,Ca)},"html-num-fmt":function(b){return Ba(b,a,Ca,Xa)}},function(b,
+c){v.type.order[b+a+"-pre"]=c;b.match(/^html\-/)&&(v.type.search[b+a]=v.type.search.html)})}function Nb(a){return function(){var b=[za(this[m.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return m.ext.internal[a].apply(this,b)}}var m,v,r,p,s,Ya={},Ob=/[\r\n]/g,Ca=/<.*?>/g,bc=/^[\w\+\-]/,cc=/[\w\+\-]$/,Zb=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Xa=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi,M=function(a){return!a||!0===a||"-"===a?!0:!1},
+Pb=function(a){var b=parseInt(a,10);return!isNaN(b)&&isFinite(a)?b:null},Qb=function(a,b){Ya[b]||(Ya[b]=RegExp(va(b),"g"));return"string"===typeof a&&"."!==b?a.replace(/\./g,"").replace(Ya[b],"."):a},Za=function(a,b,c){var d="string"===typeof a;if(M(a))return!0;b&&d&&(a=Qb(a,b));c&&d&&(a=a.replace(Xa,""));return!isNaN(parseFloat(a))&&isFinite(a)},Rb=function(a,b,c){return M(a)?!0:!(M(a)||"string"===typeof a)?null:Za(a.replace(Ca,""),b,c)?!0:null},F=function(a,b,c){var d=[],e=0,f=a.length;if(c!==k)for(;e<
+f;e++)a[e]&&a[e][b]&&d.push(a[e][b][c]);else for(;e<f;e++)a[e]&&d.push(a[e][b]);return d},ha=function(a,b,c,d){var e=[],f=0,g=b.length;if(d!==k)for(;f<g;f++)a[b[f]][c]&&e.push(a[b[f]][c][d]);else for(;f<g;f++)e.push(a[b[f]][c]);return e},X=function(a,b){var c=[],d;b===k?(b=0,d=a):(d=b,b=a);for(var e=b;e<d;e++)c.push(e);return c},Sb=function(a){for(var b=[],c=0,d=a.length;c<d;c++)a[c]&&b.push(a[c]);return b},pa=function(a){var b=[],c,d,e=a.length,f,g=0;d=0;a:for(;d<e;d++){c=a[d];for(f=0;f<g;f++)if(b[f]===
+c)continue a;b.push(c);g++}return b},A=function(a,b,c){a[b]!==k&&(a[c]=a[b])},ba=/\[.*?\]$/,V=/\(\)$/,wa=h("<div>")[0],$b=wa.textContent!==k,ac=/<.*?>/g;m=function(a){this.$=function(a,b){return this.api(!0).$(a,b)};this._=function(a,b){return this.api(!0).rows(a,b).data()};this.api=function(a){return a?new r(za(this[v.iApiIndex])):new r(this)};this.fnAddData=function(a,b){var c=this.api(!0),d=h.isArray(a)&&(h.isArray(a[0])||h.isPlainObject(a[0]))?c.rows.add(a):c.row.add(a);(b===k||b)&&c.draw();return d.flatten().toArray()};
+this.fnAdjustColumnSizing=function(a){var b=this.api(!0).columns.adjust(),c=b.settings()[0],d=c.oScroll;a===k||a?b.draw(!1):(""!==d.sX||""!==d.sY)&&ka(c)};this.fnClearTable=function(a){var b=this.api(!0).clear();(a===k||a)&&b.draw()};this.fnClose=function(a){this.api(!0).row(a).child.hide()};this.fnDeleteRow=function(a,b,c){var d=this.api(!0),a=d.rows(a),e=a.settings()[0],h=e.aoData[a[0][0]];a.remove();b&&b.call(this,e,h);(c===k||c)&&d.draw();return h};this.fnDestroy=function(a){this.api(!0).destroy(a)};
+this.fnDraw=function(a){this.api(!0).draw(a)};this.fnFilter=function(a,b,c,d,e,h){e=this.api(!0);null===b||b===k?e.search(a,c,d,h):e.column(b).search(a,c,d,h);e.draw()};this.fnGetData=function(a,b){var c=this.api(!0);if(a!==k){var d=a.nodeName?a.nodeName.toLowerCase():"";return b!==k||"td"==d||"th"==d?c.cell(a,b).data():c.row(a).data()||null}return c.data().toArray()};this.fnGetNodes=function(a){var b=this.api(!0);return a!==k?b.row(a).node():b.rows().nodes().flatten().toArray()};this.fnGetPosition=
+function(a){var b=this.api(!0),c=a.nodeName.toUpperCase();return"TR"==c?b.row(a).index():"TD"==c||"TH"==c?(a=b.cell(a).index(),[a.row,a.columnVisible,a.column]):null};this.fnIsOpen=function(a){return this.api(!0).row(a).child.isShown()};this.fnOpen=function(a,b,c){return this.api(!0).row(a).child(b,c).show().child()[0]};this.fnPageChange=function(a,b){var c=this.api(!0).page(a);(b===k||b)&&c.draw(!1)};this.fnSetColumnVis=function(a,b,c){a=this.api(!0).column(a).visible(b);(c===k||c)&&a.columns.adjust().draw()};
+this.fnSettings=function(){return za(this[v.iApiIndex])};this.fnSort=function(a){this.api(!0).order(a).draw()};this.fnSortListener=function(a,b,c){this.api(!0).order.listener(a,b,c)};this.fnUpdate=function(a,b,c,d,e){var h=this.api(!0);c===k||null===c?h.row(b).data(a):h.cell(b,c).data(a);(e===k||e)&&h.columns.adjust();(d===k||d)&&h.draw();return 0};this.fnVersionCheck=v.fnVersionCheck;var b=this,c=a===k,d=this.length;c&&(a={});this.oApi=this.internal=v.internal;for(var e in m.ext.internal)e&&(this[e]=
+Nb(e));this.each(function(){var e={},e=1<d?Lb(e,a,!0):a,g=0,j,i=this.getAttribute("id"),n=!1,l=m.defaults,q=h(this);if("table"!=this.nodeName.toLowerCase())L(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{eb(l);fb(l.column);K(l,l,!0);K(l.column,l.column,!0);K(l,h.extend(e,q.data()));var t=m.settings,g=0;for(j=t.length;g<j;g++){var p=t[g];if(p.nTable==this||p.nTHead.parentNode==this||p.nTFoot&&p.nTFoot.parentNode==this){g=e.bRetrieve!==k?e.bRetrieve:l.bRetrieve;if(c||g)return p.oInstance;
+if(e.bDestroy!==k?e.bDestroy:l.bDestroy){p.oInstance.fnDestroy();break}else{L(p,0,"Cannot reinitialise DataTable",3);return}}if(p.sTableId==this.id){t.splice(g,1);break}}if(null===i||""===i)this.id=i="DataTables_Table_"+m.ext._unique++;var o=h.extend(!0,{},m.models.oSettings,{sDestroyWidth:q[0].style.width,sInstance:i,sTableId:i});o.nTable=this;o.oApi=b.internal;o.oInit=e;t.push(o);o.oInstance=1===b.length?b:q.dataTable();eb(e);e.oLanguage&&Fa(e.oLanguage);e.aLengthMenu&&!e.iDisplayLength&&(e.iDisplayLength=
+h.isArray(e.aLengthMenu[0])?e.aLengthMenu[0][0]:e.aLengthMenu[0]);e=Lb(h.extend(!0,{},l),e);E(o.oFeatures,e,"bPaginate bLengthChange bFilter bSort bSortMulti bInfo bProcessing bAutoWidth bSortClasses bServerSide bDeferRender".split(" "));E(o,e,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback",
+"renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"],["bJQueryUI","bJUI"]]);E(o.oScroll,e,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]);E(o.oLanguage,e,"fnInfoCallback");z(o,"aoDrawCallback",e.fnDrawCallback,"user");z(o,"aoServerParams",e.fnServerParams,"user");z(o,"aoStateSaveParams",e.fnStateSaveParams,"user");z(o,"aoStateLoadParams",
+e.fnStateLoadParams,"user");z(o,"aoStateLoaded",e.fnStateLoaded,"user");z(o,"aoRowCallback",e.fnRowCallback,"user");z(o,"aoRowCreatedCallback",e.fnCreatedRow,"user");z(o,"aoHeaderCallback",e.fnHeaderCallback,"user");z(o,"aoFooterCallback",e.fnFooterCallback,"user");z(o,"aoInitComplete",e.fnInitComplete,"user");z(o,"aoPreDrawCallback",e.fnPreDrawCallback,"user");o.rowIdFn=Q(e.rowId);gb(o);i=o.oClasses;e.bJQueryUI?(h.extend(i,m.ext.oJUIClasses,e.oClasses),e.sDom===l.sDom&&"lfrtip"===l.sDom&&(o.sDom=
+'<"H"lfr>t<"F"ip>'),o.renderer)?h.isPlainObject(o.renderer)&&!o.renderer.header&&(o.renderer.header="jqueryui"):o.renderer="jqueryui":h.extend(i,m.ext.classes,e.oClasses);q.addClass(i.sTable);o.iInitDisplayStart===k&&(o.iInitDisplayStart=e.iDisplayStart,o._iDisplayStart=e.iDisplayStart);null!==e.iDeferLoading&&(o.bDeferLoading=!0,g=h.isArray(e.iDeferLoading),o._iRecordsDisplay=g?e.iDeferLoading[0]:e.iDeferLoading,o._iRecordsTotal=g?e.iDeferLoading[1]:e.iDeferLoading);var r=o.oLanguage;h.extend(!0,
+r,e.oLanguage);""!==r.sUrl&&(h.ajax({dataType:"json",url:r.sUrl,success:function(a){Fa(a);K(l.oLanguage,a);h.extend(true,r,a);ga(o)},error:function(){ga(o)}}),n=!0);null===e.asStripeClasses&&(o.asStripeClasses=[i.sStripeOdd,i.sStripeEven]);var g=o.asStripeClasses,v=q.children("tbody").find("tr").eq(0);-1!==h.inArray(!0,h.map(g,function(a){return v.hasClass(a)}))&&(h("tbody tr",this).removeClass(g.join(" ")),o.asDestroyStripes=g.slice());t=[];g=this.getElementsByTagName("thead");0!==g.length&&(da(o.aoHeader,
+g[0]),t=qa(o));if(null===e.aoColumns){p=[];g=0;for(j=t.length;g<j;g++)p.push(null)}else p=e.aoColumns;g=0;for(j=p.length;g<j;g++)Ga(o,t?t[g]:null);ib(o,e.aoColumnDefs,p,function(a,b){ja(o,a,b)});if(v.length){var s=function(a,b){return a.getAttribute("data-"+b)!==null?b:null};h(v[0]).children("th, td").each(function(a,b){var c=o.aoColumns[a];if(c.mData===a){var d=s(b,"sort")||s(b,"order"),e=s(b,"filter")||s(b,"search");if(d!==null||e!==null){c.mData={_:a+".display",sort:d!==null?a+".@data-"+d:k,type:d!==
+null?a+".@data-"+d:k,filter:e!==null?a+".@data-"+e:k};ja(o,a)}}})}var w=o.oFeatures;e.bStateSave&&(w.bStateSave=!0,Kb(o,e),z(o,"aoDrawCallback",ya,"state_save"));if(e.aaSorting===k){t=o.aaSorting;g=0;for(j=t.length;g<j;g++)t[g][1]=o.aoColumns[g].asSorting[0]}xa(o);w.bSort&&z(o,"aoDrawCallback",function(){if(o.bSorted){var a=W(o),b={};h.each(a,function(a,c){b[c.src]=c.dir});u(o,null,"order",[o,a,b]);Jb(o)}});z(o,"aoDrawCallback",function(){(o.bSorted||y(o)==="ssp"||w.bDeferRender)&&xa(o)},"sc");g=
+q.children("caption").each(function(){this._captionSide=q.css("caption-side")});j=q.children("thead");0===j.length&&(j=h("<thead/>").appendTo(this));o.nTHead=j[0];j=q.children("tbody");0===j.length&&(j=h("<tbody/>").appendTo(this));o.nTBody=j[0];j=q.children("tfoot");if(0===j.length&&0<g.length&&(""!==o.oScroll.sX||""!==o.oScroll.sY))j=h("<tfoot/>").appendTo(this);0===j.length||0===j.children().length?q.addClass(i.sNoFooter):0<j.length&&(o.nTFoot=j[0],da(o.aoFooter,o.nTFoot));if(e.aaData)for(g=0;g<
+e.aaData.length;g++)N(o,e.aaData[g]);else(o.bDeferLoading||"dom"==y(o))&&ma(o,h(o.nTBody).children("tr"));o.aiDisplay=o.aiDisplayMaster.slice();o.bInitialised=!0;!1===n&&ga(o)}});b=null;return this};var Tb=[],w=Array.prototype,dc=function(a){var b,c,d=m.settings,e=h.map(d,function(a){return a.nTable});if(a){if(a.nTable&&a.oApi)return[a];if(a.nodeName&&"table"===a.nodeName.toLowerCase())return b=h.inArray(a,e),-1!==b?[d[b]]:null;if(a&&"function"===typeof a.settings)return a.settings().toArray();"string"===
+typeof a?c=h(a):a instanceof h&&(c=a)}else return[];if(c)return c.map(function(){b=h.inArray(this,e);return-1!==b?d[b]:null}).toArray()};r=function(a,b){if(!(this instanceof r))return new r(a,b);var c=[],d=function(a){(a=dc(a))&&(c=c.concat(a))};if(h.isArray(a))for(var e=0,f=a.length;e<f;e++)d(a[e]);else d(a);this.context=pa(c);b&&h.merge(this,b);this.selector={rows:null,cols:null,opts:null};r.extend(this,this,Tb)};m.Api=r;h.extend(r.prototype,{any:function(){return 0!==this.count()},concat:w.concat,
+context:[],count:function(){return this.flatten().length},each:function(a){for(var b=0,c=this.length;b<c;b++)a.call(this,this[b],b,this);return this},eq:function(a){var b=this.context;return b.length>a?new r(b[a],this[a]):null},filter:function(a){var b=[];if(w.filter)b=w.filter.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)a.call(this,this[c],c,this)&&b.push(this[c]);return new r(this.context,b)},flatten:function(){var a=[];return new r(this.context,a.concat.apply(a,this.toArray()))},join:w.join,
+indexOf:w.indexOf||function(a,b){for(var c=b||0,d=this.length;c<d;c++)if(this[c]===a)return c;return-1},iterator:function(a,b,c,d){var e=[],f,g,h,i,n,l=this.context,m,t,p=this.selector;"string"===typeof a&&(d=c,c=b,b=a,a=!1);g=0;for(h=l.length;g<h;g++){var o=new r(l[g]);if("table"===b)f=c.call(o,l[g],g),f!==k&&e.push(f);else if("columns"===b||"rows"===b)f=c.call(o,l[g],this[g],g),f!==k&&e.push(f);else if("column"===b||"column-rows"===b||"row"===b||"cell"===b){t=this[g];"column-rows"===b&&(m=Da(l[g],
+p.opts));i=0;for(n=t.length;i<n;i++)f=t[i],f="cell"===b?c.call(o,l[g],f.row,f.column,g,i):c.call(o,l[g],f,g,i,m),f!==k&&e.push(f)}}return e.length||d?(a=new r(l,a?e.concat.apply([],e):e),b=a.selector,b.rows=p.rows,b.cols=p.cols,b.opts=p.opts,a):this},lastIndexOf:w.lastIndexOf||function(a,b){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(a){var b=[];if(w.map)b=w.map.call(this,a,this);else for(var c=0,d=this.length;c<d;c++)b.push(a.call(this,this[c],c));return new r(this.context,
+b)},pluck:function(a){return this.map(function(b){return b[a]})},pop:w.pop,push:w.push,reduce:w.reduce||function(a,b){return hb(this,a,b,0,this.length,1)},reduceRight:w.reduceRight||function(a,b){return hb(this,a,b,this.length-1,-1,-1)},reverse:w.reverse,selector:null,shift:w.shift,sort:w.sort,splice:w.splice,toArray:function(){return w.slice.call(this)},to$:function(){return h(this)},toJQuery:function(){return h(this)},unique:function(){return new r(this.context,pa(this))},unshift:w.unshift});r.extend=
+function(a,b,c){if(c.length&&b&&(b instanceof r||b.__dt_wrapper)){var d,e,f,g=function(a,b,c){return function(){var d=b.apply(a,arguments);r.extend(d,d,c.methodExt);return d}};d=0;for(e=c.length;d<e;d++)f=c[d],b[f.name]="function"===typeof f.val?g(a,f.val,f):h.isPlainObject(f.val)?{}:f.val,b[f.name].__dt_wrapper=!0,r.extend(a,b[f.name],f.propExt)}};r.register=p=function(a,b){if(h.isArray(a))for(var c=0,d=a.length;c<d;c++)r.register(a[c],b);else for(var e=a.split("."),f=Tb,g,j,c=0,d=e.length;c<d;c++){g=
+(j=-1!==e[c].indexOf("()"))?e[c].replace("()",""):e[c];var i;a:{i=0;for(var n=f.length;i<n;i++)if(f[i].name===g){i=f[i];break a}i=null}i||(i={name:g,val:{},methodExt:[],propExt:[]},f.push(i));c===d-1?i.val=b:f=j?i.methodExt:i.propExt}};r.registerPlural=s=function(a,b,c){r.register(a,c);r.register(b,function(){var a=c.apply(this,arguments);return a===this?this:a instanceof r?a.length?h.isArray(a[0])?new r(a.context,a[0]):a[0]:k:a})};p("tables()",function(a){var b;if(a){b=r;var c=this.context;if("number"===
+typeof a)a=[c[a]];else var d=h.map(c,function(a){return a.nTable}),a=h(d).filter(a).map(function(){var a=h.inArray(this,d);return c[a]}).toArray();b=new b(a)}else b=this;return b});p("table()",function(a){var a=this.tables(a),b=a.context;return b.length?new r(b[0]):a});s("tables().nodes()","table().node()",function(){return this.iterator("table",function(a){return a.nTable},1)});s("tables().body()","table().body()",function(){return this.iterator("table",function(a){return a.nTBody},1)});s("tables().header()",
+"table().header()",function(){return this.iterator("table",function(a){return a.nTHead},1)});s("tables().footer()","table().footer()",function(){return this.iterator("table",function(a){return a.nTFoot},1)});s("tables().containers()","table().container()",function(){return this.iterator("table",function(a){return a.nTableWrapper},1)});p("draw()",function(a){return this.iterator("table",function(b){"page"===a?O(b):("string"===typeof a&&(a="full-hold"===a?!1:!0),T(b,!1===a))})});p("page()",function(a){return a===
+k?this.page.info().page:this.iterator("table",function(b){Ta(b,a)})});p("page.info()",function(){if(0===this.context.length)return k;var a=this.context[0],b=a._iDisplayStart,c=a.oFeatures.bPaginate?a._iDisplayLength:-1,d=a.fnRecordsDisplay(),e=-1===c;return{page:e?0:Math.floor(b/c),pages:e?1:Math.ceil(d/c),start:b,end:a.fnDisplayEnd(),length:c,recordsTotal:a.fnRecordsTotal(),recordsDisplay:d,serverSide:"ssp"===y(a)}});p("page.len()",function(a){return a===k?0!==this.context.length?this.context[0]._iDisplayLength:
+k:this.iterator("table",function(b){Ra(b,a)})});var Ub=function(a,b,c){if(c){var d=new r(a);d.one("draw",function(){c(d.ajax.json())})}if("ssp"==y(a))T(a,b);else{C(a,!0);var e=a.jqXHR;e&&4!==e.readyState&&e.abort();ra(a,[],function(c){na(a);for(var c=sa(a,c),d=0,e=c.length;d<e;d++)N(a,c[d]);T(a,b);C(a,!1)})}};p("ajax.json()",function(){var a=this.context;if(0<a.length)return a[0].json});p("ajax.params()",function(){var a=this.context;if(0<a.length)return a[0].oAjaxData});p("ajax.reload()",function(a,
+b){return this.iterator("table",function(c){Ub(c,!1===b,a)})});p("ajax.url()",function(a){var b=this.context;if(a===k){if(0===b.length)return k;b=b[0];return b.ajax?h.isPlainObject(b.ajax)?b.ajax.url:b.ajax:b.sAjaxSource}return this.iterator("table",function(b){h.isPlainObject(b.ajax)?b.ajax.url=a:b.ajax=a})});p("ajax.url().load()",function(a,b){return this.iterator("table",function(c){Ub(c,!1===b,a)})});var $a=function(a,b,c,d,e){var f=[],g,j,i,n,l,m;i=typeof b;if(!b||"string"===i||"function"===
+i||b.length===k)b=[b];i=0;for(n=b.length;i<n;i++){j=b[i]&&b[i].split?b[i].split(","):[b[i]];l=0;for(m=j.length;l<m;l++)(g=c("string"===typeof j[l]?h.trim(j[l]):j[l]))&&g.length&&(f=f.concat(g))}a=v.selector[a];if(a.length){i=0;for(n=a.length;i<n;i++)f=a[i](d,e,f)}return pa(f)},ab=function(a){a||(a={});a.filter&&a.search===k&&(a.search=a.filter);return h.extend({search:"none",order:"current",page:"all"},a)},bb=function(a){for(var b=0,c=a.length;b<c;b++)if(0<a[b].length)return a[0]=a[b],a[0].length=
+1,a.length=1,a.context=[a.context[b]],a;a.length=0;return a},Da=function(a,b){var c,d,e,f=[],g=a.aiDisplay;c=a.aiDisplayMaster;var j=b.search;d=b.order;e=b.page;if("ssp"==y(a))return"removed"===j?[]:X(0,c.length);if("current"==e){c=a._iDisplayStart;for(d=a.fnDisplayEnd();c<d;c++)f.push(g[c])}else if("current"==d||"applied"==d)f="none"==j?c.slice():"applied"==j?g.slice():h.map(c,function(a){return-1===h.inArray(a,g)?a:null});else if("index"==d||"original"==d){c=0;for(d=a.aoData.length;c<d;c++)"none"==
+j?f.push(c):(e=h.inArray(c,g),(-1===e&&"removed"==j||0<=e&&"applied"==j)&&f.push(c))}return f};p("rows()",function(a,b){a===k?a="":h.isPlainObject(a)&&(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var e=b;return $a("row",a,function(a){var b=Pb(a);if(b!==null&&!e)return[b];var j=Da(c,e);if(b!==null&&h.inArray(b,j)!==-1)return[b];if(!a)return j;if(typeof a==="function")return h.map(j,function(b){var e=c.aoData[b];return a(b,e._aData,e.nTr)?b:null});b=Sb(ha(c.aoData,j,"nTr"));if(a.nodeName){if(a._DT_RowIndex!==
+k)return[a._DT_RowIndex];if(a._DT_CellIndex)return[a._DT_CellIndex.row];b=h(a).closest("*[data-dt-row]");return b.length?[b.data("dt-row")]:[]}if(typeof a==="string"&&a.charAt(0)==="#"){j=c.aIds[a.replace(/^#/,"")];if(j!==k)return[j.idx]}return h(b).filter(a).map(function(){return this._DT_RowIndex}).toArray()},c,e)},1);c.selector.rows=a;c.selector.opts=b;return c});p("rows().nodes()",function(){return this.iterator("row",function(a,b){return a.aoData[b].nTr||k},1)});p("rows().data()",function(){return this.iterator(!0,
+"rows",function(a,b){return ha(a.aoData,b,"_aData")},1)});s("rows().cache()","row().cache()",function(a){return this.iterator("row",function(b,c){var d=b.aoData[c];return"search"===a?d._aFilterData:d._aSortData},1)});s("rows().invalidate()","row().invalidate()",function(a){return this.iterator("row",function(b,c){ca(b,c,a)})});s("rows().indexes()","row().index()",function(){return this.iterator("row",function(a,b){return b},1)});s("rows().ids()","row().id()",function(a){for(var b=[],c=this.context,
+d=0,e=c.length;d<e;d++)for(var f=0,g=this[d].length;f<g;f++){var h=c[d].rowIdFn(c[d].aoData[this[d][f]]._aData);b.push((!0===a?"#":"")+h)}return new r(c,b)});s("rows().remove()","row().remove()",function(){var a=this;this.iterator("row",function(b,c,d){var e=b.aoData,f=e[c],g,h,i,n,l;e.splice(c,1);g=0;for(h=e.length;g<h;g++)if(i=e[g],l=i.anCells,null!==i.nTr&&(i.nTr._DT_RowIndex=g),null!==l){i=0;for(n=l.length;i<n;i++)l[i]._DT_CellIndex.row=g}oa(b.aiDisplayMaster,c);oa(b.aiDisplay,c);oa(a[d],c,!1);
+Sa(b);c=b.rowIdFn(f._aData);c!==k&&delete b.aIds[c]});this.iterator("table",function(a){for(var c=0,d=a.aoData.length;c<d;c++)a.aoData[c].idx=c});return this});p("rows.add()",function(a){var b=this.iterator("table",function(b){var c,f,g,h=[];f=0;for(g=a.length;f<g;f++)c=a[f],c.nodeName&&"TR"===c.nodeName.toUpperCase()?h.push(ma(b,c)[0]):h.push(N(b,c));return h},1),c=this.rows(-1);c.pop();h.merge(c,b);return c});p("row()",function(a,b){return bb(this.rows(a,b))});p("row().data()",function(a){var b=
+this.context;if(a===k)return b.length&&this.length?b[0].aoData[this[0]]._aData:k;b[0].aoData[this[0]]._aData=a;ca(b[0],this[0],"data");return this});p("row().node()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]].nTr||null:null});p("row.add()",function(a){a instanceof h&&a.length&&(a=a[0]);var b=this.iterator("table",function(b){return a.nodeName&&"TR"===a.nodeName.toUpperCase()?ma(b,a)[0]:N(b,a)});return this.row(b[0])});var cb=function(a,b){var c=a.context;if(c.length&&
+(c=c[0].aoData[b!==k?b:a[0]])&&c._details)c._details.remove(),c._detailsShow=k,c._details=k},Vb=function(a,b){var c=a.context;if(c.length&&a.length){var d=c[0].aoData[a[0]];if(d._details){(d._detailsShow=b)?d._details.insertAfter(d.nTr):d._details.detach();var e=c[0],f=new r(e),g=e.aoData;f.off("draw.dt.DT_details column-visibility.dt.DT_details destroy.dt.DT_details");0<F(g,"_details").length&&(f.on("draw.dt.DT_details",function(a,b){e===b&&f.rows({page:"current"}).eq(0).each(function(a){a=g[a];
+a._detailsShow&&a._details.insertAfter(a.nTr)})}),f.on("column-visibility.dt.DT_details",function(a,b){if(e===b)for(var c,d=aa(b),f=0,h=g.length;f<h;f++)c=g[f],c._details&&c._details.children("td[colspan]").attr("colspan",d)}),f.on("destroy.dt.DT_details",function(a,b){if(e===b)for(var c=0,d=g.length;c<d;c++)g[c]._details&&cb(f,c)}))}}};p("row().child()",function(a,b){var c=this.context;if(a===k)return c.length&&this.length?c[0].aoData[this[0]]._details:k;if(!0===a)this.child.show();else if(!1===
+a)cb(this);else if(c.length&&this.length){var d=c[0],c=c[0].aoData[this[0]],e=[],f=function(a,b){if(h.isArray(a)||a instanceof h)for(var c=0,k=a.length;c<k;c++)f(a[c],b);else a.nodeName&&"tr"===a.nodeName.toLowerCase()?e.push(a):(c=h("<tr><td/></tr>").addClass(b),h("td",c).addClass(b).html(a)[0].colSpan=aa(d),e.push(c[0]))};f(a,b);c._details&&c._details.remove();c._details=h(e);c._detailsShow&&c._details.insertAfter(c.nTr)}return this});p(["row().child.show()","row().child().show()"],function(){Vb(this,
+!0);return this});p(["row().child.hide()","row().child().hide()"],function(){Vb(this,!1);return this});p(["row().child.remove()","row().child().remove()"],function(){cb(this);return this});p("row().child.isShown()",function(){var a=this.context;return a.length&&this.length?a[0].aoData[this[0]]._detailsShow||!1:!1});var ec=/^(.+):(name|visIdx|visible)$/,Wb=function(a,b,c,d,e){for(var c=[],d=0,f=e.length;d<f;d++)c.push(B(a,e[d],b));return c};p("columns()",function(a,b){a===k?a="":h.isPlainObject(a)&&
+(b=a,a="");var b=ab(b),c=this.iterator("table",function(c){var e=a,f=b,g=c.aoColumns,j=F(g,"sName"),i=F(g,"nTh");return $a("column",e,function(a){var b=Pb(a);if(a==="")return X(g.length);if(b!==null)return[b>=0?b:g.length+b];if(typeof a==="function"){var e=Da(c,f);return h.map(g,function(b,f){return a(f,Wb(c,f,0,0,e),i[f])?f:null})}var k=typeof a==="string"?a.match(ec):"";if(k)switch(k[2]){case "visIdx":case "visible":b=parseInt(k[1],10);if(b<0){var m=h.map(g,function(a,b){return a.bVisible?b:null});
+return[m[m.length+b]]}return[Z(c,b)];case "name":return h.map(j,function(a,b){return a===k[1]?b:null});default:return[]}if(a.nodeName&&a._DT_CellIndex)return[a._DT_CellIndex.column];b=h(i).filter(a).map(function(){return h.inArray(this,i)}).toArray();if(b.length||!a.nodeName)return b;b=h(a).closest("*[data-dt-column]");return b.length?[b.data("dt-column")]:[]},c,f)},1);c.selector.cols=a;c.selector.opts=b;return c});s("columns().header()","column().header()",function(){return this.iterator("column",
+function(a,b){return a.aoColumns[b].nTh},1)});s("columns().footer()","column().footer()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].nTf},1)});s("columns().data()","column().data()",function(){return this.iterator("column-rows",Wb,1)});s("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(a,b){return a.aoColumns[b].mData},1)});s("columns().cache()","column().cache()",function(a){return this.iterator("column-rows",function(b,
+c,d,e,f){return ha(b.aoData,f,"search"===a?"_aFilterData":"_aSortData",c)},1)});s("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(a,b,c,d,e){return ha(a.aoData,e,"anCells",b)},1)});s("columns().visible()","column().visible()",function(a,b){return this.iterator("column",function(c,d){if(a===k)return c.aoColumns[d].bVisible;var e=c.aoColumns,f=e[d],g=c.aoData,j,i,n;if(a!==k&&f.bVisible!==a){if(a){var l=h.inArray(!0,F(e,"bVisible"),d+1);j=0;for(i=g.length;j<
+i;j++)n=g[j].nTr,e=g[j].anCells,n&&n.insertBefore(e[d],e[l]||null)}else h(F(c.aoData,"anCells",d)).detach();f.bVisible=a;ea(c,c.aoHeader);ea(c,c.aoFooter);(b===k||b)&&U(c);u(c,null,"column-visibility",[c,d,a,b]);ya(c)}})});s("columns().indexes()","column().index()",function(a){return this.iterator("column",function(b,c){return"visible"===a?$(b,c):c},1)});p("columns.adjust()",function(){return this.iterator("table",function(a){U(a)},1)});p("column.index()",function(a,b){if(0!==this.context.length){var c=
+this.context[0];if("fromVisible"===a||"toData"===a)return Z(c,b);if("fromData"===a||"toVisible"===a)return $(c,b)}});p("column()",function(a,b){return bb(this.columns(a,b))});p("cells()",function(a,b,c){h.isPlainObject(a)&&(a.row===k?(c=a,a=null):(c=b,b=null));h.isPlainObject(b)&&(c=b,b=null);if(null===b||b===k)return this.iterator("table",function(b){var d=a,e=ab(c),f=b.aoData,g=Da(b,e),j=Sb(ha(f,g,"anCells")),i=h([].concat.apply([],j)),l,n=b.aoColumns.length,m,p,r,u,v,s;return $a("cell",d,function(a){var c=
+typeof a==="function";if(a===null||a===k||c){m=[];p=0;for(r=g.length;p<r;p++){l=g[p];for(u=0;u<n;u++){v={row:l,column:u};if(c){s=f[l];a(v,B(b,l,u),s.anCells?s.anCells[u]:null)&&m.push(v)}else m.push(v)}}return m}if(h.isPlainObject(a))return[a];c=i.filter(a).map(function(a,b){return{row:b._DT_CellIndex.row,column:b._DT_CellIndex.column}}).toArray();if(c.length||!a.nodeName)return c;s=h(a).closest("*[data-dt-row]");return s.length?[{row:s.data("dt-row"),column:s.data("dt-column")}]:[]},b,e)});var d=
+this.columns(b,c),e=this.rows(a,c),f,g,j,i,n,l=this.iterator("table",function(a,b){f=[];g=0;for(j=e[b].length;g<j;g++){i=0;for(n=d[b].length;i<n;i++)f.push({row:e[b][g],column:d[b][i]})}return f},1);h.extend(l.selector,{cols:b,rows:a,opts:c});return l});s("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(a,b,c){return(a=a.aoData[b])&&a.anCells?a.anCells[c]:k},1)});p("cells().data()",function(){return this.iterator("cell",function(a,b,c){return B(a,b,c)},1)});s("cells().cache()",
+"cell().cache()",function(a){a="search"===a?"_aFilterData":"_aSortData";return this.iterator("cell",function(b,c,d){return b.aoData[c][a][d]},1)});s("cells().render()","cell().render()",function(a){return this.iterator("cell",function(b,c,d){return B(b,c,d,a)},1)});s("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(a,b,c){return{row:b,column:c,columnVisible:$(a,c)}},1)});s("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(b,
+c,d){ca(b,c,a,d)})});p("cell()",function(a,b,c){return bb(this.cells(a,b,c))});p("cell().data()",function(a){var b=this.context,c=this[0];if(a===k)return b.length&&c.length?B(b[0],c[0].row,c[0].column):k;jb(b[0],c[0].row,c[0].column,a);ca(b[0],c[0].row,"data",c[0].column);return this});p("order()",function(a,b){var c=this.context;if(a===k)return 0!==c.length?c[0].aaSorting:k;"number"===typeof a?a=[[a,b]]:h.isArray(a[0])||(a=Array.prototype.slice.call(arguments));return this.iterator("table",function(b){b.aaSorting=
+a.slice()})});p("order.listener()",function(a,b,c){return this.iterator("table",function(d){Oa(d,a,b,c)})});p("order.fixed()",function(a){if(!a){var b=this.context,b=b.length?b[0].aaSortingFixed:k;return h.isArray(b)?{pre:b}:b}return this.iterator("table",function(b){b.aaSortingFixed=h.extend(!0,{},a)})});p(["columns().order()","column().order()"],function(a){var b=this;return this.iterator("table",function(c,d){var e=[];h.each(b[d],function(b,c){e.push([c,a])});c.aaSorting=e})});p("search()",function(a,
+b,c,d){var e=this.context;return a===k?0!==e.length?e[0].oPreviousSearch.sSearch:k:this.iterator("table",function(e){e.oFeatures.bFilter&&fa(e,h.extend({},e.oPreviousSearch,{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===c?!0:c,bCaseInsensitive:null===d?!0:d}),1)})});s("columns().search()","column().search()",function(a,b,c,d){return this.iterator("column",function(e,f){var g=e.aoPreSearchCols;if(a===k)return g[f].sSearch;e.oFeatures.bFilter&&(h.extend(g[f],{sSearch:a+"",bRegex:null===b?!1:b,bSmart:null===
+c?!0:c,bCaseInsensitive:null===d?!0:d}),fa(e,e.oPreviousSearch,1))})});p("state()",function(){return this.context.length?this.context[0].oSavedState:null});p("state.clear()",function(){return this.iterator("table",function(a){a.fnStateSaveCallback.call(a.oInstance,a,{})})});p("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null});p("state.save()",function(){return this.iterator("table",function(a){ya(a)})});m.versionCheck=m.fnVersionCheck=function(a){for(var b=
+m.version.split("."),a=a.split("."),c,d,e=0,f=a.length;e<f;e++)if(c=parseInt(b[e],10)||0,d=parseInt(a[e],10)||0,c!==d)return c>d;return!0};m.isDataTable=m.fnIsDataTable=function(a){var b=h(a).get(0),c=!1;h.each(m.settings,function(a,e){var f=e.nScrollHead?h("table",e.nScrollHead)[0]:null,g=e.nScrollFoot?h("table",e.nScrollFoot)[0]:null;if(e.nTable===b||f===b||g===b)c=!0});return c};m.tables=m.fnTables=function(a){var b=!1;h.isPlainObject(a)&&(b=a.api,a=a.visible);var c=h.map(m.settings,function(b){if(!a||
+a&&h(b.nTable).is(":visible"))return b.nTable});return b?new r(c):c};m.util={throttle:ua,escapeRegex:va};m.camelToHungarian=K;p("$()",function(a,b){var c=this.rows(b).nodes(),c=h(c);return h([].concat(c.filter(a).toArray(),c.find(a).toArray()))});h.each(["on","one","off"],function(a,b){p(b+"()",function(){var a=Array.prototype.slice.call(arguments);a[0].match(/\.dt\b/)||(a[0]+=".dt");var d=h(this.tables().nodes());d[b].apply(d,a);return this})});p("clear()",function(){return this.iterator("table",
+function(a){na(a)})});p("settings()",function(){return new r(this.context,this.context)});p("init()",function(){var a=this.context;return a.length?a[0].oInit:null});p("data()",function(){return this.iterator("table",function(a){return F(a.aoData,"_aData")}).flatten()});p("destroy()",function(a){a=a||!1;return this.iterator("table",function(b){var c=b.nTableWrapper.parentNode,d=b.oClasses,e=b.nTable,f=b.nTBody,g=b.nTHead,j=b.nTFoot,i=h(e),f=h(f),k=h(b.nTableWrapper),l=h.map(b.aoData,function(a){return a.nTr}),
+p;b.bDestroying=!0;u(b,"aoDestroyCallback","destroy",[b]);a||(new r(b)).columns().visible(!0);k.unbind(".DT").find(":not(tbody *)").unbind(".DT");h(D).unbind(".DT-"+b.sInstance);e!=g.parentNode&&(i.children("thead").detach(),i.append(g));j&&e!=j.parentNode&&(i.children("tfoot").detach(),i.append(j));b.aaSorting=[];b.aaSortingFixed=[];xa(b);h(l).removeClass(b.asStripeClasses.join(" "));h("th, td",g).removeClass(d.sSortable+" "+d.sSortableAsc+" "+d.sSortableDesc+" "+d.sSortableNone);b.bJUI&&(h("th span."+
+d.sSortIcon+", td span."+d.sSortIcon,g).detach(),h("th, td",g).each(function(){var a=h("div."+d.sSortJUIWrapper,this);h(this).append(a.contents());a.detach()}));f.children().detach();f.append(l);g=a?"remove":"detach";i[g]();k[g]();!a&&c&&(c.insertBefore(e,b.nTableReinsertBefore),i.css("width",b.sDestroyWidth).removeClass(d.sTable),(p=b.asDestroyStripes.length)&&f.children().each(function(a){h(this).addClass(b.asDestroyStripes[a%p])}));c=h.inArray(b,m.settings);-1!==c&&m.settings.splice(c,1)})});h.each(["column",
+"row","cell"],function(a,b){p(b+"s().every()",function(a){var d=this.selector.opts,e=this;return this.iterator(b,function(f,g,h,i,n){a.call(e[b](g,"cell"===b?h:d,"cell"===b?d:k),g,h,i,n)})})});p("i18n()",function(a,b,c){var d=this.context[0],a=Q(a)(d.oLanguage);a===k&&(a=b);c!==k&&h.isPlainObject(a)&&(a=a[c]!==k?a[c]:a._);return a.replace("%d",c)});m.version="1.10.11";m.settings=[];m.models={};m.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0};m.models.oRow={nTr:null,anCells:null,
+_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1};m.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null};m.defaults=
+{aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bJQueryUI:!1,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(a){return a.toString().replace(/\B(?=(\d{3})+(?!\d))/g,
+this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(a){try{return JSON.parse((-1===a.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+a.sInstance+"_"+location.pathname))}catch(b){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(a,b){try{(-1===a.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+a.sInstance+
+"_"+location.pathname,JSON.stringify(b))}catch(c){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",
+sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:h.extend({},m.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"};
+Y(m.defaults);m.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null};Y(m.defaults.column);m.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,
+bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],
+aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:k,oAjaxData:k,fnServerData:null,
+aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,bJUI:null,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==y(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==y(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var a=
+this._iDisplayLength,b=this._iDisplayStart,c=b+a,d=this.aiDisplay.length,e=this.oFeatures,f=e.bPaginate;return e.bServerSide?!1===f||-1===a?b+d:Math.min(b+a,this._iRecordsDisplay):!f||c>d||-1===a?d:c},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null};m.ext=v={buttons:{},classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},
+header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:m.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:m.version};h.extend(v,{afnFiltering:v.search,aTypes:v.type.detect,ofnSearch:v.type.search,oSort:v.type.order,afnSortData:v.order,aoFeatures:v.feature,oApi:v.internal,oStdClasses:v.classes,oPagination:v.pager});h.extend(m.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",
+sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",
+sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var Ea="",Ea="",H=Ea+"ui-state-default",ia=Ea+"css_right ui-icon ui-icon-",Xb=Ea+"fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix";h.extend(m.ext.oJUIClasses,
+m.ext.classes,{sPageButton:"fg-button ui-button "+H,sPageButtonActive:"ui-state-disabled",sPageButtonDisabled:"ui-state-disabled",sPaging:"dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi ui-buttonset-multi paging_",sSortAsc:H+" sorting_asc",sSortDesc:H+" sorting_desc",sSortable:H+" sorting",sSortableAsc:H+" sorting_asc_disabled",sSortableDesc:H+" sorting_desc_disabled",sSortableNone:H+" sorting_disabled",sSortJUIAsc:ia+"triangle-1-n",sSortJUIDesc:ia+"triangle-1-s",sSortJUI:ia+"carat-2-n-s",
+sSortJUIAscAllowed:ia+"carat-1-n",sSortJUIDescAllowed:ia+"carat-1-s",sSortJUIWrapper:"DataTables_sort_wrapper",sSortIcon:"DataTables_sort_icon",sScrollHead:"dataTables_scrollHead "+H,sScrollFoot:"dataTables_scrollFoot "+H,sHeaderTH:H,sFooterTH:H,sJUIHeader:Xb+" ui-corner-tl ui-corner-tr",sJUIFooter:Xb+" ui-corner-bl ui-corner-br"});var Mb=m.ext.pager;h.extend(Mb,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(a,b){return[Aa(a,
+b)]},simple_numbers:function(a,b){return["previous",Aa(a,b),"next"]},full_numbers:function(a,b){return["first","previous",Aa(a,b),"next","last"]},_numbers:Aa,numbers_length:7});h.extend(!0,m.ext.renderer,{pageButton:{_:function(a,b,c,d,e,f){var g=a.oClasses,j=a.oLanguage.oPaginate,i=a.oLanguage.oAria.paginate||{},k,l,m=0,p=function(b,d){var o,r,u,s,v=function(b){Ta(a,b.data.action,true)};o=0;for(r=d.length;o<r;o++){s=d[o];if(h.isArray(s)){u=h("<"+(s.DT_el||"div")+"/>").appendTo(b);p(u,s)}else{k=null;
+l="";switch(s){case "ellipsis":b.append('<span class="ellipsis">&#x2026;</span>');break;case "first":k=j.sFirst;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "previous":k=j.sPrevious;l=s+(e>0?"":" "+g.sPageButtonDisabled);break;case "next":k=j.sNext;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;case "last":k=j.sLast;l=s+(e<f-1?"":" "+g.sPageButtonDisabled);break;default:k=s+1;l=e===s?g.sPageButtonActive:""}if(k!==null){u=h("<a>",{"class":g.sPageButton+" "+l,"aria-controls":a.sTableId,"aria-label":i[s],
+"data-dt-idx":m,tabindex:a.iTabIndex,id:c===0&&typeof s==="string"?a.sTableId+"_"+s:null}).html(k).appendTo(b);Wa(u,{action:s},v);m++}}}},r;try{r=h(b).find(I.activeElement).data("dt-idx")}catch(o){}p(h(b).empty(),d);r&&h(b).find("[data-dt-idx="+r+"]").focus()}}});h.extend(m.ext.type.detect,[function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c)?"num"+c:null},function(a){if(a&&!(a instanceof Date)&&(!bc.test(a)||!cc.test(a)))return null;var b=Date.parse(a);return null!==b&&!isNaN(b)||M(a)?"date":
+null},function(a,b){var c=b.oLanguage.sDecimal;return Za(a,c,!0)?"num-fmt"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c)?"html-num"+c:null},function(a,b){var c=b.oLanguage.sDecimal;return Rb(a,c,!0)?"html-num-fmt"+c:null},function(a){return M(a)||"string"===typeof a&&-1!==a.indexOf("<")?"html":null}]);h.extend(m.ext.type.search,{html:function(a){return M(a)?a:"string"===typeof a?a.replace(Ob," ").replace(Ca,""):""},string:function(a){return M(a)?a:"string"===typeof a?a.replace(Ob,
+" "):a}});var Ba=function(a,b,c,d){if(0!==a&&(!a||"-"===a))return-Infinity;b&&(a=Qb(a,b));a.replace&&(c&&(a=a.replace(c,"")),d&&(a=a.replace(d,"")));return 1*a};h.extend(v.type.order,{"date-pre":function(a){return Date.parse(a)||0},"html-pre":function(a){return M(a)?"":a.replace?a.replace(/<.*?>/g,"").toLowerCase():a+""},"string-pre":function(a){return M(a)?"":"string"===typeof a?a.toLowerCase():!a.toString?"":a.toString()},"string-asc":function(a,b){return a<b?-1:a>b?1:0},"string-desc":function(a,
+b){return a<b?1:a>b?-1:0}});db("");h.extend(!0,m.ext.renderer,{header:{_:function(a,b,c,d){h(a.nTable).on("order.dt.DT",function(e,f,g,h){if(a===f){e=c.idx;b.removeClass(c.sSortingClass+" "+d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass)}})},jqueryui:function(a,b,c,d){h("<div/>").addClass(d.sSortJUIWrapper).append(b.contents()).append(h("<span/>").addClass(d.sSortIcon+" "+c.sSortingClassJUI)).appendTo(b);h(a.nTable).on("order.dt.DT",function(e,
+f,g,h){if(a===f){e=c.idx;b.removeClass(d.sSortAsc+" "+d.sSortDesc).addClass(h[e]=="asc"?d.sSortAsc:h[e]=="desc"?d.sSortDesc:c.sSortingClass);b.find("span."+d.sSortIcon).removeClass(d.sSortJUIAsc+" "+d.sSortJUIDesc+" "+d.sSortJUI+" "+d.sSortJUIAscAllowed+" "+d.sSortJUIDescAllowed).addClass(h[e]=="asc"?d.sSortJUIAsc:h[e]=="desc"?d.sSortJUIDesc:c.sSortingClassJUI)}})}}});var Yb=function(a){return"string"===typeof a?a.replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):a};m.render={number:function(a,
+b,c,d,e){return{display:function(f){if("number"!==typeof f&&"string"!==typeof f)return f;var g=0>f?"-":"",h=parseFloat(f);if(isNaN(h))return Yb(f);f=Math.abs(h);h=parseInt(f,10);f=c?b+(f-h).toFixed(c).substring(2):"";return g+(d||"")+h.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+f+(e||"")}}},text:function(){return{display:Yb}}};h.extend(m.ext.internal,{_fnExternApiFunc:Nb,_fnBuildAjax:ra,_fnAjaxUpdate:lb,_fnAjaxParameters:ub,_fnAjaxUpdateDraw:vb,_fnAjaxDataSrc:sa,_fnAddColumn:Ga,_fnColumnOptions:ja,
+_fnAdjustColumnSizing:U,_fnVisibleToColumnIndex:Z,_fnColumnIndexToVisible:$,_fnVisbleColumns:aa,_fnGetColumns:la,_fnColumnTypes:Ia,_fnApplyColumnDefs:ib,_fnHungarianMap:Y,_fnCamelToHungarian:K,_fnLanguageCompat:Fa,_fnBrowserDetect:gb,_fnAddData:N,_fnAddTr:ma,_fnNodeToDataIndex:function(a,b){return b._DT_RowIndex!==k?b._DT_RowIndex:null},_fnNodeToColumnIndex:function(a,b,c){return h.inArray(c,a.aoData[b].anCells)},_fnGetCellData:B,_fnSetCellData:jb,_fnSplitObjNotation:La,_fnGetObjectDataFn:Q,_fnSetObjectDataFn:R,
+_fnGetDataMaster:Ma,_fnClearTable:na,_fnDeleteIndex:oa,_fnInvalidate:ca,_fnGetRowElements:Ka,_fnCreateTr:Ja,_fnBuildHead:kb,_fnDrawHead:ea,_fnDraw:O,_fnReDraw:T,_fnAddOptionsHtml:nb,_fnDetectHeader:da,_fnGetUniqueThs:qa,_fnFeatureHtmlFilter:pb,_fnFilterComplete:fa,_fnFilterCustom:yb,_fnFilterColumn:xb,_fnFilter:wb,_fnFilterCreateSearch:Qa,_fnEscapeRegex:va,_fnFilterData:zb,_fnFeatureHtmlInfo:sb,_fnUpdateInfo:Cb,_fnInfoMacros:Db,_fnInitialise:ga,_fnInitComplete:ta,_fnLengthChange:Ra,_fnFeatureHtmlLength:ob,
+_fnFeatureHtmlPaginate:tb,_fnPageChange:Ta,_fnFeatureHtmlProcessing:qb,_fnProcessingDisplay:C,_fnFeatureHtmlTable:rb,_fnScrollDraw:ka,_fnApplyToChildren:J,_fnCalculateColumnWidths:Ha,_fnThrottle:ua,_fnConvertToWidth:Fb,_fnGetWidestNode:Gb,_fnGetMaxLenString:Hb,_fnStringToCss:x,_fnSortFlatten:W,_fnSort:mb,_fnSortAria:Jb,_fnSortListener:Va,_fnSortAttachListener:Oa,_fnSortingClasses:xa,_fnSortData:Ib,_fnSaveState:ya,_fnLoadState:Kb,_fnSettingsFromNode:za,_fnLog:L,_fnMap:E,_fnBindAction:Wa,_fnCallbackReg:z,
+_fnCallbackFire:u,_fnLengthOverflow:Sa,_fnRenderer:Pa,_fnDataSource:y,_fnRowAttributes:Na,_fnCalculateEnd:function(){}});h.fn.dataTable=m;m.$=h;h.fn.dataTableSettings=m.settings;h.fn.dataTableExt=m.ext;h.fn.DataTable=function(a){return h(this).dataTable(a).api()};h.each(m,function(a,b){h.fn.DataTable[a]=b});return h.fn.dataTable});


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/physLocationServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/physLocationServers/index.js b/traffic_portal/app/src/common/modules/table/physLocationServers/index.js
new file mode 100644
index 0000000..6049ea4
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/physLocationServers/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.physLocationServers', [])
+	.controller('TablePhysLocationServersController', require('./TablePhysLocationServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/physLocationServers/table.physLocationServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/physLocationServers/table.physLocationServers.tpl.html b/traffic_portal/app/src/common/modules/table/physLocationServers/table.physLocationServers.tpl.html
new file mode 100644
index 0000000..51dc0f3
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/physLocationServers/table.physLocationServers.tpl.html
@@ -0,0 +1,81 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/phys-locations')">Physical Locations</a></li>
+            <li><a ng-click="navigateToPath('/admin/phys-locations/' + physLocation.id)">{{::physLocation.name}}</a></li>
+            <li class="active">Servers</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="serversTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Update?</th>
+                <th>hostName</th>
+                <th>domainName</th>
+                <th>cdn</th>
+                <th>cachegroup</th>
+                <th>type</th>
+                <th>location</th>
+                <th>ipAddress</th>
+                <th>ip6Address</th>
+                <th>status</th>
+                <th>profile</th>
+                <th>iloIpAddress</th>
+                <th>iloIpGateway</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editServer(server.id)" ng-repeat="server in ::servers">
+                <td class="update-column">
+                    <i class="fa fa-flag" ng-if="server.updPending"></i>
+                    <i class="fa fa-ban" ng-if="!server.updPending"></i>
+                </td>
+                <td>{{::server.hostName}}</td>
+                <td>{{::server.domainName}}</td>
+                <td>{{::server.cdnName}}</td>
+                <td>{{::server.cachegroup}}</td>
+                <td>{{::server.type}}</td>
+                <td>{{::server.physLocation}}</td>
+                <td>{{::server.ipAddress}}</td>
+                <td>{{::server.ip6Address}}</td>
+                <td>
+                    <span ng-if="!isOffline(server.status)">{{::server.status}}</span>
+                    <span ng-if="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
+                </td>
+                <td>{{::server.profile}}</td>
+                <td>{{::server.iloIpAddress}}</td>
+                <td>{{::server.iloIpGateway}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/physLocations/TablePhysLocationsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/physLocations/TablePhysLocationsController.js b/traffic_portal/app/src/common/modules/table/physLocations/TablePhysLocationsController.js
new file mode 100644
index 0000000..9d6468b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/physLocations/TablePhysLocationsController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TablePhysLocationsController = function(physLocations, $scope, $state, locationUtils) {
+
+    $scope.physLocations = physLocations;
+
+    $scope.editPhysLocation = function(id) {
+        locationUtils.navigateToPath('/admin/phys-locations/' + id)
+    };
+
+    $scope.createPhysLocation = function() {
+        locationUtils.navigateToPath('/admin/phys-locations/new')
+    };
+
+    $scope.refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+    angular.element(document).ready(function () {
+        $('#physLocationsTable').dataTable({
+            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+            "iDisplayLength": 25,
+            "aaSorting": []
+        });
+    });
+
+};
+
+TablePhysLocationsController.$inject = ['physLocations', '$scope', '$state', 'locationUtils'];
+module.exports = TablePhysLocationsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/physLocations/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/physLocations/index.js b/traffic_portal/app/src/common/modules/table/physLocations/index.js
new file mode 100644
index 0000000..4b1a925
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/physLocations/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.physLocations', [])
+    .controller('TablePhysLocationsController', require('./TablePhysLocationsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/physLocations/table.physLocations.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/physLocations/table.physLocations.tpl.html b/traffic_portal/app/src/common/modules/table/physLocations/table.physLocations.tpl.html
new file mode 100644
index 0000000..8e4b1eb
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/physLocations/table.physLocations.tpl.html
@@ -0,0 +1,58 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Physical Locations</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Create Phys Location" ng-click="createPhysLocation()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="physLocationsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+                <th>shortName</th>
+                <th>address</th>
+                <th>city</th>
+                <th>state</th>
+                <th>region</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editPhysLocation(physLocation.id)" ng-repeat="physLocation in ::physLocations">
+                <td>{{::physLocation.name}}</td>
+                <td>{{::physLocation.shortName}}</td>
+                <td>{{::physLocation.address}}</td>
+                <td>{{::physLocation.city}}</td>
+                <td>{{::physLocation.state}}</td>
+                <td>{{::physLocation.region}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/profileDeliveryServices/TableProfileDeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/profileDeliveryServices/TableProfileDeliveryServicesController.js b/traffic_portal/app/src/common/modules/table/profileDeliveryServices/TableProfileDeliveryServicesController.js
new file mode 100644
index 0000000..79020c7
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/profileDeliveryServices/TableProfileDeliveryServicesController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableProfileDeliveryServicesController = function(profile, deliveryServices, $scope, $state, locationUtils) {
+
+	$scope.profile = profile;
+
+	$scope.deliveryServices = deliveryServices;
+
+	$scope.editDeliveryService = function(ds) {
+		locationUtils.navigateToPath('/configure/delivery-services/' + ds.id + '?type=' + ds.type);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#deliveryServicesTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableProfileDeliveryServicesController.$inject = ['profile', 'deliveryServices', '$scope', '$state', 'locationUtils'];
+module.exports = TableProfileDeliveryServicesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/profileDeliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/profileDeliveryServices/index.js b/traffic_portal/app/src/common/modules/table/profileDeliveryServices/index.js
new file mode 100644
index 0000000..963a67e
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/profileDeliveryServices/index.js
@@ -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.
+ */
+
+module.exports = angular.module('trafficPortal.table.profileDeliveryServices', [])
+	.controller('TableProfileDeliveryServicesController', require('./TableProfileDeliveryServicesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/profileDeliveryServices/table.profileDeliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/profileDeliveryServices/table.profileDeliveryServices.tpl.html b/traffic_portal/app/src/common/modules/table/profileDeliveryServices/table.profileDeliveryServices.tpl.html
new file mode 100644
index 0000000..8074d08
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/profileDeliveryServices/table.profileDeliveryServices.tpl.html
@@ -0,0 +1,74 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/profiles')">Profiles</a></li>
+            <li><a ng-click="navigateToPath('/admin/profiles/' + profile.id)">{{::profile.name}}</a></li>
+            <li class="active">Delivery Services</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="deliveryServicesTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>xmlId</th>
+                <th>orgServerFqdn</th>
+                <th>cdn</th>
+                <th>profile</th>
+                <th>ccrDnsTtl</th>
+                <th>active</th>
+                <th>type</th>
+                <th>dscp</th>
+                <th>signed</th>
+                <th>qstringIgnore</th>
+                <th>geoLimit</th>
+                <th>protocol</th>
+                <th>ipv6RoutingEnabled</th>
+                <th>rangeRequestHandling</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editDeliveryService(deliveryService)" ng-repeat="deliveryService in ::deliveryServices">
+                <td>{{::deliveryService.xmlId}}</td>
+                <td>{{::deliveryService.orgServerFqdn}}</td>
+                <td>{{::deliveryService.cdnName}}</td>
+                <td>{{::deliveryService.profileName}}</td>
+                <td>{{::deliveryService.ccrDnsTtl}}</td>
+                <td>{{::deliveryService.active}}</td>
+                <td>{{::deliveryService.type}}</td>
+                <td>{{::deliveryService.dscp}}</td>
+                <td>{{::deliveryService.signed}}</td>
+                <td>{{::deliveryService.qstringIgnore}}</td>
+                <td>{{::deliveryService.geoLimit}}</td>
+                <td>{{::deliveryService.protocol}}</td>
+                <td>{{::deliveryService.ipv6RoutingEnabled}}</td>
+                <td>{{::deliveryService.rangeRequestHandling}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/profileParameters/TableProfileParametersController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/profileParameters/TableProfileParametersController.js b/traffic_portal/app/src/common/modules/table/profileParameters/TableProfileParametersController.js
new file mode 100644
index 0000000..8486f7c
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/profileParameters/TableProfileParametersController.js
@@ -0,0 +1,82 @@
+/*
+ * 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 TableProfileParametersController = function(profile, profileParameters, $scope, $state, $uibModal, locationUtils, profileParameterService) {
+
+	$scope.profile = profile;
+
+	$scope.profileParameters = profileParameters;
+
+	$scope.removeParameter = function(paramId) {
+		profileParameterService.unlinkProfileParameter(profile.id, paramId)
+			.then(
+				function() {
+					$scope.refresh();
+				}
+			);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.selectParams = function() {
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/table/profileParameters/table.profileParamsUnassigned.tpl.html',
+			controller: 'TableProfileParamsUnassignedController',
+			size: 'lg',
+			resolve: {
+				profile: function(parameterService) {
+					return profile;
+				},
+				parameters: function(parameterService) {
+					return parameterService.getProfileUnassignedParams(profile.id);
+				}
+			}
+		});
+		modalInstance.result.then(function(selectedParams) {
+			var massagedArray = [];
+			for (i = 0; i < selectedParams.length; i++) {
+				massagedArray.push( { profileId: profile.id, parameterId: selectedParams[i] } );
+			}
+			profileParameterService.linkProfileParameters(massagedArray)
+				.then(
+					function() {
+						$scope.refresh();
+					}
+				);
+		}, function () {
+			// do nothing
+		});
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#profileParametersTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableProfileParametersController.$inject = ['profile', 'profileParameters', '$scope', '$state', '$uibModal', 'locationUtils', 'profileParameterService'];
+module.exports = TableProfileParametersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/profileParameters/TableProfileParamsUnassignedController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/profileParameters/TableProfileParamsUnassignedController.js b/traffic_portal/app/src/common/modules/table/profileParameters/TableProfileParamsUnassignedController.js
new file mode 100644
index 0000000..23cefcb
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/profileParameters/TableProfileParamsUnassignedController.js
@@ -0,0 +1,69 @@
+/*
+ * 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 TableProfileParamsUnassignedController = function(profile, parameters, $scope, $uibModalInstance) {
+
+	var selectedParams = [];
+
+	$scope.profile = profile;
+
+	$scope.unassignedParams = parameters;
+
+	var addParam = function(paramId) {
+		if (_.indexOf(selectedParams, paramId) == -1) {
+			selectedParams.push(paramId);
+		}
+	};
+
+	var removeParam = function(paramId) {
+		selectedParams = _.without(selectedParams, paramId);
+	};
+
+	$scope.updateParams = function($event, paramId) {
+		var checkbox = $event.target;
+		if (checkbox.checked) {
+			addParam(paramId);
+		} else {
+			removeParam(paramId);
+		}
+	};
+
+	$scope.submit = function() {
+		$uibModalInstance.close(selectedParams);
+	};
+
+	$scope.cancel = function () {
+		$uibModalInstance.dismiss('cancel');
+	};
+
+	angular.element(document).ready(function () {
+		$('#profileParamsUnassignedTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"order": [[ 1, 'asc' ]],
+			"columnDefs": [
+				{ "width": "5%", "targets": 0 }
+			]
+		});
+	});
+
+};
+
+TableProfileParamsUnassignedController.$inject = ['profile', 'parameters', '$scope', '$uibModalInstance'];
+module.exports = TableProfileParamsUnassignedController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/profileParameters/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/profileParameters/index.js b/traffic_portal/app/src/common/modules/table/profileParameters/index.js
new file mode 100644
index 0000000..f4fb844
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/profileParameters/index.js
@@ -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.
+ */
+
+module.exports = angular.module('trafficPortal.table.profileParameters', [])
+	.controller('TableProfileParametersController', require('./TableProfileParametersController'))
+	.controller('TableProfileParamsUnassignedController', require('./TableProfileParamsUnassignedController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/profileParameters/table.profileParameters.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/profileParameters/table.profileParameters.tpl.html b/traffic_portal/app/src/common/modules/table/profileParameters/table.profileParameters.tpl.html
new file mode 100644
index 0000000..24d1693
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/profileParameters/table.profileParameters.tpl.html
@@ -0,0 +1,57 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/profiles')">Profiles</a></li>
+            <li><a ng-click="navigateToPath('/admin/profiles/' + profile.id)">{{::profile.name}}</a></li>
+            <li class="active">Parameters</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Link Parameters to Profile" ng-click="selectParams()"><i class="fa fa-link"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="profileParametersTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>id</th>
+                <th>name</th>
+                <th>configFile</th>
+                <th>value</th>
+                <th></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="parameter in ::profileParameters">
+                <td>{{::parameter.id}}</td>
+                <td>{{::parameter.name}}</td>
+                <td>{{::parameter.configFile}}</td>
+                <td>{{::parameter.value}}</td>
+                <td><button type="button" class="btn btn-link" title="Unlink Parameter from Profile" ng-click="removeParameter(parameter.id)"><i class="fa fa-chain-broken"></i></button></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/profileParameters/table.profileParamsUnassigned.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/profileParameters/table.profileParamsUnassigned.tpl.html b/traffic_portal/app/src/common/modules/table/profileParameters/table.profileParamsUnassigned.tpl.html
new file mode 100644
index 0000000..34b2bdf
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/profileParameters/table.profileParamsUnassigned.tpl.html
@@ -0,0 +1,49 @@
+<!--
+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="modal-header">
+    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+    <h3 class="modal-title">Link Parameters to {{::profile.name}}</h3>
+</div>
+<div class="modal-body">
+    <table id="profileParamsUnassignedTable" class="table responsive-utilities jambo_table" style="table-layout:fixed; width:100%;">
+        <thead>
+        <tr class="headings">
+            <th></th>
+            <th>name</th>
+            <th>configFile</th>
+            <th>value</th>
+        </tr>
+        </thead>
+        <tbody>
+        <tr ng-repeat="parameter in ::unassignedParams">
+            <td><input type="checkbox" ng-click="updateParams($event, parameter.id)"></td>
+            <td>{{::parameter.name}}</td>
+            <td>{{::parameter.configFile}}</td>
+            <td>{{::parameter.value}}</td>
+        </tr>
+        </tbody>
+    </table>
+</div>
+<div class="modal-footer">
+    <button class="btn btn-link" ng-click="cancel()">cancel</button>
+    <button class="btn btn-primary" ng-click="submit()">Submit</button>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/profileServers/TableProfileServersController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/profileServers/TableProfileServersController.js b/traffic_portal/app/src/common/modules/table/profileServers/TableProfileServersController.js
new file mode 100644
index 0000000..7d4f5d5
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/profileServers/TableProfileServersController.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.
+ */
+
+var TableProfileServersController = function(profile, servers, $scope, $state, locationUtils, serverUtils) {
+
+	$scope.profile = profile;
+
+	$scope.servers = servers;
+
+	$scope.editServer = function(id) {
+		locationUtils.navigateToPath('/configure/servers/' + id);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.isOffline = serverUtils.isOffline;
+
+	$scope.offlineReason = serverUtils.offlineReason;
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#serversTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableProfileServersController.$inject = ['profile', 'servers', '$scope', '$state', 'locationUtils', 'serverUtils'];
+module.exports = TableProfileServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/profileServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/profileServers/index.js b/traffic_portal/app/src/common/modules/table/profileServers/index.js
new file mode 100644
index 0000000..ba238c1
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/profileServers/index.js
@@ -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.
+ */
+
+module.exports = angular.module('trafficPortal.table.profileServers', [])
+	.controller('TableProfileServersController', require('./TableProfileServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/profileServers/table.profileServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/profileServers/table.profileServers.tpl.html b/traffic_portal/app/src/common/modules/table/profileServers/table.profileServers.tpl.html
new file mode 100644
index 0000000..68d5d68
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/profileServers/table.profileServers.tpl.html
@@ -0,0 +1,78 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/profiles')">Profiles</a></li>
+            <li><a ng-click="navigateToPath('/admin/profiles/' + profile.id)">{{::profile.name}}</a></li>
+            <li class="active">Servers</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="serversTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Update?</th>
+                <th>hostName</th>
+                <th>domainName</th>
+                <th>cdn</th>
+                <th>cachegroup</th>
+                <th>type</th>
+                <th>location</th>
+                <th>ipAddress</th>
+                <th>ip6Address</th>
+                <th>status</th>
+                <th>profile</th>
+                <th>iloIpAddress</th>
+                <th>iloIpGateway</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editServer(server.id)" ng-repeat="server in ::servers" ng-class="::{'active': server.updPending}">
+                <td class="update-column">
+                    <i class="fa fa-flag" ng-if="server.updPending"></i>
+                    <i class="fa fa-ban" ng-if="!server.updPending"></i>
+                </td>
+                <td>{{::server.hostName}}</td>
+                <td>{{::server.domainName}}</td>
+                <td>{{::server.cdnName}}</td>
+                <td>{{::server.cachegroup}}</td>
+                <td>{{::server.type}}</td>
+                <td>{{::server.physLocation}}</td>
+                <td>{{::server.ipAddress}}</td>
+                <td>{{::server.ip6Address}}</td>
+                <td>
+                    <span ng-if="!isOffline(server.status)">{{::server.status}}</span>
+                    <span ng-if="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
+                </td>
+                <td>{{::server.profile}}</td>
+                <td>{{::server.iloIpAddress}}</td>
+                <td>{{::server.iloIpGateway}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/profiles/TableProfilesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/profiles/TableProfilesController.js b/traffic_portal/app/src/common/modules/table/profiles/TableProfilesController.js
new file mode 100644
index 0000000..5a8383b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/profiles/TableProfilesController.js
@@ -0,0 +1,55 @@
+/*
+ * 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 TableProfilesController = function(profiles, $scope, $state, locationUtils) {
+
+    $scope.profiles = profiles;
+
+    $scope.editProfile = function(id) {
+        locationUtils.navigateToPath('/admin/profiles/' + id);
+    };
+
+    $scope.createProfile = function() {
+        locationUtils.navigateToPath('/admin/profiles/new');
+    };
+
+    $scope.importProfile = function() {
+        alert('not hooked up yet: importProfile');
+    };
+
+    $scope.compareProfiles = function() {
+        alert('not hooked up yet: compareProfiles');
+    };
+
+    $scope.refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+    angular.element(document).ready(function () {
+        $('#profilesTable').dataTable({
+            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+            "iDisplayLength": 25,
+            "aaSorting": []
+        });
+    });
+
+};
+
+TableProfilesController.$inject = ['profiles', '$scope', '$state', 'locationUtils'];
+module.exports = TableProfilesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/profiles/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/profiles/index.js b/traffic_portal/app/src/common/modules/table/profiles/index.js
new file mode 100644
index 0000000..1761ec7
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/profiles/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.profiles', [])
+    .controller('TableProfilesController', require('./TableProfilesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/profiles/table.profiles.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/profiles/table.profiles.tpl.html b/traffic_portal/app/src/common/modules/table/profiles/table.profiles.tpl.html
new file mode 100644
index 0000000..85d66cf
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/profiles/table.profiles.tpl.html
@@ -0,0 +1,63 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Profiles</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Create Profile" ng-click="createProfile()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="importProfile()">Import Profile</a></li>
+                    <li role="menuitem"><a ng-click="compareProfiles()">Compare Profiles</a></li>
+                </ul>
+            </div>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="profilesTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+                <th>type</th>
+                <th>description</th>
+                <th>cdn</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editProfile(profile.id)" ng-repeat="profile in ::profiles">
+                <td>{{::profile.name}}</td>
+                <td>{{::profile.type}}</td>
+                <td>{{::profile.description}}</td>
+                <td>{{::profile.cdnName}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/regionPhysLocations/TableRegionPhysLocationsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/regionPhysLocations/TableRegionPhysLocationsController.js b/traffic_portal/app/src/common/modules/table/regionPhysLocations/TableRegionPhysLocationsController.js
new file mode 100644
index 0000000..aee580a
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/regionPhysLocations/TableRegionPhysLocationsController.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.
+ */
+
+var TableRegionPhysLocationsController = function(region, physLocations, $scope, $state, locationUtils) {
+
+	$scope.region = region;
+
+	$scope.physLocations = physLocations;
+
+	$scope.editPhysLocation = function(id) {
+		locationUtils.navigateToPath('/admin/phys-locations/' + id)
+	};
+
+	$scope.createPhysLocation = function() {
+		locationUtils.navigateToPath('/admin/phys-locations/new')
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#physLocationsTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableRegionPhysLocationsController.$inject = ['region', 'physLocations', '$scope', '$state', 'locationUtils'];
+module.exports = TableRegionPhysLocationsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/regionPhysLocations/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/regionPhysLocations/index.js b/traffic_portal/app/src/common/modules/table/regionPhysLocations/index.js
new file mode 100644
index 0000000..e55b784
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/regionPhysLocations/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.regionPhysLocations', [])
+	.controller('TableRegionPhysLocationsController', require('./TableRegionPhysLocationsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/regionPhysLocations/table.regionPhysLocations.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/regionPhysLocations/table.regionPhysLocations.tpl.html b/traffic_portal/app/src/common/modules/table/regionPhysLocations/table.regionPhysLocations.tpl.html
new file mode 100644
index 0000000..5e2d530
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/regionPhysLocations/table.regionPhysLocations.tpl.html
@@ -0,0 +1,59 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/regions')">Regions</a></li>
+            <li><a ng-click="navigateToPath('/admin/regions/' + region.id)">{{::region.name}}</a></li>
+            <li class="active">Physical Locations</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="physLocationsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+                <th>shortName</th>
+                <th>address</th>
+                <th>city</th>
+                <th>state</th>
+                <th>region</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editPhysLocation(physLocation.id)" ng-repeat="physLocation in ::physLocations">
+                <td>{{::physLocation.name}}</td>
+                <td>{{::physLocation.shortName}}</td>
+                <td>{{::physLocation.address}}</td>
+                <td>{{::physLocation.city}}</td>
+                <td>{{::physLocation.state}}</td>
+                <td>{{::physLocation.region}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/regions/TableRegionsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/regions/TableRegionsController.js b/traffic_portal/app/src/common/modules/table/regions/TableRegionsController.js
new file mode 100644
index 0000000..3eed487
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/regions/TableRegionsController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableRegionsController = function(regions, $scope, $state, locationUtils) {
+
+    $scope.regions = regions;
+
+    $scope.editRegion = function(id) {
+        locationUtils.navigateToPath('/admin/regions/' + id);
+    };
+
+    $scope.createRegion = function() {
+        locationUtils.navigateToPath('/admin/regions/new');
+    };
+
+    $scope.refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+    angular.element(document).ready(function () {
+        $('#regionsTable').dataTable({
+            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+            "iDisplayLength": 25,
+            "aaSorting": []
+        });
+    });
+
+};
+
+TableRegionsController.$inject = ['regions', '$scope', '$state', 'locationUtils'];
+module.exports = TableRegionsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/regions/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/regions/index.js b/traffic_portal/app/src/common/modules/table/regions/index.js
new file mode 100644
index 0000000..abd62e2
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/regions/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.regions', [])
+    .controller('TableRegionsController', require('./TableRegionsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/regions/table.regions.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/regions/table.regions.tpl.html b/traffic_portal/app/src/common/modules/table/regions/table.regions.tpl.html
new file mode 100644
index 0000000..505972f
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/regions/table.regions.tpl.html
@@ -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.
+-->
+
+<div class="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Regions</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Create Region" ng-click="createRegion()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="regionsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>name</th>
+                <th>division</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editRegion(region.id)" ng-repeat="region in ::regions">
+                <td>{{::region.name}}</td>
+                <td>{{::region.divisionName}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/serverDeliveryServices/TableServerDeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/serverDeliveryServices/TableServerDeliveryServicesController.js b/traffic_portal/app/src/common/modules/table/serverDeliveryServices/TableServerDeliveryServicesController.js
new file mode 100644
index 0000000..f418ac6
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/serverDeliveryServices/TableServerDeliveryServicesController.js
@@ -0,0 +1,60 @@
+/*
+ * 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 TableServerDeliveryServicesController = function(server, serverDeliveryServices, $scope, $state, locationUtils, deliveryServiceService) {
+
+	$scope.server = server;
+
+	$scope.serverDeliveryServices = serverDeliveryServices;
+
+	$scope.cloneDsAssignments = function() {
+		alert('not hooked up yet: cloneDsAssignments');
+	};
+
+	$scope.addDeliveryService = function() {
+		alert('not hooked up yet: addDeliveryService to server');
+	};
+
+	$scope.removeDeliveryService = function(dsId, serverId) {
+		deliveryServiceService.deleteDeliveryServiceServer(dsId, serverId)
+			.then(
+				function() {
+					$scope.refresh();
+				}
+			);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#deliveryServicesTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableServerDeliveryServicesController.$inject = ['server', 'serverDeliveryServices', '$scope', '$state', 'locationUtils', 'deliveryServiceService'];
+module.exports = TableServerDeliveryServicesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/serverDeliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/serverDeliveryServices/index.js b/traffic_portal/app/src/common/modules/table/serverDeliveryServices/index.js
new file mode 100644
index 0000000..14a13e2
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/serverDeliveryServices/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.serverDeliveryServices', [])
+	.controller('TableServerDeliveryServicesController', require('./TableServerDeliveryServicesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/serverDeliveryServices/table.serverDeliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/serverDeliveryServices/table.serverDeliveryServices.tpl.html b/traffic_portal/app/src/common/modules/table/serverDeliveryServices/table.serverDeliveryServices.tpl.html
new file mode 100644
index 0000000..b01962e
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/serverDeliveryServices/table.serverDeliveryServices.tpl.html
@@ -0,0 +1,78 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/servers')">Servers</a></li>
+            <li><a ng-click="navigateToPath('/configure/servers/' + server.id)">{{::server.hostName}}</a></li>
+            <li class="active">Delivery Services</li>
+        </ol>
+        <div class="pull-right" role="group">
+            <button class="btn btn-primary" title="Link Delivery Services to Server" ng-click="addDeliveryService()"><i class="fa fa-link"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li><a ng-click="cloneDsAssignments()">Clone Delivery Service Assignments</a></li>
+                </ul>
+            </div>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="deliveryServicesTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>xmlId</th>
+                <th>orgServerFqdn</th>
+                <th>active</th>
+                <th>type</th>
+                <th>protocol</th>
+                <th>cdn</th>
+                <th>ipv6RoutingEnabled</th>
+                <th>dscp</th>
+                <th>signed</th>
+                <th>qstringIgnore</th>
+                <th></th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-repeat="deliveryService in ::serverDeliveryServices">
+                <td>{{::deliveryService.xmlId}}</td>
+                <td>{{::deliveryService.orgServerFqdn}}</td>
+                <td>{{::deliveryService.active}}</td>
+                <td>{{::deliveryService.type}}</td>
+                <td>{{::deliveryService.protocol}}</td>
+                <td>{{::deliveryService.cdnName}}</td>
+                <td>{{::deliveryService.ipv6RoutingEnabled}}</td>
+                <td>{{::deliveryService.dscp}}</td>
+                <td>{{::deliveryService.signed}}</td>
+                <td>{{::deliveryService.qstringIgnore}}</td>
+                <td><button type="button" class="btn btn-link" title="Unlink Delivery Service from Server" ng-click="removeDeliveryService(deliveryService.id, server.id)"><i class="fa fa-chain-broken"></i></button></td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/servers/TableServersController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/servers/TableServersController.js b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js
new file mode 100644
index 0000000..93b6503
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/servers/TableServersController.js
@@ -0,0 +1,124 @@
+/*
+ * 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 TableServersController = function(servers, $scope, $state, $uibModal, locationUtils, serverUtils, cdnService) {
+
+    $scope.servers = servers;
+
+    var queueServerUpdates = function(cdnId) {
+        cdnService.queueServerUpdates(cdnId)
+            .then(
+                function() {
+                    $scope.refresh();
+                }
+            );
+    };
+
+    var clearServerUpdates = function(cdnId) {
+        cdnService.clearServerUpdates(cdnId)
+            .then(
+                function() {
+                    $scope.refresh();
+                }
+            );
+    };
+
+    $scope.editServer = function(id) {
+        locationUtils.navigateToPath('/configure/servers/' + id);
+    };
+
+    $scope.createServer = function() {
+        locationUtils.navigateToPath('/configure/servers/new');
+    };
+
+    $scope.confirmQueueServerUpdates = function() {
+        var params = {
+            title: 'Queue Server Updates',
+            message: "Please select a CDN"
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+            controller: 'DialogSelectController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                },
+                collection: function(cdnService) {
+                    return cdnService.getCDNs();
+                }
+            }
+        });
+        modalInstance.result.then(function(cdn) {
+            queueServerUpdates(cdn.id);
+        }, function () {
+            // do nothing
+        });
+    };
+
+    $scope.confirmClearServerUpdates = function() {
+        var params = {
+            title: 'Clear Server Updates',
+            message: "Please select a CDN"
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+            controller: 'DialogSelectController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                },
+                collection: function(cdnService) {
+                    return cdnService.getCDNs();
+                }
+            }
+        });
+        modalInstance.result.then(function(cdn) {
+            clearServerUpdates(cdn.id);
+        }, function () {
+            // do nothing
+        });
+    };
+
+
+    $scope.uploadServerCSV = function() {
+        alert('not hooked up yet: uploadServerCSV');
+    };
+
+    $scope.refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+    $scope.isOffline = serverUtils.isOffline;
+
+    $scope.offlineReason = serverUtils.offlineReason;
+
+    angular.element(document).ready(function () {
+        $('#serversTable').dataTable({
+            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+            "iDisplayLength": 25,
+            "aaSorting": []
+        });
+    });
+
+};
+
+TableServersController.$inject = ['servers', '$scope', '$state', '$uibModal', 'locationUtils', 'serverUtils', 'cdnService'];
+module.exports = TableServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/servers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/servers/index.js b/traffic_portal/app/src/common/modules/table/servers/index.js
new file mode 100644
index 0000000..f8267cb
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/servers/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.servers', [])
+    .controller('TableServersController', require('./TableServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html
new file mode 100644
index 0000000..8dabadb
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/servers/table.servers.tpl.html
@@ -0,0 +1,86 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">Servers</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-primary" title="Create Server" ng-click="createServer()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="confirmQueueServerUpdates()">Queue Server Updates</a></li>
+                    <li role="menuitem"><a ng-click="confirmClearServerUpdates()">Clear Server Updates</a></li>
+                    <li class="divider"></li>
+                    <li role="menuitem"><a ng-click="uploadServerCSV()">Upload Bulk CSV</a></li>
+                </ul>
+            </div>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="serversTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Update?</th>
+                <th>hostName</th>
+                <th>domainName</th>
+                <th>ipAddress</th>
+                <th>ip6Address</th>
+                <th>status</th>
+                <th>type</th>
+                <th>profile</th>
+                <th>cdn</th>
+                <th>cachegroup</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editServer(server.id)" ng-repeat="server in ::servers" ng-class="::{'active': server.updPending}">
+                <td class="update-column">
+                    <i class="fa fa-flag" ng-if="server.updPending"></i>
+                    <i class="fa fa-ban" ng-if="!server.updPending"></i>
+                </td>
+                <td>{{::server.hostName}}</td>
+                <td>{{::server.domainName}}</td>
+                <td>{{::server.ipAddress}}</td>
+                <td>{{::server.ip6Address}}</td>
+                <td>
+                    <span ng-if="!isOffline(server.status)">{{::server.status}}</span>
+                    <span ng-if="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
+                </td>
+                <td>{{::server.type}}</td>
+                <td>{{::server.profile}}</td>
+                <td>{{::server.cdnName}}</td>
+                <td>{{::server.cachegroup}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/statusServers/TableStatusServersController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/statusServers/TableStatusServersController.js b/traffic_portal/app/src/common/modules/table/statusServers/TableStatusServersController.js
new file mode 100644
index 0000000..4aafa0a
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/statusServers/TableStatusServersController.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.
+ */
+
+var TableStatusServersController = function(status, servers, $scope, $state, locationUtils, serverUtils) {
+
+	$scope.status = status;
+
+	$scope.servers = servers;
+
+	$scope.editServer = function(id) {
+		locationUtils.navigateToPath('/configure/servers/' + id);
+	};
+
+	$scope.refresh = function() {
+		$state.reload(); // reloads all the resolves for the view
+	};
+
+	$scope.isOffline = serverUtils.isOffline;
+
+	$scope.offlineReason = serverUtils.offlineReason;
+
+	$scope.navigateToPath = locationUtils.navigateToPath;
+
+	angular.element(document).ready(function () {
+		$('#serversTable').dataTable({
+			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+			"iDisplayLength": 25,
+			"aaSorting": []
+		});
+	});
+
+};
+
+TableStatusServersController.$inject = ['status', 'servers', '$scope', '$state', 'locationUtils', 'serverUtils'];
+module.exports = TableStatusServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/statusServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/statusServers/index.js b/traffic_portal/app/src/common/modules/table/statusServers/index.js
new file mode 100644
index 0000000..80ec361
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/statusServers/index.js
@@ -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.
+ */
+
+module.exports = angular.module('trafficPortal.table.statusServers', [])
+	.controller('TableStatusServersController', require('./TableStatusServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/statusServers/table.statusServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/statusServers/table.statusServers.tpl.html b/traffic_portal/app/src/common/modules/table/statusServers/table.statusServers.tpl.html
new file mode 100644
index 0000000..bc7f718
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/statusServers/table.statusServers.tpl.html
@@ -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.
+-->
+
+<div class="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/statuses')">Statuses</a></li>
+            <li><a ng-click="navigateToPath('/admin/statuses/' + status.id)">{{::status.name}}</a></li>
+            <li class="active">Servers</li>
+        </ol>
+        <div class="pull-right">
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="serversTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>Update?</th>
+                <th>hostName</th>
+                <th>domainName</th>
+                <th>ipAddress</th>
+                <th>ip6Address</th>
+                <th>status</th>
+                <th>type</th>
+                <th>profile</th>
+                <th>cdn</th>
+                <th>cachegroup</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editServer(server.id)" ng-repeat="server in ::servers" ng-class="::{'active': server.updPending}">
+                <td class="update-column">
+                    <i class="fa fa-flag" ng-if="server.updPending"></i>
+                    <i class="fa fa-ban" ng-if="!server.updPending"></i>
+                </td>
+                <td>{{::server.hostName}}</td>
+                <td>{{::server.domainName}}</td>
+                <td>{{::server.ipAddress}}</td>
+                <td>{{::server.ip6Address}}</td>
+                <td>
+                    <span ng-show="!isOffline(server.status)">{{::server.status}}</span>
+                    <span ng-show="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
+                </td>
+                <td>{{::server.type}}</td>
+                <td>{{::server.profile}}</td>
+                <td>{{::server.cdnName}}</td>
+                <td>{{::server.cachegroup}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParamsUnassignedController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParamsUnassignedController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParamsUnassignedController.js
deleted file mode 100644
index d7f0c9c..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/TableCacheGroupParamsUnassignedController.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableProfileParamsUnassignedController = function(cg, parameters, $scope, $uibModalInstance) {
-
-	var selectedParams = [];
-
-	$scope.cg = cg;
-
-	$scope.unassignedParams = parameters;
-
-	var addParam = function(paramId) {
-		if (_.indexOf(selectedParams, paramId) == -1) {
-			selectedParams.push(paramId);
-		}
-	};
-
-	var removeParam = function(paramId) {
-		selectedParams = _.without(selectedParams, paramId);
-	};
-
-	$scope.updateParams = function($event, paramId) {
-		var checkbox = $event.target;
-		if (checkbox.checked) {
-			addParam(paramId);
-		} else {
-			removeParam(paramId);
-		}
-	};
-
-	$scope.submit = function() {
-		$uibModalInstance.close(selectedParams);
-	};
-
-	$scope.cancel = function () {
-		$uibModalInstance.dismiss('cancel');
-	};
-
-	angular.element(document).ready(function () {
-		$('#cgParamsUnassignedTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"order": [[ 1, 'asc' ]],
-			"columnDefs": [
-				{ "width": "5%", "targets": 0 }
-			]
-		});
-	});
-
-};
-
-TableProfileParamsUnassignedController.$inject = ['cg', 'parameters', '$scope', '$uibModalInstance'];
-module.exports = TableProfileParamsUnassignedController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/index.js
deleted file mode 100644
index 5069cef..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.cacheGroupParameters', [])
-	.controller('TableCacheGroupParametersController', require('./TableCacheGroupParametersController'))
-	.controller('TableCacheGroupParamsUnassignedController', require('./TableCacheGroupParamsUnassignedController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParameters.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParameters.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParameters.tpl.html
deleted file mode 100644
index 04feb92..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParameters.tpl.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/cache-groups')">Cache Groups</a></li>
-            <li><a ng-click="navigateToPath('/configure/cache-groups/' + cacheGroup.id)">{{::cacheGroup.name}}</a></li>
-            <li class="active">Parameters</li>
-        </ol>
-        <div class="pull-right" role="group" ng-show="!settings.isNew">
-            <button class="btn btn-primary" title="Link Parameters to Cache Group" ng-click="selectParams()"><i class="fa fa-link"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="parametersTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>name</th>
-                <th>configFile</th>
-                <th>value</th>
-                <th></th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-repeat="parameter in ::cacheGroupParameters">
-                <td>{{::parameter.name}}</td>
-                <td>{{::parameter.configFile}}</td>
-                <td>{{::parameter.value}}</td>
-                <td><button type="button" class="btn btn-link" title="Unlink Parameter from Cache Group" ng-click="removeParameter(parameter.id)"><i class="fa fa-chain-broken"></i></button></td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParamsUnassigned.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParamsUnassigned.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParamsUnassigned.tpl.html
deleted file mode 100644
index 05ac1ed..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupParameters/table.cacheGroupParamsUnassigned.tpl.html
+++ /dev/null
@@ -1,49 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-
-
-<div class="modal-header">
-    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-    <h3 class="modal-title">Link Parameters to {{::cg.name}}</h3>
-</div>
-<div class="modal-body">
-    <table id="cgParamsUnassignedTable" class="table responsive-utilities jambo_table" style="table-layout:fixed; width:100%;">
-        <thead>
-        <tr class="headings">
-            <th></th>
-            <th>name</th>
-            <th>configFile</th>
-            <th>value</th>
-        </tr>
-        </thead>
-        <tbody>
-        <tr ng-repeat="parameter in ::unassignedParams">
-            <td><input type="checkbox" ng-click="updateParams($event, parameter.id)"></td>
-            <td>{{::parameter.name}}</td>
-            <td>{{::parameter.configFile}}</td>
-            <td>{{::parameter.value}}</td>
-        </tr>
-        </tbody>
-    </table>
-</div>
-<div class="modal-footer">
-    <button class="btn btn-link" ng-click="cancel()">cancel</button>
-    <button class="btn btn-primary" ng-click="submit()">Submit</button>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js
deleted file mode 100644
index 26c0198..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/TableCacheGroupServersController.js
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableCacheGroupsServersController = function(cacheGroup, servers, $scope, $state, $uibModal, cacheGroupService, locationUtils, serverUtils) {
-
-	$scope.cacheGroup = cacheGroup;
-
-	$scope.servers = servers;
-
-	var queueServerUpdates = function(cacheGroup, cdnId) {
-		cacheGroupService.queueServerUpdates(cacheGroup.id, cdnId)
-			.then(
-				function() {
-					$scope.refresh();
-				}
-			);
-	};
-
-	var clearServerUpdates = function(cacheGroup, cdnId) {
-		cacheGroupService.clearServerUpdates(cacheGroup.id, cdnId)
-			.then(
-				function() {
-					$scope.refresh();
-				}
-			);
-	};
-
-	$scope.editServer = function(id) {
-		locationUtils.navigateToPath('/configure/servers/' + id);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.confirmQueueServerUpdates = function(cacheGroup) {
-		var params = {
-			title: 'Queue Server Updates: ' + cacheGroup.name,
-			message: "Please select a CDN"
-		};
-		var modalInstance = $uibModal.open({
-			templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
-			controller: 'DialogSelectController',
-			size: 'md',
-			resolve: {
-				params: function () {
-					return params;
-				},
-				collection: function(cdnService) {
-					return cdnService.getCDNs();
-				}
-			}
-		});
-		modalInstance.result.then(function(cdn) {
-			queueServerUpdates(cacheGroup, cdn.id);
-		}, function () {
-			// do nothing
-		});
-	};
-
-	$scope.confirmClearServerUpdates = function(cacheGroup) {
-		var params = {
-			title: 'Clear Server Updates: ' + cacheGroup.name,
-			message: "Please select a CDN"
-		};
-		var modalInstance = $uibModal.open({
-			templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
-			controller: 'DialogSelectController',
-			size: 'md',
-			resolve: {
-				params: function () {
-					return params;
-				},
-				collection: function(cdnService) {
-					return cdnService.getCDNs();
-				}
-			}
-		});
-		modalInstance.result.then(function(cdn) {
-			clearServerUpdates(cacheGroup, cdn.id);
-		}, function () {
-			// do nothing
-		});
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	$scope.isOffline = serverUtils.isOffline;
-
-	$scope.offlineReason = serverUtils.offlineReason;
-
-	angular.element(document).ready(function () {
-		$('#serversTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableCacheGroupsServersController.$inject = ['cacheGroup', 'servers', '$scope', '$state', '$uibModal', 'cacheGroupService', 'locationUtils', 'serverUtils'];
-module.exports = TableCacheGroupsServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/index.js
deleted file mode 100644
index de377a5..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.cacheGroupServers', [])
-	.controller('TableCacheGroupServersController', require('./TableCacheGroupServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/table.cacheGroupServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/table.cacheGroupServers.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/table.cacheGroupServers.tpl.html
deleted file mode 100644
index ad3df4a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupServers/table.cacheGroupServers.tpl.html
+++ /dev/null
@@ -1,90 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/cache-groups')">Cache Groups</a></li>
-            <li><a ng-click="navigateToPath('/configure/cache-groups/' + cacheGroup.id)">{{::cacheGroup.name}}</a></li>
-            <li class="active">Servers</li>
-        </ol>
-        <div class="pull-right">
-            <div class="btn-group" role="group" uib-dropdown is-open="queue.isopen">
-                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    Queue Updates&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="confirmQueueServerUpdates(cacheGroup)"><i class="fa fa-flag"></i>&nbsp;&nbsp;Queue {{::cacheGroup.name}} Server Updates</a></li>
-                    <li role="menuitem"><a ng-click="confirmClearServerUpdates(cacheGroup)"><i class="fa fa-ban"></i>&nbsp;&nbsp;Clear {{::cacheGroup.name}} Server Updates</a></li>
-                </ul>
-            </div>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="serversTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>Update?</th>
-                <th>hostName</th>
-                <th>domainName</th>
-                <th>cdn</th>
-                <th>cachegroup</th>
-                <th>type</th>
-                <th>location</th>
-                <th>ipAddress</th>
-                <th>ip6Address</th>
-                <th>status</th>
-                <th>profile</th>
-                <th>iloIpAddress</th>
-                <th>iloIpGateway</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editServer(server.id)" ng-repeat="server in ::servers" ng-class="::{'active': server.updPending}">
-                <td class="update-column">
-                    <i class="fa fa-flag" title="Server Update Pending" ng-if="server.updPending"></i>
-                </td>
-                <td>{{::server.hostName}}</td>
-                <td>{{::server.domainName}}</td>
-                <td>{{::server.cdnName}}</td>
-                <td>{{::server.cachegroup}}</td>
-                <td>{{::server.type}}</td>
-                <td>{{::server.physLocation}}</td>
-                <td>{{::server.ipAddress}}</td>
-                <td>{{::server.ip6Address}}</td>
-                <td>
-                    <span ng-if="!isOffline(server.status)">{{::server.status}}</span>
-                    <span ng-if="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
-                </td>
-                <td>{{::server.profile}}</td>
-                <td>{{::server.iloIpAddress}}</td>
-                <td>{{::server.iloIpGateway}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupStaticDnsEntries/TableCacheGroupStaticDnsEntriesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupStaticDnsEntries/TableCacheGroupStaticDnsEntriesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupStaticDnsEntries/TableCacheGroupStaticDnsEntriesController.js
deleted file mode 100644
index 889fc5c..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupStaticDnsEntries/TableCacheGroupStaticDnsEntriesController.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableCacheGroupsStaticDnsEntriesController = function(cacheGroup, staticDnsEntries, $scope, $state, locationUtils) {
-
-	$scope.cacheGroup = cacheGroup;
-
-	$scope.staticDnsEntries = staticDnsEntries;
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#staticDnsEntriesTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableCacheGroupsStaticDnsEntriesController.$inject = ['cacheGroup', 'staticDnsEntries', '$scope', '$state', 'locationUtils'];
-module.exports = TableCacheGroupsStaticDnsEntriesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupStaticDnsEntries/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupStaticDnsEntries/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupStaticDnsEntries/index.js
deleted file mode 100644
index 6a8a45e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupStaticDnsEntries/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.cacheGroupStaticDnsEntries', [])
-	.controller('TableCacheGroupStaticDnsEntriesController', require('./TableCacheGroupStaticDnsEntriesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupStaticDnsEntries/table.cacheGroupStaticDnsEntries.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupStaticDnsEntries/table.cacheGroupStaticDnsEntries.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupStaticDnsEntries/table.cacheGroupStaticDnsEntries.tpl.html
deleted file mode 100644
index e5d8346..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroupStaticDnsEntries/table.cacheGroupStaticDnsEntries.tpl.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/cache-groups')">Cache Groups</a></li>
-            <li><a ng-click="navigateToPath('/configure/cache-groups/' + cacheGroup.id)">{{::cacheGroup.name}}</a></li>
-            <li class="active">Static DNS Entries</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="staticDnsEntriesTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>host</th>
-                <th>address</th>
-                <th>type</th>
-                <th>ttl</th>
-                <th>deliveryservice</th>
-                <th>cachegroup</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-repeat="staticDnsEntry in ::staticDnsEntries">
-                <td>{{::staticDnsEntry.host}}</td>
-                <td>{{::staticDnsEntry.address}}</td>
-                <td>{{::staticDnsEntry.type}}</td>
-                <td>{{::staticDnsEntry.ttl}}</td>
-                <td>{{::staticDnsEntry.deliveryservice}}</td>
-                <td>{{::staticDnsEntry.cachegroup}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroups/TableCacheGroupsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroups/TableCacheGroupsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroups/TableCacheGroupsController.js
deleted file mode 100644
index c1a2857..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroups/TableCacheGroupsController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableCacheGroupsController = function(cacheGroups, $scope, $state, locationUtils) {
-
-    $scope.cacheGroups = cacheGroups;
-
-    $scope.editCacheGroup = function(id) {
-        locationUtils.navigateToPath('/configure/cache-groups/' + id);
-    };
-
-    $scope.createCacheGroup = function() {
-        locationUtils.navigateToPath('/configure/cache-groups/new');
-    };
-
-    $scope.refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-    angular.element(document).ready(function () {
-        $('#cacheGroupsTable').dataTable({
-            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-            "iDisplayLength": 25,
-            "aaSorting": []
-        });
-    });
-
-};
-
-TableCacheGroupsController.$inject = ['cacheGroups', '$scope', '$state', 'locationUtils'];
-module.exports = TableCacheGroupsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroups/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroups/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroups/index.js
deleted file mode 100644
index 141faf4..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroups/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.cacheGroups', [])
-    .controller('TableCacheGroupsController', require('./TableCacheGroupsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroups/table.cacheGroups.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroups/table.cacheGroups.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroups/table.cacheGroups.tpl.html
deleted file mode 100644
index 2e97ac8..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cacheGroups/table.cacheGroups.tpl.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">Cache Groups</li>
-        </ol>
-        <div class="pull-right" role="group" ng-if="!settings.isNew">
-            <button class="btn btn-primary" title="Create Cache Group" ng-click="createCacheGroup()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="cacheGroupsTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>name</th>
-                <th>shortName</th>
-                <th>type</th>
-                <th>latitude</th>
-                <th>longitude</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editCacheGroup(cacheGroup.id)" ng-repeat="cacheGroup in ::cacheGroups">
-                <td>{{::cacheGroup.name}}</td>
-                <td>{{::cacheGroup.shortName}}</td>
-                <td>{{::cacheGroup.typeName}}</td>
-                <td>{{::cacheGroup.latitude}}</td>
-                <td>{{::cacheGroup.longitude}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cdnDeliveryServices/TableCDNDeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnDeliveryServices/TableCDNDeliveryServicesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cdnDeliveryServices/TableCDNDeliveryServicesController.js
deleted file mode 100644
index be8505b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnDeliveryServices/TableCDNDeliveryServicesController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableCDNDeliveryServicesController = function(cdn, deliveryServices, $scope, $state, locationUtils) {
-
-	$scope.cdn = cdn;
-
-	$scope.deliveryServices = deliveryServices;
-
-	$scope.editDeliveryService = function(ds) {
-		locationUtils.navigateToPath('/configure/delivery-services/' + ds.id + '?type=' + ds.type);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#deliveryServicesTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableCDNDeliveryServicesController.$inject = ['cdn', 'deliveryServices', '$scope', '$state', 'locationUtils'];
-module.exports = TableCDNDeliveryServicesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cdnDeliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnDeliveryServices/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cdnDeliveryServices/index.js
deleted file mode 100644
index 80f823d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnDeliveryServices/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.cdnDeliveryServices', [])
-	.controller('TableCDNDeliveryServicesController', require('./TableCDNDeliveryServicesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cdnDeliveryServices/table.cdnDeliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnDeliveryServices/table.cdnDeliveryServices.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/cdnDeliveryServices/table.cdnDeliveryServices.tpl.html
deleted file mode 100644
index ac8dffd..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnDeliveryServices/table.cdnDeliveryServices.tpl.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/cdns')">CDNs</a></li>
-            <li><a ng-click="navigateToPath('/admin/cdns/' + cdn.id)">{{cdn.name}}</a></li>
-            <li class="active">Delivery Services</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="deliveryServicesTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>xmlId</th>
-                <th>orgServerFqdn</th>
-                <th>active</th>
-                <th>type</th>
-                <th>protocol</th>
-                <th>cdn</th>
-                <th>ipv6RoutingEnabled</th>
-                <th>dscp</th>
-                <th>signed</th>
-                <th>qstringIgnore</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editDeliveryService(deliveryService)" ng-repeat="deliveryService in ::deliveryServices">
-                <td>{{::deliveryService.xmlId}}</td>
-                <td>{{::deliveryService.orgServerFqdn}}</td>
-                <td>{{::deliveryService.active}}</td>
-                <td>{{::deliveryService.type}}</td>
-                <td>{{::deliveryService.protocol}}</td>
-                <td>{{::deliveryService.cdnName}}</td>
-                <td>{{::deliveryService.ipv6RoutingEnabled}}</td>
-                <td>{{::deliveryService.dscp}}</td>
-                <td>{{::deliveryService.signed}}</td>
-                <td>{{::deliveryService.qstringIgnore}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cdnProfiles/TableCDNProfilesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnProfiles/TableCDNProfilesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cdnProfiles/TableCDNProfilesController.js
deleted file mode 100644
index 04785a1..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnProfiles/TableCDNProfilesController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableCDNProfilesController = function(cdn, profiles, $scope, $state, locationUtils) {
-
-	$scope.cdn = cdn;
-
-	$scope.profiles = profiles;
-
-	$scope.editProfile = function(id) {
-		locationUtils.navigateToPath('/admin/profiles/' + id);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#profilesTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableCDNProfilesController.$inject = ['cdn', 'profiles', '$scope', '$state', 'locationUtils'];
-module.exports = TableCDNProfilesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cdnProfiles/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnProfiles/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cdnProfiles/index.js
deleted file mode 100644
index c255320..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnProfiles/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.cdnProfiles', [])
-	.controller('TableCDNProfilesController', require('./TableCDNProfilesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cdnProfiles/table.cdnProfiles.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnProfiles/table.cdnProfiles.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/cdnProfiles/table.cdnProfiles.tpl.html
deleted file mode 100644
index b054858..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnProfiles/table.cdnProfiles.tpl.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/cdns')">CDNs</a></li>
-            <li><a ng-click="navigateToPath('/admin/cdns/' + cdn.id)">{{::cdn.name}}</a></li>
-            <li class="active">Profiles</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="profilesTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>name</th>
-                <th>description</th>
-                <th>cdn</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editProfile(profile.id)" ng-repeat="profile in ::profiles">
-                <td>{{::profile.name}}</td>
-                <td>{{::profile.description}}</td>
-                <td>{{::profile.cdnName}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cdnServers/TableCDNServersController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnServers/TableCDNServersController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cdnServers/TableCDNServersController.js
deleted file mode 100644
index 8670fdc..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnServers/TableCDNServersController.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableCDNServersController = function(cdn, servers, $scope, $state, locationUtils, serverUtils, cdnService) {
-
-	$scope.cdn = cdn;
-
-	$scope.servers = servers;
-
-	$scope.editServer = function(id) {
-		locationUtils.navigateToPath('/configure/servers/' + id);
-	};
-
-	$scope.queueServerUpdates = function(cdn) {
-		cdnService.queueServerUpdates(cdn.id)
-			.then(
-				function() {
-					$scope.refresh();
-				}
-			);
-	};
-
-	$scope.clearServerUpdates = function(cdn) {
-		cdnService.clearServerUpdates(cdn.id)
-			.then(
-				function() {
-					$scope.refresh();
-				}
-			);
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.isOffline = serverUtils.isOffline;
-
-	$scope.offlineReason = serverUtils.offlineReason;
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#serversTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableCDNServersController.$inject = ['cdn', 'servers', '$scope', '$state', 'locationUtils', 'serverUtils', 'cdnService'];
-module.exports = TableCDNServersController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cdnServers/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnServers/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cdnServers/index.js
deleted file mode 100644
index 22f950b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnServers/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.cdnServers', [])
-	.controller('TableCDNServersController', require('./TableCDNServersController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cdnServers/table.cdnServers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnServers/table.cdnServers.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/cdnServers/table.cdnServers.tpl.html
deleted file mode 100644
index da6cf1e..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cdnServers/table.cdnServers.tpl.html
+++ /dev/null
@@ -1,85 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/admin/cdns')">CDNs</a></li>
-            <li><a ng-click="navigateToPath('/admin/cdns/' + cdn.id)">{{::cdn.name}}</a></li>
-            <li class="active">Servers</li>
-        </ol>
-        <div class="pull-right">
-            <div class="btn-group" role="group" uib-dropdown is-open="queue.isopen">
-                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
-                    Queue Updates&nbsp;
-                    <span class="caret"></span>
-                </button>
-                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
-                    <li role="menuitem"><a ng-click="queueServerUpdates(cdn)">Queue {{cdn.name}} Server Updates</a></li>
-                    <li role="menuitem"><a ng-click="clearServerUpdates(cdn)">Clear {{cdn.name}} Server Updates</a></li>
-                </ul>
-            </div>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="serversTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>Update?</th>
-                <th>hostName</th>
-                <th>domainName</th>
-                <th>ipAddress</th>
-                <th>ip6Address</th>
-                <th>status</th>
-                <th>type</th>
-                <th>profile</th>
-                <th>cdn</th>
-                <th>cachegroup</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editServer(server.id)" ng-repeat="server in ::servers" ng-class="::{'active': server.updPending}">
-                <td class="update-column">
-                    <i class="fa fa-flag" ng-if="server.updPending"></i>
-                    <i class="fa fa-ban" ng-if="!server.updPending"></i>
-                </td>
-                <td>{{::server.hostName}}</td>
-                <td>{{::server.domainName}}</td>
-                <td>{{::server.ipAddress}}</td>
-                <td>{{::server.ip6Address}}</td>
-                <td>
-                    <span ng-if="!isOffline(server.status)">{{::server.status}}</span>
-                    <span ng-if="isOffline(server.status)" uib-popover="{{::offlineReason(server)}}" popover-title="Offline Reason" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true">{{::server.status}}</span>
-                </td>
-                <td>{{::server.type}}</td>
-                <td>{{::server.profile}}</td>
-                <td>{{::server.cdnName}}</td>
-                <td>{{::server.cachegroup}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-
-
-
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cdns/TableCDNsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cdns/TableCDNsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cdns/TableCDNsController.js
deleted file mode 100644
index 094a81a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cdns/TableCDNsController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableCDNsController = function(cdns, $scope, $state, locationUtils) {
-
-    $scope.cdns = cdns;
-
-    $scope.editCDN = function(id) {
-        locationUtils.navigateToPath('/admin/cdns/' + id);
-    };
-
-    $scope.createCDN = function() {
-        locationUtils.navigateToPath('/admin/cdns/new');
-    };
-
-    $scope.refresh = function() {
-        $state.reload(); // reloads all the resolves for the view
-    };
-
-    angular.element(document).ready(function () {
-        $('#cdnsTable').dataTable({
-            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-            "iDisplayLength": 25,
-            "aaSorting": []
-        });
-    });
-
-};
-
-TableCDNsController.$inject = ['cdns', '$scope', '$state', 'locationUtils'];
-module.exports = TableCDNsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cdns/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cdns/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/cdns/index.js
deleted file mode 100644
index 9fa0a3d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cdns/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.cdns', [])
-    .controller('TableCDNsController', require('./TableCDNsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/cdns/table.cdns.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/cdns/table.cdns.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/cdns/table.cdns.tpl.html
deleted file mode 100644
index f8d1fab..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/cdns/table.cdns.tpl.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">CDNs</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Create CDN" ng-click="createCDN()"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="cdnsTable" class="table responsive-utilities jambo_table">
-            <thead>
-                <tr class="headings">
-                    <th>name</th>
-                    <th>domainName</th>
-                    <th>dnssecEnabled</th>
-                </tr>
-            </thead>
-            <tbody>
-                <tr ng-click="editCDN(cdn.id)" ng-repeat="cdn in ::cdns">
-                    <td>{{::cdn.name}}</td>
-                    <td>{{::cdn.domainName}}</td>
-                    <td>{{::cdn.dnssecEnabled}}</td>
-                </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/changeLogs/TableChangeLogsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/changeLogs/TableChangeLogsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/changeLogs/TableChangeLogsController.js
deleted file mode 100644
index 18a5cd9..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/changeLogs/TableChangeLogsController.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableChangeLogsController = function(changeLogs, $scope, $state, locationUtils) {
-
-	$scope.changeLogs = changeLogs;
-
-	$scope.getRelativeTime = function(date) {
-		return moment(date).fromNow();
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	angular.element(document).ready(function () {
-		$('#changeLogsTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableChangeLogsController.$inject = ['changeLogs', '$scope', '$state', 'locationUtils'];
-module.exports = TableChangeLogsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/changeLogs/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/changeLogs/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/changeLogs/index.js
deleted file mode 100644
index 541f117..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/changeLogs/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.changeLogs', [])
-	.controller('TableChangeLogsController', require('./TableChangeLogsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/changeLogs/table.changeLogs.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/changeLogs/table.changeLogs.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/changeLogs/table.changeLogs.tpl.html
deleted file mode 100644
index 40d33ff..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/changeLogs/table.changeLogs.tpl.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li class="active">Change Logs</li>
-        </ol>
-        <div class="pull-right" role="group">
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="changeLogsTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>occurred</th>
-                <th>timestamp (UTC)</th>
-                <th>user</th>
-                <th>type</th>
-                <th>message</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-repeat="changeLog in ::changeLogs">
-                <td>{{::getRelativeTime(changeLog.lastUpdated)}}</td>
-                <td>{{::changeLog.lastUpdated}}</td>
-                <td>{{::changeLog.user}}</td>
-                <td>{{::changeLog.level}}</td>
-                <td>{{::changeLog.message}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/TableDeliveryServiceJobsController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/TableDeliveryServiceJobsController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/TableDeliveryServiceJobsController.js
deleted file mode 100644
index 58f2deb..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/TableDeliveryServiceJobsController.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableDeliveryServiceJobsController = function(deliveryService, jobs, $scope, $state, $location, locationUtils) {
-
-	$scope.deliveryService = deliveryService;
-
-	$scope.dsJobs = jobs;
-
-	$scope.createJob = function() {
-		$location.path($location.path() + '/new');
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#dsJobsTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableDeliveryServiceJobsController.$inject = ['deliveryService', 'jobs', '$scope', '$state', '$location', 'locationUtils'];
-module.exports = TableDeliveryServiceJobsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/index.js
deleted file mode 100644
index b5024a8..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.deliveryServiceJobs', [])
-	.controller('TableDeliveryServiceJobsController', require('./TableDeliveryServiceJobsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html
deleted file mode 100644
index ea3967c..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceJobs/table.deliveryServiceJobs.tpl.html
+++ /dev/null
@@ -1,55 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
-            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
-            <li class="active">Invalidate Content Jobs</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Create Invalidate Content Job" ng-click="createJob(deliveryService.id)"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="dsJobsTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>assetUrl</th>
-                <th>parameters</th>
-                <th>start (UTC)</th>
-                <th>createdBy</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-repeat="dsJob in ::dsJobs">
-                <td>{{::dsJob.assetUrl}}</td>
-                <td>{{::dsJob.parameters}}</td>
-                <td>{{::dsJob.startTime}}</td>
-                <td>{{::dsJob.createdBy}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceRegexes/TableDeliveryServiceRegexesController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceRegexes/TableDeliveryServiceRegexesController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceRegexes/TableDeliveryServiceRegexesController.js
deleted file mode 100644
index 736c265..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceRegexes/TableDeliveryServiceRegexesController.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableDeliveryServiceRegexesController = function(deliveryService, regexes, $scope, $state, locationUtils) {
-
-	$scope.deliveryService = deliveryService;
-
-	$scope.regexes = regexes;
-
-	$scope.editRegex = function(dsId, regexId) {
-		locationUtils.navigateToPath('/configure/delivery-services/' + dsId + '/regexes/' + regexId);
-	};
-
-	$scope.createRegex = function(dsId) {
-		locationUtils.navigateToPath('/configure/delivery-services/' + dsId + '/regexes/new');
-	};
-
-	$scope.refresh = function() {
-		$state.reload(); // reloads all the resolves for the view
-	};
-
-	$scope.navigateToPath = locationUtils.navigateToPath;
-
-	angular.element(document).ready(function () {
-		$('#regexesTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"aaSorting": []
-		});
-	});
-
-};
-
-TableDeliveryServiceRegexesController.$inject = ['deliveryService', 'regexes', '$scope', '$state', 'locationUtils'];
-module.exports = TableDeliveryServiceRegexesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceRegexes/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceRegexes/index.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceRegexes/index.js
deleted file mode 100644
index 5db1048..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceRegexes/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.table.deliveryServiceRegexes', [])
-	.controller('TableDeliveryServiceRegexesController', require('./TableDeliveryServiceRegexesController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceRegexes/table.deliveryServiceRegexes.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceRegexes/table.deliveryServiceRegexes.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceRegexes/table.deliveryServiceRegexes.tpl.html
deleted file mode 100644
index 62ee3c5..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceRegexes/table.deliveryServiceRegexes.tpl.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="x_panel">
-    <div class="x_title">
-        <ol class="breadcrumb pull-left">
-            <li><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
-            <li><a ng-click="navigateToPath('/configure/delivery-services/' + deliveryService.id + '?type=' + deliveryService.type)">{{::deliveryService.displayName}}</a></li>
-            <li class="active">Regexes</li>
-        </ol>
-        <div class="pull-right">
-            <button class="btn btn-primary" title="Create Delivery Service Regex" ng-click="createRegex(deliveryService.id)"><i class="fa fa-plus"></i></button>
-            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
-        </div>
-        <div class="clearfix"></div>
-    </div>
-    <div class="x_content">
-        <br>
-        <table id="regexesTable" class="table responsive-utilities jambo_table">
-            <thead>
-            <tr class="headings">
-                <th>type</th>
-                <th>pattern</th>
-                <th>order</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr ng-click="editRegex(deliveryService.id, regex.id)" ng-repeat="regex in ::regexes | orderBy:['setNumber']">
-                <td>{{::regex.typeName}}</td>
-                <td>{{::regex.pattern}}</td>
-                <td>{{::regex.setNumber}}</td>
-            </tr>
-            </tbody>
-        </table>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/TableDSServersUnassignedController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/TableDSServersUnassignedController.js b/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/TableDSServersUnassignedController.js
deleted file mode 100644
index ac7c42f..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/table/deliveryServiceServers/TableDSServersUnassignedController.js
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TableDSServersUnassignedController = function(deliveryService, eligibleServers, assignedServers, $scope, $uibModalInstance) {
-
-	var selectedServerIds = [];
-
-	var addServer = function(serverId) {
-		if (_.indexOf(selectedServerIds, serverId) == -1) {
-			selectedServerIds.push(serverId);
-		}
-	};
-
-	var removeServer = function(serverId) {
-		selectedServerIds = _.without(selectedServerIds, serverId);
-	};
-
-	var addAll = function() {
-		markServers(true);
-		selectedServerIds = _.pluck(eligibleServers, 'id');
-	};
-
-	var removeAll = function() {
-		markServers(false);
-		selectedServerIds = [];
-	};
-
-	var markServers = function(selected) {
-		$scope.selectedServers = _.map(eligibleServers, function(server) {
-			server['selected'] = selected;
-			return server;
-		});
-	};
-
-	$scope.deliveryService = deliveryService;
-
-	$scope.selectedServers = _.map(eligibleServers, function(eligibleServer) {
-		var isAssigned = _.find(assignedServers, function(assignedServer) { return assignedServer.id == eligibleServer.id });
-		if (isAssigned) {
-			eligibleServer['selected'] = true; // so the checkbox will be checked
-			selectedServerIds.push(eligibleServer.id); // so the server is added to selected servers
-		}
-		return eligibleServer;
-	});
-
-	$scope.allSelected = function() {
-		return eligibleServers.length == selectedServerIds.length;
-	};
-
-	$scope.selectAll = function($event) {
-		var checkbox = $event.target;
-		if (checkbox.checked) {
-			addAll();
-		} else {
-			removeAll();
-		}
-	};
-
-	$scope.updateServers = function($event, serverId) {
-		var checkbox = $event.target;
-		if (checkbox.checked) {
-			addServer(serverId);
-		} else {
-			removeServer(serverId);
-		}
-	};
-
-	$scope.submit = function() {
-		$uibModalInstance.close(selectedServerIds);
-	};
-
-	$scope.cancel = function () {
-		$uibModalInstance.dismiss('cancel');
-	};
-
-	angular.element(document).ready(function () {
-		$('#dsServersUnassignedTable').dataTable({
-			"aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
-			"iDisplayLength": 25,
-			"order": [[ 1, 'asc' ]],
-			"columnDefs": [
-				{ 'orderable': false, 'targets': 0 },
-				{ "width": "5%", "targets": 0 }
-			]
-		});
-	});
-
-};
-
-TableDSServersUnassignedController.$inject = ['deliveryService', 'eligibleServers', 'assignedServers', '$scope', '$uibModalInstance'];
-module.exports = TableDSServersUnassignedController;


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/user/edit/FormEditUserController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/user/edit/FormEditUserController.js b/traffic_portal/app/src/common/modules/form/user/edit/FormEditUserController.js
new file mode 100644
index 0000000..69f5fec
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/user/edit/FormEditUserController.js
@@ -0,0 +1,76 @@
+/*
+ * 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 FormEditUserController = function(user, $scope, $controller, $uibModal, $anchorScroll, locationUtils, userService) {
+
+    // extends the FormUserController to inherit common methods
+    angular.extend(this, $controller('FormUserController', { user: user, $scope: $scope }));
+
+    var saveUser = function(user) {
+        userService.updateUser(user).
+            then(function() {
+                $scope.userName = angular.copy(user.username);
+                $anchorScroll(); // scrolls window to top
+            });
+    };
+
+    var deleteUser = function(user) {
+        userService.deleteUser(user.id)
+            .then(function() {
+                locationUtils.navigateToPath('/admin/users');
+            });
+    };
+
+    $scope.userName = angular.copy(user.username);
+
+    $scope.settings = {
+        isNew: false,
+        saveLabel: 'Update'
+    };
+
+    $scope.confirmSave = function(user, usernameField) {
+        saveUser(user);
+    };
+
+    $scope.confirmDelete = function(user) {
+        var params = {
+            title: 'Delete User: ' + user.username,
+            key: user.username
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+            controller: 'DialogDeleteController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                }
+            }
+        });
+        modalInstance.result.then(function() {
+            deleteUser(user);
+        }, function () {
+            // do nothing
+        });
+    };
+
+};
+
+FormEditUserController.$inject = ['user', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'userService'];
+module.exports = FormEditUserController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/user/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/user/edit/index.js b/traffic_portal/app/src/common/modules/form/user/edit/index.js
new file mode 100644
index 0000000..9dc2f56
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/user/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.user.edit', [])
+    .controller('FormEditUserController', require('./FormEditUserController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/user/form.user.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/user/form.user.tpl.html b/traffic_portal/app/src/common/modules/form/user/form.user.tpl.html
new file mode 100644
index 0000000..b6cd309
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/user/form.user.tpl.html
@@ -0,0 +1,109 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/users')">Users</a></li>
+            <li class="active">{{userName}}</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-primary" title="View Delivery Services" ng-click="viewDeliveryServices()">View Delivery Services</button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="userForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(userForm.fullName), 'has-feedback': hasError(userForm.fullName)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Full Name *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="fullName" name="fullName" type="text" class="form-control" ng-model="user.fullName" ng-required="true" ng-maxlength="256" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(userForm.fullName, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(userForm.fullName, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(userForm.fullName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(userForm.username), 'has-feedback': hasError(userForm.username)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Username *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="username" name="username" type="text" class="form-control" ng-model="user.username" ng-required="true" ng-maxlength="128" ng-pattern="/^\S*$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(userForm.username, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(userForm.username, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(userForm.username, 'pattern')">No Spaces</small>
+                    <span ng-show="hasError(userForm.username)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(userForm.email), 'has-feedback': hasError(userForm.email)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Email *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="email" name="email" type="email" class="form-control" ng-model="user.email" ng-required="true" ng-maxlength="128" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(userForm.email, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(userForm.email, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(userForm.email)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(userForm.role), 'has-feedback': hasError(userForm.role)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Role *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="role" name="role" class="form-control" ng-model="user.role" ng-options="role.id as role.name for role in roles" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(userForm.role, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(userForm.tenantId), 'has-feedback': hasError(userForm.tenantId)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Tenant</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="tenantId" name="tenantId" class="form-control" ng-model="user.tenantId" ng-options="tenant.id as tenant.name for tenant in tenants">
+                        <option value="">Select...</option>
+                    </select>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(userForm.password), 'has-feedback': hasError(userForm.password)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Password <span ng-if="settings.isNew">*</span></label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="password" name="password" type="password" class="form-control" ng-model="user.localPasswd" ng-required="settings.isNew" ng-maxlength="40" ng-minlength="8" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(userForm.password, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(userForm.password, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(userForm.password)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(userForm.confirmPassword), 'has-feedback': hasError(userForm.confirmPassword)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Confirm Password <span ng-if="settings.isNew">*</span></label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="confirmPassword" name="confirmPassword" type="password" class="form-control" ng-model="user.confirmLocalPasswd" match="user.localPasswd">
+                    <small class="input-error" ng-show="hasPropertyError(userForm.confirmPassword, 'match')">[ Doesn't Match ]</small>
+                    <span ng-show="hasError(userForm.confirmPassword)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Public SSH Key</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <textarea id="publicSshKey" name="publicSshKey" rows="5" class="form-control" ng-model="user.publicSshKey"></textarea>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(user)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="userForm.$pristine || userForm.$invalid" ng-click="confirmSave(user, userForm.username)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/user/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/user/index.js b/traffic_portal/app/src/common/modules/form/user/index.js
new file mode 100644
index 0000000..e844d0d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/user/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.user', [])
+    .controller('FormUserController', require('./FormUserController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/user/new/FormNewUserController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/user/new/FormNewUserController.js b/traffic_portal/app/src/common/modules/form/user/new/FormNewUserController.js
new file mode 100644
index 0000000..a832929
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/user/new/FormNewUserController.js
@@ -0,0 +1,39 @@
+/*
+ * 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 FormNewUserController = function(user, $scope, $controller, userService) {
+
+    // extends the FormUserController to inherit common methods
+    angular.extend(this, $controller('FormUserController', { user: user, $scope: $scope }));
+
+    $scope.userName = 'New';
+
+    $scope.settings = {
+        isNew: true,
+        saveLabel: 'Create'
+    };
+
+    $scope.confirmSave = function(user, usernameField) {
+        userService.createUser(user);
+    };
+
+};
+
+FormNewUserController.$inject = ['user', '$scope', '$controller', 'userService'];
+module.exports = FormNewUserController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/user/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/user/new/index.js b/traffic_portal/app/src/common/modules/form/user/new/index.js
new file mode 100644
index 0000000..cdd0817
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/user/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.user.new', [])
+    .controller('FormNewUserController', require('./FormNewUserController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/header/HeaderController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/header/HeaderController.js b/traffic_portal/app/src/common/modules/header/HeaderController.js
old mode 100755
new mode 100644
index 1b82c26..e8789df
--- a/traffic_portal/app/src/common/modules/header/HeaderController.js
+++ b/traffic_portal/app/src/common/modules/header/HeaderController.js
@@ -1,86 +1,163 @@
 /*
-
-
- 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 HeaderController = function($scope, $state, $window, $anchorScroll, $uibModal, authService, portalService, userModel, deliveryServicesModel, propertiesModel) {
+var HeaderController = function($rootScope, $scope, $state, $uibModal, $location, $anchorScroll, locationUtils, authService, trafficPortalService, changeLogService, cdnService, changeLogModel, userModel) {
 
     $scope.isCollapsed = true;
 
+    $scope.userLoaded = userModel.loaded;
+
+    /* we don't want real time changes to the user showing up. we want the ability to revert changes
+    if necessary. thus, we will only update this on save. see userModel::userUpdated event below.
+     */
     $scope.user = angular.copy(userModel.user);
 
-    $scope.deliveryServices = deliveryServicesModel.deliveryServices;
+    $scope.newLogCount = changeLogModel.newLogCount;
 
-    $scope.properties = propertiesModel.properties;
+    $scope.changeLogs = [];
 
     $scope.isState = function(state) {
         return $state.current.name.indexOf(state) !== -1;
     };
 
-    $scope.showDS = function(dsId) {
-        $state.go('trafficPortal.private.deliveryService.view.overview.detail', { deliveryServiceId: dsId } );
+    $scope.getChangeLogs = function() {
+        $scope.changeLogs = [];
+        changeLogService.getChangeLogs({ limit: 6 })
+            .then(function(response) {
+                $scope.changeLogs = response;
+            });
     };
 
-    $scope.releaseVersion = function() {
-        portalService.getReleaseVersionInfo()
-            .then(function(result) {
-                $uibModal.open({
-                    templateUrl: 'common/modules/release/version/release.version.tpl.html',
-                    controller: 'ReleaseVersionController',
-                    size: 'sm',
-                    resolve: {
-                        params: function () {
-                            return result;
-                        }
-                    }
-                });
-            });
+    $scope.getRelativeTime = function(date) {
+        return moment(date).fromNow();
     };
 
-    $scope.about = function() {
-        if ($scope.properties.about.iframe) {
-            $scope.navigateToState('trafficPortal.public.about', false);
-        } else {
-            $window.open(
-                $scope.properties.about.url,
-                '_blank'
-            );
-        }
+    $scope.logout = function() {
+        authService.logout();
     };
 
-    $scope.navigateToState = function(to, reload) {
-        $state.go(to, {}, { reload: reload });
+    $scope.dumpDB = function() {
+        alert('not working yet');
+        // trafficPortalService.dumpDB();
     };
 
-    $scope.logout = function() {
-        authService.logout();
+    $scope.confirmQueueServerUpdates = function() {
+        var params = {
+            title: 'Queue Server Updates',
+            message: "Please select a CDN"
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+            controller: 'DialogSelectController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                },
+                collection: function(cdnService) {
+                    return cdnService.getCDNs();
+                }
+            }
+        });
+        modalInstance.result.then(function(cdn) {
+            cdnService.queueServerUpdates(cdn.id);
+        }, function () {
+            // do nothing
+        });
+    };
+
+    $scope.snapshot = function() {
+        var params = {
+            title: 'Diff CDN Config Snapshot',
+            message: "Please select a CDN"
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+            controller: 'DialogSelectController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                },
+                collection: function(cdnService) {
+                    return cdnService.getCDNs();
+                }
+            }
+        });
+        modalInstance.result.then(function(cdn) {
+            $location.path('/admin/cdns/' + cdn.id + '/config/changes');
+        }, function () {
+            // do nothing
+        });
     };
 
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
     var scrollToTop = function() {
         $anchorScroll(); // hacky?
     };
 
-    $scope.$on('userModel::userUpdated', function(event) {
+    var initToggleMenu = function() {
+        $('#menu_toggle').click(function () {
+            var isBig = $('body').hasClass('nav-md');
+            if (isBig) {
+                // shrink side menu
+                $('body').removeClass('nav-md');
+                $('body').addClass('nav-sm');
+                $('.main-nav').removeClass('scroll-view');
+                $('.main-nav').removeAttr('style');
+                $('.sidebar-footer').hide();
+
+                if ($('#sidebar-menu li').hasClass('active')) {
+                    $('#sidebar-menu li.active').addClass('active-sm');
+                    $('#sidebar-menu li.active').removeClass('active');
+                }
+
+                $('.side-menu-category ul').hide();
+
+            } else {
+                // expand side menu
+                $('body').removeClass('nav-sm');
+                $('body').addClass('nav-md');
+                $('.sidebar-footer').show();
+
+                if ($('#sidebar-menu li').hasClass('active-sm')) {
+                    $('#sidebar-menu li.active-sm').addClass('active');
+                    $('#sidebar-menu li.active-sm').removeClass('active-sm');
+                }
+
+                $rootScope.$broadcast('HeaderController::navExpanded', {});
+
+            }
+        });
+    };
+
+    $scope.$on('userModel::userUpdated', function() {
         $scope.user = angular.copy(userModel.user);
     });
 
     var init = function () {
         scrollToTop();
+        initToggleMenu();
     };
     init();
 };
 
-HeaderController.$inject = ['$scope', '$state', '$window', '$anchorScroll', '$uibModal', 'authService', 'portalService', 'userModel', 'deliveryServicesModel', 'propertiesModel'];
+HeaderController.$inject = ['$rootScope', '$scope', '$state', '$uibModal', '$location', '$anchorScroll', 'locationUtils', 'authService', 'trafficPortalService', 'changeLogService', 'cdnService', 'changeLogModel', 'userModel'];
 module.exports = HeaderController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/header/_header.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/header/_header.scss b/traffic_portal/app/src/common/modules/header/_header.scss
index 148e59f..3ac94db 100755
--- a/traffic_portal/app/src/common/modules/header/_header.scss
+++ b/traffic_portal/app/src/common/modules/header/_header.scss
@@ -14,67 +14,123 @@
  limitations under the License.
 
 */
+body.nav-sm .main_container .top_nav {
+  padding: 0 !important;
+  display: block;
+  margin-left: 70px;
+  z-index: 2;
+}
 
-#header {
-
-  .navbar-nav .navbar-dropdown {
-    padding-top: 8px;
+#alertsButton, #userButton {
+  &:hover, &:focus {
+    text-decoration: none;
   }
+}
 
-  .no-transition {
-    -webkit-transition: height 0.01s;
-    -moz-transition: height 0.01s;
-    -ms-transition: height 0.01s;
-    -o-transition: height 0.01s;
-    transition: height 0.01s;
-  }
+.main_container .top_nav {
+  padding: 0 !important;
+  display: block;
+  padding: 10px 20px 0;
+  margin-left: 230px;
+}
 
-  .nav-divider {
-    margin-top: 0;
-    margin-bottom: 0;
-  }
+.top_nav .navbar-right {
+  margin: 0;
+  width: 70%;
+  float: right;
+}
 
-  .top-navbar {
-    margin-bottom: 5px;
-  }
+.top_nav .navbar-right li {
+  display: inline-block;
+  float: right;
+}
 
-  .sub-navbar {
-    margin-top: 10px;
-    margin-bottom: 10px;
-  }
+.top_nav .dropdown-menu {
+  min-width: 220px;
+}
 
-  .divider {
-    height: 2px;
-  }
+.top_nav .dropdown-menu li {
+  width: 100%;
+}
 
+.top_nav .dropdown-menu li a {
+  width: 100%;
+  padding: 12px 20px;
 }
 
-#scrollable-ds-nav-menu {
-  height: auto;
-  max-height: 300px;
-  max-width: 500px;
-  overflow-y: auto;
+.top_nav li a i {
+  font-size: 15px
+}
 
-  .ds-name-link {
-    overflow: hidden;
-    text-overflow: ellipsis;
-  }
+.navbar {
+  margin-bottom: 0
+}
 
+.navbar-header {
+  background: #34495E;
 }
 
-#headerUsername {
-  max-width: 200px;
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  display: inline-block;
-  margin-bottom: -5px;
+.navbar-right {
+  margin-right: 0;
+}
+
+.navbar-static-top {
+  position: fixed;
+  top: 0;
+  width: 100%;
+}
+
+.navbar-brand,
+.navbar-nav>li>.btn-group>.btn-link {
+  color: #fff !important;
+}
+
+.navbar-brand,
+.navbar-nav>li>.btn-group>.btn-link {
+  margin-bottom: 5px
+}
+
+.nav.navbar-nav>li>.btn-group>.btn-link {
+  color: #515356 !important;
+}
+
+.nav.top_menu>li>a {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  color: #34495E !important;
+}
+
+.nav>li>a:hover,
+.nav>li>a:focus {
+  background-color: transparent;
+}
+
+.toggle {
+  float: left;
+  margin: 0;
+  padding-top: 16px;
+  padding-bottom: 16px;
+  width: 70px;
+}
+
+.toggle a {
+  padding: 15px 15px 0;
+  margin: 0;
+}
+
+.toggle a i {
+  font-size: 26px;
 }
 
 @media (max-width: 991px) {
-  #header {
-    .nav-divider {
-      display: none;
-    }
+
+  body.nav-md .container.body .top_nav {
+    width: 100%;
+    margin: 0;
   }
+
 }
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/header/header.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/header/header.tpl.html b/traffic_portal/app/src/common/modules/header/header.tpl.html
old mode 100755
new mode 100644
index 0174b8e..99a4ee5
--- a/traffic_portal/app/src/common/modules/header/header.tpl.html
+++ b/traffic_portal/app/src/common/modules/header/header.tpl.html
@@ -1,75 +1,81 @@
 <!--
+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="header" class="container">
-    <div class="navbar-header">
-        <button class="navbar-toggle" type="button" ng-click="isCollapsed = !isCollapsed">
-            <span class="sr-only">Toggle navigation</span>
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-        </button>
-        <span class="logo pull-left"></span>
-        <a class="navbar-brand" ui-sref="trafficPortal.public.home.landing">{{properties.name}}</a>
-    </div>
-    <div uib-collapse="isCollapsed" class="collapse navbar-collapse no-transition">
-        <ul class="nav navbar-nav navbar-right top-navbar">
-            <li class="navbar-dropdown navbar-dropdown-left dropdown">
-                <div class="btn-group" uib-dropdown is-open="helpMenu.isopen">
-                    <button id="helpMenu-button" type="button" class="btn btn-link" uib-dropdown-toggle>Help <i class="fa fa-angle-down fa-lg"></i></button>
-                    <ul class="uib-dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="helpMenu-button">
-                        <li ng-if="properties.about.show"><a ng-click="about()">About {{properties.name}}</a></li>
-                        <li><a ng-click="releaseVersion()">Release Information</a></li>
-                    </ul>
-                </div>
-            </li>
-            <li ng-show="!user.loaded && !isState('trafficPortal.public.home.landing')" class="navbar-btn">
-                <button type="button" class="btn btn-link" ng-click="navigateToState('trafficPortal.public.home.landing', false)">Login</button>
-            </li>
-            <li ng-show="user.loaded" class="navbar-dropdown navbar-dropdown-left dropdown">
+<div id="header" class="nav_menu">
+    <nav role="navigation">
+        <div class="nav toggle">
+            <a id="menu_toggle"><i class="fa fa-bars"></i></a>
+        </div>
+        <ul class="nav navbar-nav navbar-right" ng-if="userLoaded">
+            <li>
                 <div class="btn-group" uib-dropdown is-open="userMenu.isopen">
-                    <button id="userMenu-button" type="button" class="btn btn-link" uib-dropdown-toggle>
-                        <span id="headerUsername" ng-show="!user.newUser">{{user.username}}</span><span ng-show="user.newUser">New User</span> <i class="fa fa-angle-down fa-lg"></i>
+                    <button id="userButton" type="button" class="btn btn-link" uib-dropdown-toggle>
+                        <span id="headerUsername">{{::user.username}}</span><span ng-if="user.newUser">New User</span> <i class="fa fa-angle-down fa-lg"></i>
                     </button>
-                    <ul class="uib-dropdown-menu" role="menu" aria-labelledby="userMenu-button">
-                        <li ng-show="user.localUser"><a ui-sref="trafficPortal.private.user.edit">Manage User Profile</a></li>
-                        <li><a ng-click="logout()">Sign Out</a></li>
+                    <ul class="uib-dropdown-menu dropdown-usermenu animated fadeInDown" role="menu" aria-labelledby="userMenu-button">
+                        <li><a ui-sref="trafficPortal.private.user.edit">Manage User Profile</a></li>
+                        <li ng-if="userLoaded"><a ng-click="logout()">Logout</a></li>
                     </ul>
                 </div>
             </li>
-        </ul>
-    </div>
-    <hr ng-show="user.loaded" class="nav-divider">
-    <div uib-collapse="isCollapsed" class="collapse navbar-collapse no-transition">
-        <ul ng-show="user.loaded" class="nav navbar-nav sub-navbar navbar-left">
-            <li><button type="button" class="btn btn-link" ng-class="{'selected': isState('trafficPortal.private.dashboard.overview')}" ng-click="navigateToState('trafficPortal.private.dashboard.overview', false)">Dashboard</button></li>
-            <li class="sub-navbar-dropdown sub-navbar-dropdown-right dropdown">
-                <div class="btn-group" uib-dropdown is-open="dsMenu.isopen">
-                    <button id="dsMenu-button" type="button" class="btn btn-link" ng-class="{'selected': isState('trafficPortal.private.deliveryService')}" uib-dropdown-toggle>
-                        Delivery Services <i class="fa fa-angle-down fa-lg"></i>
+            <li role="presentation" class="dropdown">
+                <div class="btn-group" uib-dropdown is-open="alerts.isopen">
+                    <button id="alertsButton" type="button" class="btn btn-link" ng-click="getChangeLogs()" uib-dropdown-toggle>
+                        <i class="fa fa-comment-o"></i>
+                        <span class="badge bg-green">{{newLogCount()}}</span>
                     </button>
-                    <ul id="scrollable-ds-nav-menu" class="uib-dropdown-menu scrollable" role="menu" aria-labelledby="dsMenu-button">
-                        <li ng-if="properties.deliveryService.request.show"><a class="ds-name-link" title="New Delivery Service" ng-click="navigateToState('trafficPortal.private.deliveryService.new', true)"><i class="fa fa-plus fa-fw"></i> New Delivery Service</a> </li>
-                        <li ng-if="properties.deliveryService.request.show && deliveryServices.length > 0" class="divider"></li>
-                        <li ng-repeat="ds in deliveryServices | orderBy:'displayName'"><a class="ds-name-link" title="{{ds.displayName}} ({{ds.id}} | {{ds.xmlId}})" ng-click="showDS(ds.id)"><i class="fa fa-times fa-fw" title="Inactive" ng-show="!ds.active"></i><i class="fa fa-check fa-fw" title="Active" ng-show="ds.active"></i> {{ds.displayName}}</a></li>
+                    <ul class="uib-dropdown-menu list-unstyled msg_list animated fadeInDown" role="menu">
+                        <li ng-repeat="changeLog in changeLogs">
+                            <a ng-click="$event.stopPropagation()">
+                                <span>
+                                    <span>{{::changeLog.user}}</span>
+                                    <span class="time">{{::getRelativeTime(changeLog.lastUpdated)}}</span>
+                                </span>
+                                <span class="message">{{::changeLog.message}}</span>
+                            </a>
+                        </li>
+                        <li>
+                            <div class="text-center">
+                                <a>
+                                    <strong><a ng-click="navigateToPath('/admin/change-logs')">See All Change Logs</a></strong>
+                                    <i class="fa fa-angle-right"></i>
+                                </a>
+                            </div>
+                        </li>
                     </ul>
                 </div>
             </li>
-            <li><button type="button" class="btn btn-link" ng-class="{'selected': isState('trafficPortal.private.collateral')}" ng-click="navigateToState('trafficPortal.private.collateral', false)">Collateral</button></li>
+            <li>
+                <div class="btn-group" title="Download DB">
+                    <button type="button" class="btn btn-link" ng-click="dumpDB()"><i class="fa fa-download"></i></button>
+                </div>
+            </li>
+            <li>
+                <div class="btn-group" title="Queue CDN Server Updates">
+                    <button type="button" class="btn btn-link" ng-click="confirmQueueServerUpdates()"><i class="fa fa-flag"></i></button>
+                </div>
+            </li>
+            <li>
+                <div class="btn-group" title="Diff CDN Config Snapshot">
+                    <button type="button" class="btn btn-link" ng-click="snapshot()"><i class="fa fa-camera"></i></button>
+                </div>
+            </li>
         </ul>
-    </div>
+    </nav>
 </div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/header/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/header/index.js b/traffic_portal/app/src/common/modules/header/index.js
old mode 100755
new mode 100644
index 8a93e86..4931e1f
--- a/traffic_portal/app/src/common/modules/header/index.js
+++ b/traffic_portal/app/src/common/modules/header/index.js
@@ -1,19 +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.
-
+ * 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.header', [])
-    .controller('HeaderController', require('./HeaderController'));
\ No newline at end of file
+    .controller('HeaderController', require('./HeaderController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/message/MessageController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/message/MessageController.js b/traffic_portal/app/src/common/modules/message/MessageController.js
index c253d8e..fde0f6b 100644
--- a/traffic_portal/app/src/common/modules/message/MessageController.js
+++ b/traffic_portal/app/src/common/modules/message/MessageController.js
@@ -1,45 +1,31 @@
 /*
-
-
- 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 MessageController = function($rootScope, $scope, messageModel, chartModel) {
+var MessageController = function($scope, messageModel) {
 
     $scope.messageData = messageModel;
 
-    $scope.chartData = chartModel.chart;
-
     $scope.dismissMessage = function(message) {
         messageModel.removeMessage(message);
     };
 
-    $scope.showConnectionLostMsg = function() {
-        $('#lostConnectionMsg').show();
-    };
-
-    $scope.hideConnectionLostMsg = function() {
-        $('#lostConnectionMsg').hide();
-    };
-
-    $rootScope.$watch('online', function(newStatus) {
-        if (newStatus === false && $scope.chartData.autoRefresh === true) {
-            $scope.showConnectionLostMsg();
-        }
-    });
-
 };
 
-MessageController.$inject = ['$rootScope', '$scope', 'messageModel', 'chartModel'];
+MessageController.$inject = ['$scope', 'messageModel'];
 module.exports = MessageController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/message/_message.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/message/_message.scss b/traffic_portal/app/src/common/modules/message/_message.scss
index 21978d4..5c7d88a 100644
--- a/traffic_portal/app/src/common/modules/message/_message.scss
+++ b/traffic_portal/app/src/common/modules/message/_message.scss
@@ -14,11 +14,6 @@
  limitations under the License.
 
 */
-
 #messageContainer {
-  margin-top: 20px;
-  margin-bottom: 20px;
-  .alert {
-    margin-bottom: 0;
-  }
+  margin-top: 70px;
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/message/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/message/index.js b/traffic_portal/app/src/common/modules/message/index.js
index 6d10dd0..cffdace 100644
--- a/traffic_portal/app/src/common/modules/message/index.js
+++ b/traffic_portal/app/src/common/modules/message/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.message', [])

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/message/message.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/message/message.tpl.html b/traffic_portal/app/src/common/modules/message/message.tpl.html
index 8f6d9c4..b99b6cb 100644
--- a/traffic_portal/app/src/common/modules/message/message.tpl.html
+++ b/traffic_portal/app/src/common/modules/message/message.tpl.html
@@ -1,29 +1,27 @@
 <!--
+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="messageContainer">
-    <div id="lostConnectionMsg" class="alert alert-dismissable alert-danger" style="display: none;">
-        <button type="button" class="close" data-dismiss="alert" aria-hidden="true" ng-click="hideConnectionLostMsg()">&times;</button>
-        Your internet connection was interrupted. Live chart updates have been turned off. Please restart if necessary.
+    <div ng-show="messageData.messages.loaded">
+        <div class="alert alert-dismissable alert-{{(message.level === 'error') ? 'danger' : message.level}}" ng-repeat="message in messageData.messages.content">
+            <button type="button" class="close" data-dismiss="alert" aria-hidden="true" ng-click="dismissMessage(message)">&times;</button>
+            <div>{{message.text}}</div>
+        </div>
     </div>
 </div>
-<div ng-show="messageData.messages.loaded">
-    <div class="alert alert-dismissable alert-{{(message.level === 'error') ? 'danger' : message.level}}" ng-repeat="message in messageData.messages.content">
-        <button type="button" class="close" data-dismiss="alert" aria-hidden="true" ng-click="dismissMessage(message)">&times;</button>
-        <div ng-bind-html="message.text | linky:'_blank'"></div>
-    </div>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/navigation/NavigationController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/navigation/NavigationController.js b/traffic_portal/app/src/common/modules/navigation/NavigationController.js
new file mode 100644
index 0000000..2c39b84
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/navigation/NavigationController.js
@@ -0,0 +1,152 @@
+/*
+ * 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 NavigationController = function($scope, $log, $state, $location, $window, $timeout, $uibModal, authService, trafficPortalService, propertiesModel, userModel) {
+
+    $scope.appName = propertiesModel.properties.name;
+
+    $scope.customMenuItems = propertiesModel.properties.customMenu.items;
+
+    $scope.userLoaded = userModel.loaded;
+
+    $scope.user = userModel.user;
+
+    $scope.monitor = {
+        isOpen: false,
+        isDisabled: false
+    };
+
+    $scope.settings = {
+        isOpen: false,
+        isDisabled: false
+    };
+
+
+    $scope.navigateToPath = function(path) {
+        $location.url(path);
+    };
+
+    $scope.isState = function(state) {
+        return $state.current.name.indexOf(state) !== -1;
+    };
+
+    $scope.logout = function() {
+        authService.logout();
+    };
+
+    $scope.releaseVersion = function() {
+        trafficPortalService.getReleaseVersionInfo()
+            .then(function(result) {
+                $uibModal.open({
+                    templateUrl: 'common/modules/release/release.tpl.html',
+                    controller: 'ReleaseController',
+                    size: 'sm',
+                    resolve: {
+                        params: function () {
+                            return result;
+                        }
+                    }
+                });
+            });
+    };
+
+    $scope.openCustomItem = function(url, embed) {
+        if (embed) {
+            $location.url('/custom').search({ url: encodeURIComponent(url) });
+        } else {
+            $window.open(
+                url,
+                '_blank'
+            );
+        }
+    };
+
+    var explodeMenu = function() {
+        var isBig = $('body').hasClass('nav-md');
+
+        $('.side-menu-category ul').slideUp();
+        $('.side-menu-category').removeClass('active');
+        $('.side-menu-category').removeClass('active-sm');
+
+        if (isBig) {
+            $('.current-page').parent('ul').slideDown().parent().addClass('active');
+        } else {
+            $('.current-page').closest('.side-menu-category').addClass('active-sm');
+        }
+    };
+
+    var registerMenuHandlers = function() {
+        $('.side-menu-category').click(function() {
+            var isBig = $('body').hasClass('nav-md');
+            if (isBig) {
+                if ($(this).is('.active')) {
+                    $(this).removeClass('active');
+                    $('ul', this).slideUp();
+                    $(this).removeClass('nv');
+                    $(this).addClass('vn');
+                } else {
+                    $('#sidebar-menu li ul').slideUp();
+                    $(this).removeClass('vn');
+                    $(this).addClass('nv');
+                    $('ul', this).slideDown();
+                    $('#sidebar-menu li').removeClass('active');
+                    $(this).addClass('active');
+                }
+            } else {
+                $('#sidebar-menu li ul').slideUp();
+                if ($(this).is('.active-sm')) {
+                    $(this).removeClass('active-sm');
+                    $(this).removeClass('nv');
+                    $(this).addClass('vn');
+                } else {
+                    $(this).removeClass('vn');
+                    $(this).addClass('nv');
+                    $('ul', this).slideDown();
+                    $('#sidebar-menu li').removeClass('active-sm');
+                    $(this).addClass('active-sm');
+                }
+            }
+        });
+
+        $('.side-menu-category-item').click(function(event) {
+            event.stopPropagation();
+            var isBig = $('body').hasClass('nav-md');
+            if (!isBig) {
+                // close the menu when child is clicked only in small mode
+                $(event.currentTarget).closest('.child_menu').slideUp();
+            }
+        });
+    };
+
+    $scope.$on('HeaderController::navExpanded', function() {
+        explodeMenu();
+    });
+
+    var init = function() {
+        $timeout(function() {
+            explodeMenu();
+            registerMenuHandlers();
+        }, 100);
+    };
+    init();
+
+};
+
+NavigationController.$inject = ['$scope', '$log', '$state', '$location', '$window', '$timeout', '$uibModal', 'authService', 'trafficPortalService', 'propertiesModel', 'userModel'];
+module.exports = NavigationController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/navigation/_navigation.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/navigation/_navigation.scss b/traffic_portal/app/src/common/modules/navigation/_navigation.scss
new file mode 100644
index 0000000..88b0b59
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/navigation/_navigation.scss
@@ -0,0 +1,299 @@
+/*
+
+
+ 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.
+
+*/
+body.nav-sm .container.body .main-nav {
+  width: 70px;
+  padding: 0;
+  position: fixed;
+  height: 100%;
+  z-index: 200;
+  background: #2A3F54
+}
+
+body.nav-sm .navbar.nav_title {
+  width: 70px;
+}
+
+body.nav-sm .navbar.nav_title a span {
+  display: none;
+}
+
+body.nav-sm .navbar.nav_title a i {
+  font-size: 27px;
+  margin: 13px 0 0 3px;
+}
+
+.site_title i {
+  padding: 5px 6px;
+}
+
+body.nav-sm .nav.side-menu li a {
+  text-align: center !important;
+  font-weight: 400;
+  font-size: 10px;
+  padding: 10px 5px;
+}
+
+body.nav-sm .nav.side-menu li.active-sm {
+  border-right: 5px solid #1ABB9C;
+}
+
+body.nav-sm > .nav.side-menu > li.active-sm > a {
+  color: #1ABB9C !important;
+}
+
+body.nav-sm .nav.side-menu li a i.toggle-up {
+  display: none !important;
+}
+
+body.nav-sm .nav.side-menu li a i {
+  font-size: 25px !important;
+  text-align: center;
+  width: 100% !important;
+  margin-bottom: 5px;
+}
+
+body.nav-sm ul.nav.child_menu {
+  left: 100%;
+  position: absolute;
+  top: 0;
+  padding: 10px;
+  width: 210px;
+  z-index: 4000;
+  background: #3E5367;
+  display: none;
+}
+
+body.nav-sm ul.nav.child_menu li {
+  padding-left: 0;
+}
+
+body.nav-sm ul.nav.child_menu li a {
+  text-align: left !important;
+}
+
+body.nav-sm .profile {
+  display: none;
+}
+
+.menu_section {
+  margin-bottom: 35px;
+}
+
+.menu_section h3 {
+  padding-left: 23px;
+  color: #fff;
+  text-transform: uppercase;
+  letter-spacing: .5px;
+  font-weight: bold;
+  font-size: 11px;
+  margin-bottom: 0;
+  margin-top: 0;
+  text-shadow: 1px 1px #000;
+}
+
+.menu_section >ul {
+  margin-top: 10px;
+}
+
+#sidebar-menu span.fa {
+  float: right;
+  text-align: center;
+  margin-top: 5px;
+  font-size: 10px !important;
+  min-width: inherit;
+  color: #C4CFDA;
+}
+
+.active a span.fa {
+  text-align: right !important;
+  margin-right: 4px;
+}
+
+body.nav-sm .menu_section {
+  margin: 0;
+}
+
+body.nav-sm span.fa,
+body.nav-sm .menu_section h3 {
+  display: none !important;
+}
+
+.nav_menu {
+  float: left;
+  /*background: #F4F6F9;
+  border-bottom: 1px solid #E6E9ED;*/
+
+  background: #EDEDED;
+  border-bottom: 1px solid #D9DEE4;
+  margin-bottom: 10px;
+  width: 100%;
+}
+
+body.nav-md .container.body .col-md-3.main-nav {
+  top: 0;
+  bottom: 0;
+  width: 230px;
+  background: #2A3F54;
+  padding: 0;
+  position: absolute;
+  display: flex;
+}
+
+.nav_title {
+  width: 230px;
+  float: left;
+  background: #2A3F54;
+  border-radius: 0;
+  height: 57px;
+  text-align: center;
+}
+
+.nav.child_menu > li > a {
+  color: rgba(255, 255, 255, 0.75) !important;
+  font-size: 14px;
+  padding: 9px;
+}
+
+.sidebar-header {
+  border-bottom: 0;
+  margin-top: 46px;
+}
+
+.sidebar-header:first-of-type {
+  margin-top: 0
+}
+
+.nav.side-menu> li {
+  position: relative;
+  display: block;
+}
+
+.nav.side-menu> li > a {
+  margin-bottom: 6px;
+}
+
+.nav.side-menu> li > a:hover {
+  color: #F2F5F7 !important;
+}
+
+.nav.side-menu>li>a:hover,
+.nav>li>a:focus {
+  text-decoration: none;
+  background: transparent;
+}
+
+.nav.child_menu li:hover {
+  background-color: rgba(255, 255, 255, 0.06);
+}
+
+.nav.child_menu li {
+  padding-left: 36px
+}
+
+body.nav-md ul.nav.child_menu li:before {
+  background: #425668;
+  bottom: auto;
+  content: "";
+  height: 8px;
+  left: 23px;
+  margin-top: 15px;
+  position: absolute;
+  right: auto;
+  width: 8px;
+  z-index: 1;
+  -webkit-border-radius: 50%;
+  -moz-border-radius: 50%;
+  border-radius: 50%;
+}
+
+body.nav-md ul.nav.child_menu li:after {
+  border-left: 1px solid #425668;
+  bottom: 0;
+  content: "";
+  left: 27px;
+  position: absolute;
+  top: 0;
+}
+
+.nav.side-menu>li>a,
+.nav.child_menu>li>a {
+  color: #E7E7E7 !important;
+  font-weight: 500;
+}
+
+.nav>li>.btn-group>.btn-link {
+  position: relative;
+  display: block;
+  padding: 13px 15px 7px;
+}
+
+.nav.side-menu> li.current-page,
+.nav.side-menu> li.active {
+  border-right: 5px solid #1ABB9C;
+}
+
+li.current-page {
+  background: rgba(255, 255, 255, 0.05);
+}
+
+.nav.side-menu> li.active > a {
+  color: #ff0000;
+  text-shadow: rgba(0, 0, 0, 0.25) 0 -1px 0;
+  background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5b6479), color-stop(100%, #4c5566)), #686e78;
+  background: -webkit-linear-gradient(#334556, #2C4257), #2A3F54;
+  background: -moz-linear-gradient(#334556, #2C4257), #2A3F54;
+  background: -o-linear-gradient(#334556, #2C4257), #2A3F54;
+  background: linear-gradient(#334556, #2C4257), #2A3F54;
+  -webkit-box-shadow: rgba(0, 0, 0, 0.25) 0 1px 0, inset rgba(255, 255, 255, 0.16) 0 1px 0;
+  -moz-box-shadow: rgba(0, 0, 0, 0.25) 0 1px 0, inset rgba(255, 255, 255, 0.16) 0 1px 0;
+  box-shadow: rgba(0, 0, 0, 0.25) 0 1px 0, inset rgba(255, 255, 255, 0.16) 0 1px 0;
+}
+
+li.current-page a {
+  color: #1ABB9C !important
+}
+
+.site_title {
+  text-overflow: ellipsis;
+  overflow: hidden;
+  font-weight: 400;
+  font-size: 22px;
+  width: 100%;
+  color: #ECF0F1 !important;
+  margin-left: 0 !important;
+  line-height: 59px;
+  display: block;
+  height: 55px;
+  margin: 0;
+  padding-left: 10px;
+  text-transform: uppercase;
+}
+
+.site_title:hover,
+.site_title:focus {
+  text-decoration: none
+}
+
+
+
+
+@media (max-width: 991px) {
+  body.nav-md .container.body .col-md-3.main-nav {
+    display: none;
+  }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/navigation/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/navigation/index.js b/traffic_portal/app/src/common/modules/navigation/index.js
new file mode 100644
index 0000000..26a964d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/navigation/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.navigation', [])
+    .controller('NavigationController', require('./NavigationController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/navigation/navigation.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/navigation/navigation.tpl.html b/traffic_portal/app/src/common/modules/navigation/navigation.tpl.html
new file mode 100644
index 0000000..e4c261e
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/navigation/navigation.tpl.html
@@ -0,0 +1,73 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<div class="main-nav scroll-view">
+    <div class="navbar nav_title">
+        <span class="site_title">{{appName}}</span>
+    </div>
+    <div class="clearfix"></div>
+    <div id="sidebar-menu" class="main_menu_side hidden-print main_menu">
+        <div class="menu_section">
+            <ul class="nav side-menu">
+                <li class="side-menu-category"><a href="javascript:void(0);"><i class="fa fa-bar-chart"></i> Monitor <span class="fa fa-chevron-down"></span></a>
+                    <ul class="nav child_menu" style="display: none">
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.monitor.dashboard')}"><a ng-click="navigateToPath('/monitor/dashboard')">Dashboard</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.monitor.map')}"><a ng-click="navigateToPath('/monitor/map')">Map</a></li>
+                    </ul>
+                </li>
+                <li class="side-menu-category"><a href="javascript:void(0);"><i class="fa fa-cog"></i> Configure <span class="fa fa-chevron-down"></span></a>
+                    <ul class="nav child_menu" style="display: none">
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.configure.cacheGroups')}"><a ng-click="navigateToPath('/configure/cache-groups')">Cache Groups</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.configure.deliveryServices')}"><a ng-click="navigateToPath('/configure/delivery-services')">Delivery Services</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.configure.servers')}"><a ng-click="navigateToPath('/configure/servers')">Servers</a></li>
+                    </ul>
+                </li>
+                <li class="side-menu-category"><a href="javascript:void(0);"><i class="fa fa-wrench"></i> Admin <span class="fa fa-chevron-down"></span></a>
+                    <ul class="nav child_menu" style="display: none">
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.asns')}"><a ng-click="navigateToPath('/admin/asns')">ASNs</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.cdns')}"><a ng-click="navigateToPath('/admin/cdns')">CDNs</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.divisions')}"><a ng-click="navigateToPath('/admin/divisions')">Divisions</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.jobs')}"><a ng-click="navigateToPath('/admin/jobs')">Jobs</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.physLocations')}"><a ng-click="navigateToPath('/admin/phys-locations')">Phys Locations</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.parameters')}"><a ng-click="navigateToPath('/admin/parameters')">Parameters</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.profiles')}"><a ng-click="navigateToPath('/admin/profiles')">Profiles</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.regions')}"><a ng-click="navigateToPath('/admin/regions')">Regions</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.statuses')}"><a ng-click="navigateToPath('/admin/statuses')">Statuses</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.types')}"><a ng-click="navigateToPath('/admin/types')">Types</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.tenants')}"><a ng-click="navigateToPath('/admin/tenants')">Tenants</a></li>
+                        <li class="side-menu-category-item" ng-class="{'current-page': isState('trafficPortal.private.admin.users')}"><a ng-click="navigateToPath('/admin/users')">Users</a></li>
+                    </ul>
+                </li>
+                <li class="side-menu-category" ng-if="customMenuItems.length > 0"><a href="javascript:void(0);"><i class="fa fa-cog"></i> Custom <span class="fa fa-chevron-down"></span></a>
+                    <ul class="nav child_menu" style="display: none">
+                        <li class="side-menu-category-item" ng-repeat="item in ::customMenuItems"><a ng-click="openCustomItem(item.url, item.embed)">{{item.name}}</a></li>
+                    </ul>
+                </li>
+
+            </ul>
+        </div>
+    </div>
+    <div class="sidebar-footer hidden-small">
+        <a title="Logout" ng-show="userLoaded" ng-click="logout()" uib-popover="Logout" popover-trigger="mouseenter"><i class="fa fa-sign-out"></i></a>
+        <a title="Login" ng-show="!userLoaded" ui-sref="trafficPortal.public.login" uib-popover="Login" popover-trigger="mouseenter"><i class="fa fa-sign-in"></i></a>
+        <a title="User Profile" ui-sref="trafficPortal.private.user.edit" uib-popover="User Profile" popover-trigger="mouseenter"><i class="fa fa-user"></i></a>
+        <a title="Release Info" ng-click="releaseVersion()" uib-popover="Release Info" popover-trigger="mouseenter"><i class="fa fa-info"></i></a>
+        <a title="Popout" uib-popover="Popout" popover-trigger="mouseenter"><i class="fa fa-external-link"></i></a>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/release/ReleaseController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/release/ReleaseController.js b/traffic_portal/app/src/common/modules/release/ReleaseController.js
new file mode 100644
index 0000000..36cc195
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/release/ReleaseController.js
@@ -0,0 +1,31 @@
+/*
+ * 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 ReleaseController = function(params, $scope, $uibModalInstance) {
+
+    $scope.params = params;
+
+    $scope.dismiss = function () {
+        $uibModalInstance.dismiss('cancel');
+    };
+
+};
+
+ReleaseController.$inject = ['params', '$scope', '$uibModalInstance'];
+module.exports = ReleaseController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/release/_release.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/release/_release.scss b/traffic_portal/app/src/common/modules/release/_release.scss
new file mode 100644
index 0000000..d57b9c6
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/release/_release.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/common/modules/release/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/release/index.js b/traffic_portal/app/src/common/modules/release/index.js
new file mode 100644
index 0000000..31d3b3c
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/release/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.release', [])
+    .controller('ReleaseController', require('./ReleaseController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/release/release.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/release/release.tpl.html b/traffic_portal/app/src/common/modules/release/release.tpl.html
new file mode 100644
index 0000000..21a52eb
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/release/release.tpl.html
@@ -0,0 +1,26 @@
+<!--
+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="modal-header">
+    <button type="button" class="close" ng-click="dismiss()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+    <h4 class="modal-title">Release Information</h4>
+</div>
+<div class="modal-body">
+    <p ng-repeat="(key, value) in params">{{key}}: {{value}}</p>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/release/version/ReleaseVersionController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/release/version/ReleaseVersionController.js b/traffic_portal/app/src/common/modules/release/version/ReleaseVersionController.js
deleted file mode 100644
index a020157..0000000
--- a/traffic_portal/app/src/common/modules/release/version/ReleaseVersionController.js
+++ /dev/null
@@ -1,29 +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 ReleaseVersionController = function(params, $scope, $uibModalInstance) {
-
-    $scope.params = params;
-
-    $scope.dismiss = function () {
-        $uibModalInstance.dismiss('cancel');
-    };
-
-};
-
-ReleaseVersionController.$inject = ['params', '$scope', '$uibModalInstance'];
-module.exports = ReleaseVersionController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/release/version/_release.version.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/release/version/_release.version.scss b/traffic_portal/app/src/common/modules/release/version/_release.version.scss
deleted file mode 100644
index fff23b4..0000000
--- a/traffic_portal/app/src/common/modules/release/version/_release.version.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/common/modules/release/version/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/release/version/index.js b/traffic_portal/app/src/common/modules/release/version/index.js
deleted file mode 100644
index 6e2598f..0000000
--- a/traffic_portal/app/src/common/modules/release/version/index.js
+++ /dev/null
@@ -1,19 +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.release.version', [])
-    .controller('ReleaseVersionController', require('./ReleaseVersionController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/release/version/release.version.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/release/version/release.version.tpl.html b/traffic_portal/app/src/common/modules/release/version/release.version.tpl.html
deleted file mode 100644
index ce8df6e..0000000
--- a/traffic_portal/app/src/common/modules/release/version/release.version.tpl.html
+++ /dev/null
@@ -1,24 +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="modal-header">
-    <button type="button" class="close" ng-click="dismiss()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-    <h4 class="modal-title">Release Information</h4>
-</div>
-<div class="modal-body">
-    <p ng-repeat="(key, value) in params">{{key}}: {{value}}</p>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/_table.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/_table.scss b/traffic_portal/app/src/common/modules/table/_table.scss
new file mode 100644
index 0000000..a64e1fe
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/_table.scss
@@ -0,0 +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.
+
+*/
+
+.update-column {
+  text-align: center;
+  .fa-flag {
+    font-weight: bold;
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/asns/TableASNsController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/asns/TableASNsController.js b/traffic_portal/app/src/common/modules/table/asns/TableASNsController.js
new file mode 100644
index 0000000..93da7eb
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/asns/TableASNsController.js
@@ -0,0 +1,47 @@
+/*
+ * 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 TableASNsController = function(asns, $scope, $state, locationUtils) {
+
+    $scope.asns = asns;
+
+    $scope.editASN = function(id) {
+        locationUtils.navigateToPath('/admin/asns/' + id);
+    };
+
+    $scope.createASN = function() {
+        locationUtils.navigateToPath('/admin/asns/new');
+    };
+
+    $scope.refresh = function() {
+        $state.reload(); // reloads all the resolves for the view
+    };
+
+    angular.element(document).ready(function () {
+        $('#asnsTable').dataTable({
+            "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]],
+            "iDisplayLength": 25,
+            "aaSorting": []
+        });
+    });
+
+};
+
+TableASNsController.$inject = ['asns', '$scope', '$state', 'locationUtils'];
+module.exports = TableASNsController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/asns/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/asns/index.js b/traffic_portal/app/src/common/modules/table/asns/index.js
new file mode 100644
index 0000000..eef7292
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/asns/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.table.asns', [])
+    .controller('TableASNsController', require('./TableASNsController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/table/asns/table.asns.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/table/asns/table.asns.tpl.html b/traffic_portal/app/src/common/modules/table/asns/table.asns.tpl.html
new file mode 100644
index 0000000..4d7ae7b
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/table/asns/table.asns.tpl.html
@@ -0,0 +1,49 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li class="active">ASNs</li>
+        </ol>
+        <div class="pull-right" role="group" ng-show="!settings.isNew">
+            <button class="btn btn-primary" title="Create ASN" ng-click="createASN()"><i class="fa fa-plus"></i></button>
+            <button class="btn btn-default" title="Refresh" ng-click="refresh()"><i class="fa fa-refresh"></i></button>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <table id="asnsTable" class="table responsive-utilities jambo_table">
+            <thead>
+            <tr class="headings">
+                <th>asn</th>
+                <th>cachegroup</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr ng-click="editASN(asn.id)" ng-repeat="asn in ::asns">
+                <td>{{::asn.asn}}</td>
+                <td>{{::asn.cachegroup}}</td>
+            </tr>
+            </tbody>
+        </table>
+    </div>
+</div>
+



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/select/status/DialogSelectStatusController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/select/status/DialogSelectStatusController.js b/traffic_portal/app/src/common/modules/dialog/select/status/DialogSelectStatusController.js
new file mode 100644
index 0000000..6bdf02e
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/dialog/select/status/DialogSelectStatusController.js
@@ -0,0 +1,57 @@
+/*
+ * 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 DialogSelectStatusController = function(server, statuses, $scope, $uibModalInstance) {
+
+	$scope.server = server;
+
+	$scope.statuses = statuses;
+
+	$scope.selectedStatusId = null;
+
+	$scope.status = {
+		id: null,
+		name: null,
+		offlineReason: null
+	};
+
+	$scope.select = function() {
+		var selectedStatus = _.find(statuses, function(status){ return parseInt(status.id) == parseInt($scope.selectedStatusId) });
+		$scope.status.id = selectedStatus.id;
+		$scope.status.name = selectedStatus.name;
+		$uibModalInstance.close($scope.status);
+	};
+
+	$scope.needsUpdates = function(server) {
+		return (server.type.indexOf('EDGE') != -1) || (server.type.indexOf('MID') != -1);
+	};
+
+	$scope.cancel = function () {
+		$uibModalInstance.dismiss('cancel');
+	};
+
+	$scope.offline = function () {
+		var selectedStatus = _.find(statuses, function(status){ return parseInt(status.id) == parseInt($scope.selectedStatusId) });
+		return selectedStatus && (selectedStatus.name == "ADMIN_DOWN" || selectedStatus.name == "OFFLINE");
+	};
+
+};
+
+DialogSelectStatusController.$inject = ['server', 'statuses', '$scope', '$uibModalInstance'];
+module.exports = DialogSelectStatusController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/select/status/dialog.select.status.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/select/status/dialog.select.status.tpl.html b/traffic_portal/app/src/common/modules/dialog/select/status/dialog.select.status.tpl.html
new file mode 100644
index 0000000..335a190
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/dialog/select/status/dialog.select.status.tpl.html
@@ -0,0 +1,55 @@
+<!--
+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="modal-header">
+    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+    <h4 class="modal-title">Update {{::server.hostName}} status</h4>
+    <h5 ng-if="needsUpdates(server)">Note: Config file updates will be queued on ALL child caches</h5>
+</div>
+<div class="modal-body">
+    <form name="statusForm" novalidate>
+        <div class="row">
+            <div class="col-sm-12 col-md-12">
+                <div class="form-group" ng-class="{'has-error': hasError(statusForm.status), 'has-feedback': hasError(statusForm.status)}">
+                    <label class="control-label" for="status">Status *
+                        <small class="input-error" ng-show="hasPropertyError(statusForm.status, 'required')">Required</small>
+                    </label>
+                    <select id="status" name="status" class="form-control" ng-model="selectedStatusId" ng-options="status.id as status.name for status in statuses" required>
+                        <option value="">Select...</option>
+                    </select>
+                </div>
+            </div>
+        </div>
+        <div class="row" ng-show="offline()">
+            <div class="col-sm-12 col-md-12">
+                <div class="form-group" ng-class="{'has-error': hasError(statusForm.offlineReason), 'has-feedback': hasError(statusForm.offlineReason)}">
+                    <label class="control-label" for="offlineReason">Offline Reason *
+                        <small class="input-error" ng-show="hasPropertyError(statusForm.offlineReason, 'maxlength')">Too Long</small>
+                    </label>
+                    <input id="offlineReason" name="offlineReason" type="text" class="form-control" ng-model="status.offlineReason" ng-maxlength="256" ng-required="offline()" autofocus>
+                    <span ng-show="hasError(statusForm.offlineReason)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+        </div>
+    </form>
+</div>
+<div class="modal-footer">
+    <button class="btn action-btn" ng-click="cancel()">Cancel</button>
+    <button class="btn btn-link" ng-disabled="statusForm.$invalid" ng-click="select()">Submit</button>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/dialog/select/status/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/dialog/select/status/index.js b/traffic_portal/app/src/common/modules/dialog/select/status/index.js
new file mode 100644
index 0000000..e1e5f4d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/dialog/select/status/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.dialog.select.status', [])
+	.controller('DialogSelectStatusController', require('./DialogSelectStatusController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/footer/FooterController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/footer/FooterController.js b/traffic_portal/app/src/common/modules/footer/FooterController.js
deleted file mode 100644
index 0a55062..0000000
--- a/traffic_portal/app/src/common/modules/footer/FooterController.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.
-
- */
-
-var FooterController = function($scope, propertiesModel) {
-
-    var chunk = function(array, n) {
-        var retval = [];
-        for (var i = 0, len = array.length; i < len; i += n) {
-            retval.push(array.slice(i, i + n));
-        }
-        return retval;
-    };
-
-    $scope.footerChunks = chunk(propertiesModel.properties.footer.links, 4);
-
-};
-
-FooterController.$inject = ['$scope', 'propertiesModel'];
-module.exports = FooterController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/footer/footer.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/footer/footer.tpl.html b/traffic_portal/app/src/common/modules/footer/footer.tpl.html
deleted file mode 100755
index dcf4458..0000000
--- a/traffic_portal/app/src/common/modules/footer/footer.tpl.html
+++ /dev/null
@@ -1,26 +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="footer-bottom container">
-    <ul class="menu-list">
-        <li ng-repeat="footerChunk in footerChunks">
-            <ul>
-                <li ng-repeat="footerLink in footerChunk"><a href="{{footerLink.url}}" target="_blank">{{footerLink.text}}</a></li>
-            </ul>
-        </li>
-    </ul>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/footer/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/footer/index.js b/traffic_portal/app/src/common/modules/footer/index.js
deleted file mode 100644
index 98e59e6..0000000
--- a/traffic_portal/app/src/common/modules/footer/index.js
+++ /dev/null
@@ -1,19 +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.footer', [])
-    .controller('FooterController', require('./FooterController'));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/asn/FormASNController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/asn/FormASNController.js b/traffic_portal/app/src/common/modules/form/asn/FormASNController.js
new file mode 100644
index 0000000..85f1475
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/asn/FormASNController.js
@@ -0,0 +1,45 @@
+/*
+ * 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 FormASNController = function(asn, $scope, formUtils, locationUtils, cacheGroupService) {
+
+    var getCacheGroups = function() {
+        cacheGroupService.getCacheGroups()
+            .then(function(result) {
+                $scope.cachegroups = result;
+            });
+    };
+
+    $scope.asn = asn;
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
+    $scope.hasError = formUtils.hasError;
+
+    $scope.hasPropertyError = formUtils.hasPropertyError;
+
+    var init = function () {
+        getCacheGroups();
+    };
+    init();
+
+};
+
+FormASNController.$inject = ['asn', '$scope', 'formUtils', 'locationUtils', 'cacheGroupService'];
+module.exports = FormASNController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/asn/edit/FormEditASNController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/asn/edit/FormEditASNController.js b/traffic_portal/app/src/common/modules/form/asn/edit/FormEditASNController.js
new file mode 100644
index 0000000..e2ac23e
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/asn/edit/FormEditASNController.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.
+ */
+
+var FormEditASNController = function(asn, $scope, $controller, $uibModal, $anchorScroll, locationUtils, asnService) {
+
+    // extends the FormASNController to inherit common methods
+    angular.extend(this, $controller('FormASNController', { asn: asn, $scope: $scope }));
+
+    var deleteASN = function(asn) {
+        asnService.deleteASN(asn.id)
+            .then(function() {
+                locationUtils.navigateToPath('/admin/asns');
+            });
+    };
+
+    $scope.asnName = angular.copy(asn.asn);
+
+    $scope.settings = {
+        isNew: false,
+        saveLabel: 'Update'
+    };
+
+    $scope.save = function(asn) {
+        asnService.updateASN(asn).
+            then(function() {
+                $scope.asnName = angular.copy(asn.asn);
+                $anchorScroll(); // scrolls window to top
+            });
+    };
+
+    $scope.confirmDelete = function(asn) {
+        var params = {
+            title: 'Delete ASN: ' + asn.asn,
+            key: asn.asn.toString()
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+            controller: 'DialogDeleteController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                }
+            }
+        });
+        modalInstance.result.then(function() {
+            deleteASN(asn);
+        }, function () {
+            // do nothing
+        });
+    };
+
+};
+
+FormEditASNController.$inject = ['asn', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'asnService'];
+module.exports = FormEditASNController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/asn/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/asn/edit/index.js b/traffic_portal/app/src/common/modules/form/asn/edit/index.js
new file mode 100644
index 0000000..9ab1012
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/asn/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.asn.edit', [])
+    .controller('FormEditASNController', require('./FormEditASNController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/asn/form.asn.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/asn/form.asn.tpl.html b/traffic_portal/app/src/common/modules/form/asn/form.asn.tpl.html
new file mode 100644
index 0000000..6ba8a69
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/asn/form.asn.tpl.html
@@ -0,0 +1,56 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb">
+            <li><a ng-click="navigateToPath('/admin/asns')">ASNs</a></li>
+            <li class="active">{{asnName}}</li>
+        </ol>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="asnForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(asnForm.asn), 'has-feedback': hasError(asnForm.asn)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">ASN *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="asn" name="asn" type="text" class="form-control" ng-model="asn.asn" ng-required="true" ng-maxlength="11" ng-pattern="/^\d+$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(asnForm.asn, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(asnForm.asn, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(asnForm.asn, 'pattern')">Number</small>
+                    <span ng-show="hasError(asnForm.asn)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(asnForm.cachegroup), 'has-feedback': hasError(asnForm.cachegroup)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Cache Group *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="cachegroup" name="cachegroup" class="form-control" ng-model="asn.cachegroupId" ng-options="cachegroup.id as cachegroup.name for cachegroup in cachegroups" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(asnForm.cachegroup, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(asn)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="asnForm.$pristine || asnForm.$invalid" ng-click="save(asn)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/asn/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/asn/index.js b/traffic_portal/app/src/common/modules/form/asn/index.js
new file mode 100644
index 0000000..5139e03
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/asn/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.asn', [])
+    .controller('FormASNController', require('./FormASNController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/asn/new/FormNewASNController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/asn/new/FormNewASNController.js b/traffic_portal/app/src/common/modules/form/asn/new/FormNewASNController.js
new file mode 100644
index 0000000..a6b8790
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/asn/new/FormNewASNController.js
@@ -0,0 +1,39 @@
+/*
+ * 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 FormNewASNController = function(asn, $scope, $controller, asnService) {
+
+    // extends the FormASNController to inherit common methods
+    angular.extend(this, $controller('FormASNController', { asn: asn, $scope: $scope }));
+
+    $scope.asnName = 'New';
+
+    $scope.settings = {
+        isNew: true,
+        saveLabel: 'Create'
+    };
+
+    $scope.save = function(asn) {
+        asnService.createASN(asn);
+    };
+
+};
+
+FormNewASNController.$inject = ['asn', '$scope', '$controller', 'asnService'];
+module.exports = FormNewASNController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/asn/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/asn/new/index.js b/traffic_portal/app/src/common/modules/form/asn/new/index.js
new file mode 100644
index 0000000..345328d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/asn/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.asn.new', [])
+    .controller('FormNewASNController', require('./FormNewASNController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js b/traffic_portal/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js
new file mode 100644
index 0000000..5eb334d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cacheGroup/FormCacheGroupController.js
@@ -0,0 +1,69 @@
+/*
+ * 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 FormCacheGroupController = function(cacheGroup, $scope, $location, formUtils, locationUtils, cacheGroupService, typeService) {
+
+    var getCacheGroups = function() {
+        cacheGroupService.getCacheGroups()
+            .then(function(result) {
+                $scope.cacheGroups = result;
+            });
+    };
+
+    var getTypes = function() {
+        typeService.getTypes({ useInTable: 'cachegroup' })
+            .then(function(result) {
+                $scope.types = result;
+            });
+    };
+
+    $scope.cacheGroup = cacheGroup;
+
+    $scope.viewAsns = function() {
+        $location.path($location.path() + '/asns');
+    };
+
+    $scope.viewParams = function() {
+        $location.path($location.path() + '/parameters');
+    };
+
+    $scope.viewServers = function() {
+        $location.path($location.path() + '/servers');
+    };
+
+    $scope.viewStaticDnsEntries = function() {
+        $location.path($location.path() + '/static-dns-entries');
+    };
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
+    $scope.hasError = formUtils.hasError;
+
+    $scope.hasPropertyError = formUtils.hasPropertyError;
+
+    var init = function () {
+        getCacheGroups();
+        getTypes();
+    };
+    init();
+
+};
+
+FormCacheGroupController.$inject = ['cacheGroup', '$scope', '$location', 'formUtils', 'locationUtils', 'cacheGroupService', 'typeService'];
+module.exports = FormCacheGroupController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/cacheGroup/edit/FormEditCacheGroupController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/cacheGroup/edit/FormEditCacheGroupController.js b/traffic_portal/app/src/common/modules/form/cacheGroup/edit/FormEditCacheGroupController.js
new file mode 100644
index 0000000..e32e016
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cacheGroup/edit/FormEditCacheGroupController.js
@@ -0,0 +1,130 @@
+/*
+ * 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 FormEditCacheGroupController = function(cacheGroup, $scope, $controller, $uibModal, $anchorScroll, locationUtils, cacheGroupService) {
+
+    // extends the FormCacheGroupController to inherit common methods
+    angular.extend(this, $controller('FormCacheGroupController', { cacheGroup: cacheGroup, $scope: $scope }));
+
+    $scope.cacheGroupName = angular.copy(cacheGroup.name);
+
+    $scope.settings = {
+        isNew: false,
+        saveLabel: 'Update'
+    };
+
+    var deleteCacheGroup = function(cacheGroup) {
+        cacheGroupService.deleteCacheGroup(cacheGroup.id)
+            .then(function() {
+                locationUtils.navigateToPath('/configure/cache-groups');
+            });
+    };
+
+    var queueServerUpdates = function(cacheGroup, cdnId) {
+        cacheGroupService.queueServerUpdates(cacheGroup.id, cdnId);
+    };
+
+    var clearServerUpdates = function(cacheGroup, cdnId) {
+        cacheGroupService.clearServerUpdates(cacheGroup.id, cdnId);
+    };
+
+    $scope.save = function(cacheGroup) {
+        cacheGroupService.updateCacheGroup(cacheGroup).
+            then(function() {
+                $scope.cacheGroupName = angular.copy(cacheGroup.name);
+                $anchorScroll(); // scrolls window to top
+            });
+    };
+
+    $scope.confirmDelete = function(cacheGroup) {
+        var params = {
+            title: 'Delete Cache Group: ' + cacheGroup.name,
+            key: cacheGroup.name
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+            controller: 'DialogDeleteController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                }
+            }
+        });
+        modalInstance.result.then(function() {
+            deleteCacheGroup(cacheGroup);
+        }, function () {
+            // do nothing
+        });
+    };
+
+    $scope.confirmQueueServerUpdates = function(cacheGroup) {
+        var params = {
+            title: 'Queue Server Updates: ' + cacheGroup.name,
+            message: "Please select a CDN"
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+            controller: 'DialogSelectController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                },
+                collection: function(cdnService) {
+                    return cdnService.getCDNs();
+                }
+            }
+        });
+        modalInstance.result.then(function(cdn) {
+            queueServerUpdates(cacheGroup, cdn.id);
+        }, function () {
+            // do nothing
+        });
+    };
+
+    $scope.confirmClearServerUpdates = function(cacheGroup) {
+        var params = {
+            title: 'Clear Server Updates: ' + cacheGroup.name,
+            message: "Please select a CDN"
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/select/dialog.select.tpl.html',
+            controller: 'DialogSelectController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                },
+                collection: function(cdnService) {
+                    return cdnService.getCDNs();
+                }
+            }
+        });
+        modalInstance.result.then(function(cdn) {
+            clearServerUpdates(cacheGroup, cdn.id);
+        }, function () {
+            // do nothing
+        });
+    };
+
+};
+
+FormEditCacheGroupController.$inject = ['cacheGroup', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'cacheGroupService'];
+module.exports = FormEditCacheGroupController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/cacheGroup/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/cacheGroup/edit/index.js b/traffic_portal/app/src/common/modules/form/cacheGroup/edit/index.js
new file mode 100644
index 0000000..836befe
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cacheGroup/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.cacheGroup.edit', [])
+    .controller('FormEditCacheGroupController', require('./FormEditCacheGroupController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html b/traffic_portal/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html
new file mode 100644
index 0000000..2965029
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cacheGroup/form.cacheGroup.tpl.html
@@ -0,0 +1,123 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/configure/cache-groups')">Cache Groups</a></li>
+            <li class="active">{{cacheGroupName}}</li>
+        </ol>
+        <div class="pull-right" ng-show="!settings.isNew">
+            <div class="btn-group" role="group" uib-dropdown is-open="queue.isopen">
+                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    Queue Updates&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="confirmQueueServerUpdates(cacheGroup)"><i class="fa fa-flag"></i>&nbsp;&nbsp;Queue {{cacheGroupName}} Server Updates</a></li>
+                    <li role="menuitem"><a ng-click="confirmClearServerUpdates(cacheGroup)"><i class="fa fa-ban"></i>&nbsp;&nbsp;Clear {{cacheGroupName}} Server Updates</a></li>
+                </ul>
+            </div>
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="viewAsns()">View ASNs</a></li>
+                    <li role="menuitem"><a ng-click="viewParams()">View Parameters</a></li>
+                    <li role="menuitem"><a ng-click="viewServers()">View Servers</a></li>
+                    <li role="menuitem"><a ng-click="viewStaticDnsEntries()">View Static DNS Entries</a></li>
+                </ul>
+            </div>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="cacheGroupForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(cacheGroupForm.name), 'has-feedback': hasError(cacheGroupForm.name)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Name *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="name" name="name" type="text" class="form-control" ng-model="cacheGroup.name" ng-required="true" ng-maxlength="45" ng-pattern="/^\S*$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.name, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.name, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.name, 'pattern')">No spaces</small>
+                    <span ng-show="hasError(cacheGroupForm.name)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(cacheGroupForm.shortName), 'has-feedback': hasError(cacheGroupForm.shortName)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Short Name *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="shortName" name="shortName" type="text" class="form-control" ng-model="cacheGroup.shortName" ng-required="true" ng-maxlength="255" ng-pattern="/^\S*$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.shortName, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.shortName, 'maxlength')">Too Long</small>
+                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.shortName, 'pattern')">No spaces</small>
+                    <span ng-show="hasError(cacheGroupForm.shortName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(cacheGroupForm.latitude), 'has-feedback': hasError(cacheGroupForm.latitude)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Latitude *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="latitude" name="latitude" type="text" class="form-control" ng-model="cacheGroup.latitude" ng-pattern="/^[-+]?[0-9]*\.?[0-9]+$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.latitude, 'pattern')">Invalid coordinate</small>
+                    <span ng-show="hasError(cacheGroupForm.latitude)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(cacheGroupForm.longitude), 'has-feedback': hasError(cacheGroupForm.longitude)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Longitude *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="longitude" name="longitude" type="text" class="form-control" ng-model="cacheGroup.longitude" ng-pattern="/^[-+]?[0-9]*\.?[0-9]+$/" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.longitude, 'pattern')">Invalid coordinate</small>
+                    <span ng-show="hasError(cacheGroupForm.longitude)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(cacheGroupForm.type), 'has-feedback': hasError(cacheGroupForm.type)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Type *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="type" name="type" class="form-control" ng-model="cacheGroup.typeId" ng-options="type.id as type.name for type in types" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.type, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(cacheGroupForm.parentCacheGroup), 'has-feedback': hasError(cacheGroupForm.parentCacheGroup)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Parent Cache Group *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="parentCacheGroup" name="parentCacheGroup" class="form-control" ng-model="cacheGroup.parentCachegroupId" ng-options="cacheGroup.id as cacheGroup.name for cacheGroup in cacheGroups" required>
+                        <option value="">Select...</option>
+                    </select>
+                    <small class="input-error" ng-show="hasPropertyError(cacheGroupForm.parentCacheGroup, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="form-group">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Secondary Parent Cache Group</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="secondaryParentCacheGroup" name="secondaryParentCacheGroup" class="form-control" ng-model="cacheGroup.secondaryParentCachegroupId" ng-options="cacheGroup.id as cacheGroup.name for cacheGroup in cacheGroups">
+                        <option value="">Select...</option>
+                    </select>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(cacheGroup)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="cacheGroupForm.$pristine || cacheGroupForm.$invalid" ng-click="save(cacheGroup)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/cacheGroup/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/cacheGroup/index.js b/traffic_portal/app/src/common/modules/form/cacheGroup/index.js
new file mode 100644
index 0000000..5446dfa
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cacheGroup/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.cacheGroup', [])
+    .controller('FormCacheGroupController', require('./FormCacheGroupController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/cacheGroup/new/FormNewCacheGroupController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/cacheGroup/new/FormNewCacheGroupController.js b/traffic_portal/app/src/common/modules/form/cacheGroup/new/FormNewCacheGroupController.js
new file mode 100644
index 0000000..6f5896f
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cacheGroup/new/FormNewCacheGroupController.js
@@ -0,0 +1,39 @@
+/*
+ * 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 FormNewCacheGroupController = function(cacheGroup, $scope, $controller, cacheGroupService) {
+
+    // extends the FormCacheGroupController to inherit common methods
+    angular.extend(this, $controller('FormCacheGroupController', { cacheGroup: cacheGroup, $scope: $scope }));
+
+    $scope.cacheGroupName = 'New';
+
+    $scope.settings = {
+        isNew: true,
+        saveLabel: 'Create'
+    };
+
+    $scope.save = function(cacheGroup) {
+        cacheGroupService.createCacheGroup(cacheGroup);
+    };
+
+};
+
+FormNewCacheGroupController.$inject = ['cacheGroup', '$scope', '$controller', 'cacheGroupService'];
+module.exports = FormNewCacheGroupController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/cacheGroup/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/cacheGroup/new/index.js b/traffic_portal/app/src/common/modules/form/cacheGroup/new/index.js
new file mode 100644
index 0000000..5c238c0
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cacheGroup/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.cacheGroup.new', [])
+    .controller('FormNewCacheGroupController', require('./FormNewCacheGroupController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/cdn/FormCDNController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/cdn/FormCDNController.js b/traffic_portal/app/src/common/modules/form/cdn/FormCDNController.js
new file mode 100644
index 0000000..c628ff7
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cdn/FormCDNController.js
@@ -0,0 +1,70 @@
+/*
+ * 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 FormCDNController = function(cdn, $scope, $location, formUtils, stringUtils, locationUtils, cdnService) {
+
+    $scope.cdn = cdn;
+
+    $scope.falseTrue = [
+        { value: false, label: 'false' },
+        { value: true, label: 'true' }
+    ];
+
+    $scope.manageDNSSEC = function() {
+        alert('not hooked up yet: manageDNSSEC for CDN');
+    };
+
+    $scope.manageSSL = function() {
+        alert('not hooked up yet: manageSSL for cdn');
+    };
+
+    $scope.queueServerUpdates = function(cdn) {
+        cdnService.queueServerUpdates(cdn.id);
+    };
+
+    $scope.clearServerUpdates = function(cdn) {
+        cdnService.clearServerUpdates(cdn.id);
+    };
+
+    $scope.viewConfig = function() {
+        $location.path($location.path() + '/config/changes');
+    };
+
+    $scope.viewProfiles = function() {
+        $location.path($location.path() + '/profiles');
+    };
+
+    $scope.viewServers = function() {
+        $location.path($location.path() + '/servers');
+    };
+
+    $scope.viewDeliveryServices = function() {
+        $location.path($location.path() + '/delivery-services');
+    };
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
+    $scope.hasError = formUtils.hasError;
+
+    $scope.hasPropertyError = formUtils.hasPropertyError;
+
+};
+
+FormCDNController.$inject = ['cdn', '$scope', '$location', 'formUtils', 'stringUtils', 'locationUtils', 'cdnService'];
+module.exports = FormCDNController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/cdn/edit/FormEditCDNController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/cdn/edit/FormEditCDNController.js b/traffic_portal/app/src/common/modules/form/cdn/edit/FormEditCDNController.js
new file mode 100644
index 0000000..701fc59
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cdn/edit/FormEditCDNController.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.
+ */
+
+var FormEditCDNController = function(cdn, $scope, $controller, $uibModal, $anchorScroll, locationUtils, cdnService) {
+
+    // extends the FormCDNController to inherit common methods
+    angular.extend(this, $controller('FormCDNController', { cdn: cdn, $scope: $scope }));
+
+    var deleteCDN = function(cdn) {
+        cdnService.deleteCDN(cdn.id)
+            .then(function() {
+                locationUtils.navigateToPath('/admin/cdns');
+            });
+    };
+
+    $scope.cdnName = angular.copy(cdn.name);
+
+    $scope.settings = {
+        isNew: false,
+        saveLabel: 'Update'
+    };
+
+    $scope.save = function(cdn) {
+        cdnService.updateCDN(cdn).
+            then(function() {
+                $scope.cdnName = angular.copy(cdn.name);
+                $anchorScroll(); // scrolls window to top
+            });
+    };
+
+    $scope.confirmDelete = function(cdn) {
+        var params = {
+            title: 'Delete CDN: ' + cdn.name,
+            key: cdn.name
+        };
+        var modalInstance = $uibModal.open({
+            templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+            controller: 'DialogDeleteController',
+            size: 'md',
+            resolve: {
+                params: function () {
+                    return params;
+                }
+            }
+        });
+        modalInstance.result.then(function() {
+            deleteCDN(cdn);
+        }, function () {
+            // do nothing
+        });
+    };
+
+};
+
+FormEditCDNController.$inject = ['cdn', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'cdnService'];
+module.exports = FormEditCDNController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/cdn/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/cdn/edit/index.js b/traffic_portal/app/src/common/modules/form/cdn/edit/index.js
new file mode 100644
index 0000000..09e4942
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cdn/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.cdn.edit', [])
+    .controller('FormEditCDNController', require('./FormEditCDNController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/cdn/form.cdn.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/cdn/form.cdn.tpl.html b/traffic_portal/app/src/common/modules/form/cdn/form.cdn.tpl.html
new file mode 100644
index 0000000..b3d6f0d
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cdn/form.cdn.tpl.html
@@ -0,0 +1,89 @@
+<!--
+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="x_panel">
+    <div class="x_title">
+        <ol class="breadcrumb pull-left">
+            <li><a ng-click="navigateToPath('/admin/cdns')">CDNs</a></li>
+            <li class="active">{{cdnName}}</li>
+        </ol>
+        <div class="pull-right" ng-show="!settings.isNew">
+            <button class="btn btn-primary" title="Diff CDN Snapshot" ng-click="viewConfig()"><i class="fa fa-camera"></i>&nbsp;&nbsp;Diff CDN Config Snapshot</button>
+            <div class="btn-group" role="group" uib-dropdown is-open="queue.isopen">
+                <button type="button" class="btn btn-primary dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    Queue Updates&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="queueServerUpdates(cdn)">Queue {{cdn.name}} Server Updates</a></li>
+                    <li role="menuitem"><a ng-click="clearServerUpdates(cdn)">Clear {{cdn.name}} Server Updates</a></li>
+                </ul>
+            </div>
+            <div class="btn-group" role="group" uib-dropdown is-open="more.isopen">
+                <button type="button" class="btn btn-default dropdown-toggle" uib-dropdown-toggle aria-haspopup="true" aria-expanded="false">
+                    More&nbsp;
+                    <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu-right dropdown-menu" uib-dropdown-menu>
+                    <li role="menuitem"><a ng-click="manageDNSSEC()">Manage DNSSEC Keys</a></li>
+                    <li role="menuitem"><a ng-click="manageSSL()">Manage SSL Keys</a></li>
+                    <li class="divider"></li>
+                    <li role="menuitem"><a ng-click="viewDeliveryServices()">View Delivery Services</a></li>
+                    <li role="menuitem"><a ng-click="viewProfiles()">View Profiles</a></li>
+                    <li role="menuitem"><a ng-click="viewServers()">View Servers</a></li>
+                </ul>
+            </div>
+        </div>
+        <div class="clearfix"></div>
+    </div>
+    <div class="x_content">
+        <br>
+        <form name="cdnForm" class="form-horizontal form-label-left" novalidate>
+            <div class="form-group" ng-class="{'has-error': hasError(cdnForm.name), 'has-feedback': hasError(cdnForm.name)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Name *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="name" name="name" type="text" class="form-control" ng-model="cdn.name" ng-required="true" ng-maxlength="45" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(cdnForm.name, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(cdnForm.name, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(cdnForm.name)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(cdnForm.domainName), 'has-feedback': hasError(cdnForm.domainName)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">Domain *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <input id="domainName" name="domainName" type="text" class="form-control" ng-model="cdn.domainName" ng-required="true" ng-maxlength="255" autofocus>
+                    <small class="input-error" ng-show="hasPropertyError(cdnForm.domainName, 'required')">Required</small>
+                    <small class="input-error" ng-show="hasPropertyError(cdnForm.domainName, 'maxlength')">Too Long</small>
+                    <span ng-show="hasError(cdnForm.domainName)" class="form-control-feedback"><i class="fa fa-times"></i></span>
+                </div>
+            </div>
+            <div class="form-group" ng-class="{'has-error': hasError(cdnForm.dnssecEnabled), 'has-feedback': hasError(cdnForm.dnssecEnabled)}">
+                <label class="control-label col-md-2 col-sm-2 col-xs-12">DNSSEC Enabled *</label>
+                <div class="col-md-10 col-sm-10 col-xs-12">
+                    <select id="dnssecEnabled" name="dnssecEnabled" class="form-control" ng-model="cdn.dnssecEnabled" ng-options="x.value as x.label for x in falseTrue" required></select>
+                    <small class="input-error" ng-show="hasPropertyError(cdnForm.dnssecEnabled, 'required')">Required</small>
+                </div>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-danger" ng-show="!settings.isNew" ng-click="confirmDelete(cdn)">Delete</button>
+                <button type="button" class="btn btn-success" ng-disabled="cdnForm.$pristine || cdnForm.$invalid" ng-click="save(cdn)">{{settings.saveLabel}}</button>
+            </div>
+        </form>
+    </div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/cdn/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/cdn/index.js b/traffic_portal/app/src/common/modules/form/cdn/index.js
new file mode 100644
index 0000000..ab98f1a
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cdn/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.cdn', [])
+    .controller('FormCDNController', require('./FormCDNController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/cdn/new/FormNewCDNController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/cdn/new/FormNewCDNController.js b/traffic_portal/app/src/common/modules/form/cdn/new/FormNewCDNController.js
new file mode 100644
index 0000000..10feead
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cdn/new/FormNewCDNController.js
@@ -0,0 +1,39 @@
+/*
+ * 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 FormNewCDNController = function(cdn, $scope, $controller, cdnService) {
+
+    // extends the FormCDNController to inherit common methods
+    angular.extend(this, $controller('FormCDNController', { cdn: cdn, $scope: $scope }));
+
+    $scope.cdnName = 'New';
+
+    $scope.settings = {
+        isNew: true,
+        saveLabel: 'Create'
+    };
+
+    $scope.save = function(cdn) {
+        cdnService.createCDN(cdn)
+    };
+
+};
+
+FormNewCDNController.$inject = ['cdn', '$scope', '$controller', 'cdnService'];
+module.exports = FormNewCDNController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/cdn/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/cdn/new/index.js b/traffic_portal/app/src/common/modules/form/cdn/new/index.js
new file mode 100644
index 0000000..4566629
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/cdn/new/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.cdn.new', [])
+    .controller('FormNewCDNController', require('./FormNewCDNController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js b/traffic_portal/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
new file mode 100644
index 0000000..69d0b89
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/FormDeliveryServiceController.js
@@ -0,0 +1,161 @@
+/*
+ * 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 FormDeliveryServiceController = function(deliveryService, types, $scope, $location, formUtils, locationUtils, cdnService, profileService, typeService) {
+
+    var getCDNs = function() {
+        cdnService.getCDNs()
+            .then(function(result) {
+                $scope.cdns = result;
+            });
+    };
+
+    var getProfiles = function() {
+        profileService.getProfiles()
+            .then(function(result) {
+                $scope.profiles = _.filter(result, function(profile) {
+                    return profile.type == 'DS_PROFILE';
+                });
+            });
+    };
+
+    $scope.deliveryService = deliveryService;
+
+    $scope.types = types;
+
+    $scope.falseTrue = [
+        { value: false, label: 'false' },
+        { value: true, label: 'true' }
+    ];
+
+    $scope.protocols = [
+        { value: 0, label: '0 - HTTP' },
+        { value: 1, label: '1 - HTTPS' },
+        { value: 2, label: '2 - HTTP AND HTTPS' },
+        { value: 3, label: '3 - HTTP TO HTTPS' }
+    ];
+
+    $scope.qStrings = [
+        { value: 0, label: '0 - use qstring in cache key, and pass up' },
+        { value: 1, label: '1 - ignore in cache key, and pass up' },
+        { value: 2, label: '2 - drop at edge' }
+    ];
+
+    $scope.geoLimits = [
+        { value: 0, label: '0 - None' },
+        { value: 1, label: '1 - CZF only' },
+        { value: 2, label: '2 - CZF + Country Code(s)' }
+    ];
+
+    $scope.geoProviders = [
+        { value: 0, label: '0 - Maxmind (Default)' },
+        { value: 1, label: '1 - Neustar' }
+    ];
+
+    $scope.dscps = [
+        { value: 0, label: '0  - Best Effort' },
+        { value: 10, label: '10 - AF11' },
+        { value: 12, label: '12 - AF12' },
+        { value: 14, label: '14 - AF13' },
+        { value: 18, label: '18  - AF21' },
+        { value: 20, label: '20  - AF22' },
+        { value: 22, label: '22  - AF23' },
+        { value: 26, label: '26  - AF31' },
+        { value: 28, label: '28  - AF32' },
+        { value: 30, label: '30  - AF33' },
+        { value: 34, label: '34  - AF41' },
+        { value: 36, label: '36  - AF42' },
+        { value: 37, label: '37  - ' },
+        { value: 38, label: '38  - AF43' },
+        { value: 8, label: '8  - CS1' },
+        { value: 16, label: '16  - CS2' },
+        { value: 24, label: '24  - CS3' },
+        { value: 32, label: '32  - CS4' },
+        { value: 40, label: '40  - CS5' },
+        { value: 48, label: '48  - CS6' },
+        { value: 56, label: '56  - CS7' }
+    ];
+
+    $scope.dispersions = [
+        { value: 1, label: '1 - OFF' },
+        { value: 2, label: '2' },
+        { value: 3, label: '3' },
+        { value: 4, label: '4' },
+        { value: 5, label: '5' },
+        { value: 6, label: '6' },
+        { value: 7, label: '7' },
+        { value: 8, label: '8' },
+        { value: 9, label: '9' },
+        { value: 10, label: '10' }
+    ];
+
+    $scope.rrhs = [
+        { value: 0, label: "0 - Don't cache" },
+        { value: 1, label: "1 - Use background_fetch plugin" },
+        { value: 2, label: "2 - Use cache_range_requests plugin" }
+    ];
+
+    $scope.msoAlgos = [
+        { value: 0, label: "0 - Consistent Hash" },
+        { value: 1, label: "1 - Primary/Backup" },
+        { value: 2, label: "2 - Strict Round Robin" },
+        { value: 3, label: "3 - IP-based Round Robin" },
+        { value: 4, label: "4 - Latch on Failover" }
+    ];
+
+    $scope.viewServers = function() {
+        $location.path($location.path() + '/servers');
+    };
+
+    $scope.viewRegexes = function() {
+        $location.path($location.path() + '/regexes');
+    };
+
+    $scope.viewJobs = function() {
+        $location.path($location.path() + '/jobs');
+    };
+
+    $scope.manageSslKeys = function() {
+        alert('not hooked up yet: manageSslKeys for DS');
+    };
+
+    $scope.manageUrlSigKeys = function() {
+        alert('not hooked up yet: manageUrlSigKeys for DS');
+    };
+
+    $scope.viewStaticDnsEntries = function() {
+        $location.path($location.path() + '/static-dns-entries');
+    };
+
+    $scope.navigateToPath = locationUtils.navigateToPath;
+
+    $scope.hasError = formUtils.hasError;
+
+    $scope.hasPropertyError = formUtils.hasPropertyError;
+
+    var init = function () {
+        getCDNs();
+        getProfiles();
+    };
+    init();
+
+};
+
+FormDeliveryServiceController.$inject = ['deliveryService', 'types', '$scope', '$location', 'formUtils', 'locationUtils', 'cdnService', 'profileService', 'typeService'];
+module.exports = FormDeliveryServiceController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryService/edit/FormEditDeliveryServiceController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/edit/FormEditDeliveryServiceController.js b/traffic_portal/app/src/common/modules/form/deliveryService/edit/FormEditDeliveryServiceController.js
new file mode 100644
index 0000000..ba5b257
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/edit/FormEditDeliveryServiceController.js
@@ -0,0 +1,76 @@
+/*
+ * 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 FormEditDeliveryServiceController = function(deliveryService, type, types, $scope, $controller, $uibModal, $anchorScroll, locationUtils, deliveryServiceService) {
+
+	var filteredTypes = _.filter(types, function(currentType) {
+		return currentType.name.indexOf(type) != -1;
+	});
+
+	// extends the FormDeliveryServiceController to inherit common methods
+	angular.extend(this, $controller('FormDeliveryServiceController', { deliveryService: deliveryService, types: filteredTypes, $scope: $scope }));
+
+	var deleteDeliveryService = function(deliveryService) {
+		deliveryServiceService.deleteDeliveryService(deliveryService.id)
+			.then(function() {
+				locationUtils.navigateToPath('/configure/delivery-services');
+			});
+	};
+
+	$scope.deliveryServiceName = angular.copy(deliveryService.displayName);
+
+	$scope.settings = {
+		isNew: false,
+		saveLabel: 'Update'
+	};
+
+	$scope.save = function(deliveryService) {
+		deliveryServiceService.updateDeliveryService(deliveryService).
+		then(function() {
+			$scope.deliveryServiceName = angular.copy(deliveryService.displayName);
+			$anchorScroll(); // scrolls window to top
+		});
+	};
+
+	$scope.confirmDelete = function(deliveryService) {
+		var params = {
+			title: 'Delete Delivery Service: ' + deliveryService.displayName,
+			key: deliveryService.xmlId
+		};
+		var modalInstance = $uibModal.open({
+			templateUrl: 'common/modules/dialog/delete/dialog.delete.tpl.html',
+			controller: 'DialogDeleteController',
+			size: 'md',
+			resolve: {
+				params: function () {
+					return params;
+				}
+			}
+		});
+		modalInstance.result.then(function() {
+			deleteDeliveryService(deliveryService);
+		}, function () {
+			// do nothing
+		});
+	};
+
+};
+
+FormEditDeliveryServiceController.$inject = ['deliveryService', 'type', 'types', '$scope', '$controller', '$uibModal', '$anchorScroll', 'locationUtils', 'deliveryServiceService'];
+module.exports = FormEditDeliveryServiceController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/common/modules/form/deliveryService/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/common/modules/form/deliveryService/edit/index.js b/traffic_portal/app/src/common/modules/form/deliveryService/edit/index.js
new file mode 100644
index 0000000..88eb073
--- /dev/null
+++ b/traffic_portal/app/src/common/modules/form/deliveryService/edit/index.js
@@ -0,0 +1,21 @@
+/*
+ * 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.form.deliveryService.edit', [])
+	.controller('FormEditDeliveryServiceController', require('./FormEditDeliveryServiceController'));


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/HttpService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/HttpService.js b/traffic_ops/experimental/ui/app/src/common/api/HttpService.js
deleted file mode 100644
index a74b7ff..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/HttpService.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var HttpService = function($http, $q) {
-
-    this.get = function(resource) {
-        var deferred = $q.defer();
-
-        $http.get(resource)
-            .then(
-                function(result) {
-                    deferred.resolve(result);
-                },
-                function(fault) {
-                    deferred.reject(fault);
-                }
-            );
-
-        return deferred.promise;
-    };
-
-    this.post = function(resource, payload) {
-        var deferred = $q.defer();
-
-        $http.post(resource, payload)
-            .then(
-                function(result) {
-                    deferred.resolve(result);
-                },
-                function(fault) {
-                    deferred.reject(fault);
-                }
-            );
-
-        return deferred.promise;
-    };
-
-    this.put = function(resource, payload) {
-        var deferred = $q.defer();
-
-        $http.put(resource, payload)
-            .then(
-                function(result) {
-                    deferred.resolve(result.response);
-                },
-                function(fault) {
-                    deferred.reject(fault);
-                }
-            );
-
-        return deferred.promise;
-    };
-
-    this.delete = function(resource) {
-        var deferred = $q.defer();
-
-        $http.delete(resource)
-            .then(
-                function(result) {
-                    deferred.resolve(result.response);
-                },
-                function(fault) {
-                    deferred.reject(fault);
-                }
-            );
-
-        return deferred.promise;
-    };
-
-};
-
-HttpService.$inject = ['$http', '$q'];
-module.exports = HttpService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/JobService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/JobService.js b/traffic_ops/experimental/ui/app/src/common/api/JobService.js
deleted file mode 100644
index ab05d30..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/JobService.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var JobService = function(Restangular) {
-
-	this.getJobs = function(queryParams) {
-		return Restangular.all('jobs').getList(queryParams);
-	};
-
-	this.createJob = function(job) {
-		return Restangular.service('user/current/jobs').post(job);
-	};
-
-};
-
-JobService.$inject = ['Restangular'];
-module.exports = JobService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/ParameterService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/ParameterService.js b/traffic_ops/experimental/ui/app/src/common/api/ParameterService.js
deleted file mode 100644
index 21223f2..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/ParameterService.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ParameterService = function(Restangular, locationUtils, messageModel) {
-
-    this.getParameters = function(queryParams) {
-        return Restangular.all('parameters').getList(queryParams);
-    };
-
-    this.getParameter = function(id) {
-        return Restangular.one("parameters", id).get();
-    };
-
-    this.createParameter = function(parameter) {
-        return Restangular.service('parameters').post(parameter)
-            .then(
-            function() {
-                messageModel.setMessages([ { level: 'success', text: 'Parameter created' } ], true);
-                locationUtils.navigateToPath('/admin/parameters');
-            },
-            function(fault) {
-                messageModel.setMessages(fault.data.alerts, false);
-            }
-        );
-    };
-
-    this.updateParameter = function(parameter) {
-        return parameter.put()
-            .then(
-            function() {
-                messageModel.setMessages([ { level: 'success', text: 'Parameter updated' } ], false);
-            },
-            function(fault) {
-                messageModel.setMessages(fault.data.alerts, false);
-            }
-        );
-    };
-
-    this.deleteParameter = function(id) {
-        return Restangular.one("parameters", id).remove()
-            .then(
-            function() {
-                messageModel.setMessages([ { level: 'success', text: 'Parameter deleted' } ], true);
-            },
-            function(fault) {
-                messageModel.setMessages(fault.data.alerts, true);
-            }
-        );
-    };
-
-    this.getProfileParameters = function(profileId) {
-        return Restangular.one('profiles', profileId).getList('parameters');
-    };
-
-    this.getProfileUnassignedParams = function(profileId) {
-        return Restangular.one('profiles', profileId).getList('unassigned_parameters');
-    };
-
-    this.getCacheGroupUnassignedParams = function(cgId) {
-        return Restangular.one('cachegroups', cgId).getList('unassigned_parameters');
-    };
-
-};
-
-ParameterService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
-module.exports = ParameterService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/PhysLocationService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/PhysLocationService.js b/traffic_ops/experimental/ui/app/src/common/api/PhysLocationService.js
deleted file mode 100644
index 9ddf07a..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/PhysLocationService.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var PhysLocationService = function(Restangular, locationUtils, messageModel) {
-
-    this.getPhysLocations = function(queryParams) {
-        return Restangular.all('phys_locations').getList(queryParams);
-    };
-
-    this.getPhysLocation = function(id) {
-        return Restangular.one("phys_locations", id).get();
-    };
-
-    this.createPhysLocation = function(physLocation) {
-        return Restangular.service('phys_locations').post(physLocation)
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Physical location created' } ], true);
-                    locationUtils.navigateToPath('/admin/phys-locations');
-
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.updatePhysLocation = function(physLocation) {
-        return physLocation.put()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Physical location updated' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.deletePhysLocation = function(id) {
-        return Restangular.one("phys_locations", id).remove()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Physical location deleted' } ], true);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-            );
-    };
-
-};
-
-PhysLocationService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
-module.exports = PhysLocationService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/ProfileParameterService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/ProfileParameterService.js b/traffic_ops/experimental/ui/app/src/common/api/ProfileParameterService.js
deleted file mode 100644
index a81678d..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/ProfileParameterService.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ProfileParameterService = function(Restangular, httpService, messageModel, ENV) {
-
-	this.unlinkProfileParameter = function(profileId, paramId) {
-		return httpService.delete(ENV.api['root'] + 'profileparameters/' + profileId + '/' + paramId)
-			.then(
-				function() {
-					messageModel.setMessages([ { level: 'success', text: 'Profile and parameter were unlinked.' } ], false);
-				},
-				function(fault) {
-					messageModel.setMessages(fault.data.alerts, true);
-				}
-			);
-	};
-
-	this.linkProfileParameters = function(profileParamMappings) {
-		return Restangular.service('profileparameters').post(profileParamMappings)
-			.then(
-				function() {
-					messageModel.setMessages([ { level: 'success', text: 'Parameters linked to profile' } ], false);
-				},
-				function(fault) {
-					messageModel.setMessages(fault.data.alerts, false);
-				}
-			);
-	};
-
-};
-
-ProfileParameterService.$inject = ['Restangular', 'httpService', 'messageModel', 'ENV'];
-module.exports = ProfileParameterService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/ProfileService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/ProfileService.js b/traffic_ops/experimental/ui/app/src/common/api/ProfileService.js
deleted file mode 100644
index d7c9df9..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/ProfileService.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ProfileService = function(Restangular, locationUtils, messageModel) {
-
-    this.getProfiles = function(queryParams) {
-        return Restangular.all('profiles').getList(queryParams);
-    };
-
-    this.getProfile = function(id) {
-        return Restangular.one("profiles", id).get();
-    };
-
-    this.createProfile = function(profile) {
-        return Restangular.service('profiles').post(profile)
-            .then(
-            function() {
-                messageModel.setMessages([ { level: 'success', text: 'Profile created' } ], true);
-                locationUtils.navigateToPath('/admin/profiles');
-            },
-            function(fault) {
-                messageModel.setMessages(fault.data.alerts, false);
-            }
-        );
-    };
-
-    this.updateProfile = function(profile) {
-        return profile.put()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Profile updated' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-        );
-    };
-
-    this.deleteProfile = function(id) {
-        return Restangular.one("profiles", id).remove()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Profile deleted' } ], true);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-        );
-    };
-
-    this.getParameterProfiles = function(paramId) {
-        return Restangular.one('parameters', paramId).getList('profiles');
-    };
-
-    this.getParamUnassignedProfiles = function(paramId) {
-        return Restangular.one('parameters', paramId).getList('unassigned_profiles');
-    };
-
-
-};
-
-ProfileService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
-module.exports = ProfileService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/RegexService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/RegexService.js b/traffic_ops/experimental/ui/app/src/common/api/RegexService.js
deleted file mode 100644
index fcd3a64..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/RegexService.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var RegexService = function(Restangular, locationUtils, messageModel) {
-
-	this.getRegexes = function(dsId) {
-		return Restangular.all('deliveryservices_regexes').getList({ dsId: dsId });
-	};
-
-};
-
-RegexService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
-module.exports = RegexService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/RegionService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/RegionService.js b/traffic_ops/experimental/ui/app/src/common/api/RegionService.js
deleted file mode 100644
index d8d87e9..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/RegionService.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var RegionService = function(Restangular, messageModel) {
-
-    this.getRegions = function(queryParams) {
-        return Restangular.all('regions').getList(queryParams);
-    };
-
-    this.getRegion = function(id) {
-        return Restangular.one("regions", id).get();
-    };
-
-    this.createRegion = function(region) {
-        return Restangular.service('regions').post(region)
-            .then(
-            function() {
-                messageModel.setMessages([ { level: 'success', text: 'Region created' } ], true);
-            },
-            function(fault) {
-                messageModel.setMessages(fault.data.alerts, false);
-            }
-        );
-    };
-
-    this.updateRegion = function(region) {
-        return region.put()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Region updated' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.deleteRegion = function(id) {
-        return Restangular.one("regions", id).remove()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Region deleted' } ], true);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-            );
-    };
-
-};
-
-RegionService.$inject = ['Restangular', 'messageModel'];
-module.exports = RegionService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/RoleService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/RoleService.js b/traffic_ops/experimental/ui/app/src/common/api/RoleService.js
deleted file mode 100644
index bcd9b3b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/RoleService.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var RoleService = function(Restangular, messageModel) {
-
-    this.getRoles = function(queryParams) {
-        return Restangular.all('roles').getList(queryParams);
-    };
-
-    this.getRole = function(id) {
-        return Restangular.one("roles", id).get();
-    };
-
-    this.updateRole = function(role) {
-        return role.put()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Role updated' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-        );
-    };
-
-    this.deleteRole = function(id) {
-        return Restangular.one("roles", id).remove()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Role deleted' } ], true);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-        );
-    };
-
-};
-
-RoleService.$inject = ['Restangular', 'messageModel'];
-module.exports = RoleService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/ServerService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/ServerService.js b/traffic_ops/experimental/ui/app/src/common/api/ServerService.js
deleted file mode 100644
index 3aaffed..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/ServerService.js
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ServerService = function($http, $q, Restangular, locationUtils, messageModel, ENV) {
-
-    this.getServers = function(queryParams) {
-        return Restangular.all('servers').getList(queryParams);
-    };
-
-    this.getServer = function(id) {
-        return Restangular.one("servers", id).get();
-    };
-
-    this.createServer = function(server) {
-        return Restangular.service('servers').post(server)
-            .then(
-                function(response) {
-                    messageModel.setMessages([ { level: 'success', text: 'Server created' } ], true);
-                    locationUtils.navigateToPath('/configure/servers/' + response.id);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.updateServer = function(server) {
-        return server.put()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Server updated' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.deleteServer = function(id) {
-        return Restangular.one("servers", id).remove()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Server deleted' } ], true);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-            );
-    };
-
-    this.getDeliveryServiceServers = function(dsId) {
-        return Restangular.one('deliveryservices', dsId).getList('servers');
-    };
-
-    this.getUnassignedDeliveryServiceServers = function(dsId) {
-        return Restangular.one('deliveryservices', dsId).getList('servers/unassigned');
-    };
-
-    this.getEligibleDeliveryServiceServers = function(dsId) {
-        return Restangular.one('deliveryservices', dsId).getList('servers/eligible');
-    };
-
-    this.queueServerUpdates = function(id) {
-        return Restangular.one("servers", id).customPOST( { action: "queue"}, "queue_update" )
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Queued server updates' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.clearServerUpdates = function(id) {
-        return Restangular.one("servers", id).customPOST( { action: "dequeue"}, "queue_update" )
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Cleared server updates' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.getStatusCount = function() {
-        var request = $q.defer();
-
-        $http.get(ENV.api['root'] + "servers/status")
-            .then(
-                function(result) {
-                    request.resolve(result.data.response);
-                },
-                function() {
-                    request.reject();
-                }
-            );
-
-        return request.promise;
-    };
-
-    this.updateStatus = function(id, payload) {
-        var request = $q.defer();
-
-        $http.put(ENV.api['root'] + "servers/" + id + "/status", payload)
-            .then(
-                function(result) {
-                    request.resolve(result);
-                },
-                function(fault) {
-                    request.reject(fault);
-                }
-            );
-
-        return request.promise;
-    };
-
-};
-
-ServerService.$inject = ['$http', '$q', 'Restangular', 'locationUtils', 'messageModel', 'ENV'];
-module.exports = ServerService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/StaticDnsEntryService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/StaticDnsEntryService.js b/traffic_ops/experimental/ui/app/src/common/api/StaticDnsEntryService.js
deleted file mode 100644
index aa56365..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/StaticDnsEntryService.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var StaticDnsEntryService = function(Restangular) {
-
-	this.getStaticDnsEntries = function(queryParams) {
-		return Restangular.all('staticdnsentries').getList(queryParams);
-	};
-
-};
-
-StaticDnsEntryService.$inject = ['Restangular'];
-module.exports = StaticDnsEntryService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/StatusService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/StatusService.js b/traffic_ops/experimental/ui/app/src/common/api/StatusService.js
deleted file mode 100644
index dd656d8..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/StatusService.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var StatusService = function(Restangular, locationUtils, messageModel) {
-
-    this.getStatuses = function(queryParams) {
-        return Restangular.all('statuses').getList(queryParams);
-    };
-
-    this.getStatus = function(id) {
-        return Restangular.one("statuses", id).get();
-    };
-
-    this.createStatus = function(status) {
-        return Restangular.service('statuses').post(status)
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Status created' } ], true);
-                    locationUtils.navigateToPath('/admin/statuses');
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.updateStatus = function(status) {
-        return status.put()
-            .then(
-            function() {
-                messageModel.setMessages([ { level: 'success', text: 'Status updated' } ], false);
-            },
-            function(fault) {
-                messageModel.setMessages(fault.data.alerts, false);
-            }
-        );
-    };
-
-    this.deleteStatus = function(id) {
-        return Restangular.one("statuses", id).remove()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Status deleted' } ], true);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-        );
-    };
-
-};
-
-StatusService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
-module.exports = StatusService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/TenantService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/TenantService.js b/traffic_ops/experimental/ui/app/src/common/api/TenantService.js
deleted file mode 100644
index b350033..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/TenantService.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TenantService = function(Restangular, messageModel) {
-
-    this.getTenants = function(queryParams) {
-        return Restangular.all('tenants').getList(queryParams);
-    };
-
-    this.getTenant = function(id) {
-        return Restangular.one("tenants", id).get();
-    };
-
-    this.createTenant = function(tenant) {
-        return Restangular.service('tenants').post(tenant)
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Tenant created' } ], true);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-        );
-    };
-
-    this.updateTenant = function(tenant) {
-        return tenant.put()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Tenant updated' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.deleteTenant = function(id) {
-        return Restangular.one("tenants", id).remove()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Tenant deleted' } ], true);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-            );
-    };
-
-};
-
-TenantService.$inject = ['Restangular', 'messageModel'];
-module.exports = TenantService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/TrafficPortalService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/TrafficPortalService.js b/traffic_ops/experimental/ui/app/src/common/api/TrafficPortalService.js
deleted file mode 100644
index 857fcbf..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/TrafficPortalService.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TrafficPortalService = function($http, $q) {
-
-    this.getReleaseVersionInfo = function() {
-        var deferred = $q.defer();
-        $http.get('traffic_portal_release.json')
-            .then(
-                function(result) {
-                    deferred.resolve(result);
-                },
-                function(fault) {
-                    deferred.reject(fault);
-                }
-            );
-
-        return deferred.promise;
-    };
-
-    this.dumpDB = function() {
-        // todo: need to fix this so it is not hard-coded
-        window.location = 'http://localhost:3000/api/1.2/dbdump';
-    };
-
-    this.getProperties = function() {
-        var deferred = $q.defer();
-        $http.get('traffic_portal_properties.json')
-            .then(
-                function(result) {
-                    deferred.resolve(result.data.properties);
-                }
-            );
-
-        return deferred.promise;
-    };
-
-};
-
-TrafficPortalService.$inject = ['$http', '$q'];
-module.exports = TrafficPortalService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/TypeService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/TypeService.js b/traffic_ops/experimental/ui/app/src/common/api/TypeService.js
deleted file mode 100644
index 2ec57fd..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/TypeService.js
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var TypeService = function(Restangular, locationUtils, messageModel) {
-
-    this.getTypes = function(queryParams) {
-        return Restangular.all('types').getList(queryParams);
-    };
-
-    this.getType = function(id) {
-        return Restangular.one("types", id).get();
-    };
-
-    this.createType = function(type) {
-        return Restangular.service('types').post(type)
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Type created' } ], true);
-                    locationUtils.navigateToPath('/admin/types');
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.updateType = function(type) {
-        return type.put()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Type updated' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-        );
-    };
-
-    this.deleteType = function(id) {
-        return Restangular.one("types", id).remove()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Type deleted' } ], true);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-        );
-    };
-
-};
-
-TypeService.$inject = ['Restangular', 'locationUtils', 'messageModel'];
-module.exports = TypeService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/UserService.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/UserService.js b/traffic_ops/experimental/ui/app/src/common/api/UserService.js
deleted file mode 100644
index 3b187a1..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/UserService.js
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var UserService = function(Restangular, $http, $location, $q, authService, httpService, locationUtils, userModel, messageModel, ENV) {
-
-    var service = this;
-
-    this.getCurrentUser = function() {
-        var token = $location.search().token,
-            deferred = $q.defer();
-
-        if (angular.isDefined(token)) {
-            $location.search('token', null); // remove the token query param
-            authService.tokenLogin(token)
-                .then(
-                    function(response) {
-                        service.getCurrentUser();
-                    }
-                );
-        } else {
-            $http.get(ENV.api['root'] + "user/current")
-                .then(
-                    function(result) {
-                        userModel.setUser(result.data.response);
-                        deferred.resolve(result.data.response);
-                    },
-                    function(fault) {
-                        deferred.reject(fault);
-                    }
-                );
-
-            return deferred.promise;
-        }
-    };
-
-    this.getUsers = function(queryParams) {
-        return Restangular.all('users').getList(queryParams);
-    };
-
-    this.getUser = function(id) {
-        return Restangular.one("users", id).get();
-    };
-
-    this.createUser = function(user) {
-        return Restangular.service('users').post(user)
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'User created' } ], true);
-                    locationUtils.navigateToPath('/admin/users');
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-    this.updateUser = function(user) {
-        return $http.put(ENV.api['root'] + "users/" + user.id, user)
-            .then(
-                function() {
-                    if (userModel.user.id == user.id) {
-                        // if you are updating the currently logged in user...
-                        userModel.setUser(user);
-                    }
-                    messageModel.setMessages([ { level: 'success', text: 'User updated' } ], false);
-                },
-                function() {
-                    messageModel.setMessages([ { level: 'error', text: 'User updated failed' } ], false);
-                }
-            );
-    };
-
-    this.deleteUser = function(id) {
-        return Restangular.one("users", id).remove()
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'User deleted' } ], true);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-            );
-    };
-
-    this.getUnassignedUserDeliveryServices = function(userId) {
-        var deferred = $q.defer();
-
-        $http.get(ENV.api['root'] + "user/" + userId + "/deliveryservices/available")
-            .then(
-                function(result) {
-                    deferred.resolve(result.data.response);
-                },
-                function(fault) {
-                    deferred.reject(fault);
-                }
-            );
-
-        return deferred.promise;
-    };
-
-    this.deleteUserDeliveryService = function(userId, dsId) {
-        return httpService.delete(ENV.api['root'] + 'deliveryservice_user/' + dsId + '/' + userId)
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'User and delivery service were unlinked.' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, true);
-                }
-            );
-    };
-
-    this.assignUserDeliveryServices = function(userId, deliveryServices) {
-        return Restangular.service('deliveryservice_user').post( { userId: userId, deliveryServices: deliveryServices, replace: true } )
-            .then(
-                function() {
-                    messageModel.setMessages([ { level: 'success', text: 'Delivery services linked to user' } ], false);
-                },
-                function(fault) {
-                    messageModel.setMessages(fault.data.alerts, false);
-                }
-            );
-    };
-
-};
-
-UserService.$inject = ['Restangular', '$http', '$location', '$q', 'authService', 'httpService', 'locationUtils', 'userModel', 'messageModel', 'ENV'];
-module.exports = UserService;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/api/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/api/index.js b/traffic_ops/experimental/ui/app/src/common/api/index.js
deleted file mode 100644
index 1cfa851..0000000
--- a/traffic_ops/experimental/ui/app/src/common/api/index.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.api', [])
-    .service('authService', require('./AuthService'))
-    .service('asnService', require('./ASNService'))
-    .service('cacheGroupService', require('./CacheGroupService'))
-    .service('cacheGroupParameterService', require('./CacheGroupParameterService'))
-	.service('cacheStatsService', require('./CacheStatsService'))
-	.service('cdnService', require('./CDNService'))
-    .service('changeLogService', require('./ChangeLogService'))
-    .service('deliveryServiceService', require('./DeliveryServiceService'))
-	.service('deliveryServiceRegexService', require('./DeliveryServiceRegexService'))
-	.service('divisionService', require('./DivisionService'))
-    .service('httpService', require('./HttpService'))
-    .service('jobService', require('./JobService'))
-    .service('physLocationService', require('./PhysLocationService'))
-    .service('parameterService', require('./ParameterService'))
-    .service('profileService', require('./ProfileService'))
-    .service('profileParameterService', require('./ProfileParameterService'))
-    .service('roleService', require('./RoleService'))
-    .service('regionService', require('./RegionService'))
-    .service('serverService', require('./ServerService'))
-    .service('staticDnsEntryService', require('./StaticDnsEntryService'))
-    .service('statusService', require('./StatusService'))
-    .service('tenantService', require('./TenantService'))
-    .service('typeService', require('./TypeService'))
-    .service('trafficPortalService', require('./TrafficPortalService'))
-    .service('userService', require('./UserService'))
-;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/directives/match/MatchDirective.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/directives/match/MatchDirective.js b/traffic_ops/experimental/ui/app/src/common/directives/match/MatchDirective.js
deleted file mode 100644
index e174d30..0000000
--- a/traffic_ops/experimental/ui/app/src/common/directives/match/MatchDirective.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var MatchDirective = function() {
-    return {
-        require: 'ngModel',
-        link: function (scope, elem, attrs, ctrl) {
-            scope.$watch('[' + attrs.ngModel + ', ' + attrs.match + ']', function(value) {
-                var a = value[0] || '';
-                var b = value[1] || '';
-                ctrl.$setValidity('match', a === b);
-            }, true);
-        }
-    }
-};
-
-module.exports = MatchDirective;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/directives/match/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/directives/match/index.js b/traffic_ops/experimental/ui/app/src/common/directives/match/index.js
deleted file mode 100644
index a272219..0000000
--- a/traffic_ops/experimental/ui/app/src/common/directives/match/index.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-//application directives
-module.exports = angular.module('trafficPortal.directives.match',[])
-    .directive('match', require('./MatchDirective'))
-;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/filters/OffsetFilter.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/filters/OffsetFilter.js b/traffic_ops/experimental/ui/app/src/common/filters/OffsetFilter.js
deleted file mode 100644
index 8f9a5a8..0000000
--- a/traffic_ops/experimental/ui/app/src/common/filters/OffsetFilter.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var OffsetFilter = function() {
-    return function(input, start) {
-        if($.isArray(input)) {
-            start = parseInt(start, 10);
-            return input.slice(start);
-        }
-    };
-};
-
-OffsetFilter.$inject = ['$log'];
-module.exports = OffsetFilter;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/filters/PercentFilter.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/filters/PercentFilter.js b/traffic_ops/experimental/ui/app/src/common/filters/PercentFilter.js
deleted file mode 100644
index fba2de1..0000000
--- a/traffic_ops/experimental/ui/app/src/common/filters/PercentFilter.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var PercentFilter = function() {
-	return function(input) {
-		input = parseFloat(input);
-		input *= 100;
-		if(input % 1 === 0) {
-			input = input.toFixed(0);
-		}
-		else {
-			input = input.toFixed(2);
-		}
-		return input + '%';
-	};
-};
-
-PercentFilter.$inject = [];
-module.exports = PercentFilter;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/filters/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/filters/index.js b/traffic_ops/experimental/ui/app/src/common/filters/index.js
deleted file mode 100644
index 5604d10..0000000
--- a/traffic_ops/experimental/ui/app/src/common/filters/index.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.filters', [])
-    .filter('offsetFilter', require('./OffsetFilter'))
-	.filter('percentFilter', require('./PercentFilter'))
-;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/models/ChangeLogModel.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/models/ChangeLogModel.js b/traffic_ops/experimental/ui/app/src/common/models/ChangeLogModel.js
deleted file mode 100644
index 48c7b81..0000000
--- a/traffic_ops/experimental/ui/app/src/common/models/ChangeLogModel.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var ChangeLogModel = function($rootScope, $interval, changeLogService, userModel) {
-
-	var newLogCount = 0,
-		pollingIntervalInSecs = 30,
-		changeLogInterval;
-
-	this.newLogCount = function() {
-		return newLogCount;
-	};
-
-	var createChangeLogInterval = function() {
-		killChangeLogInterval();
-		changeLogInterval = $interval(function() { getNewLogCount() }, (pollingIntervalInSecs*1000)); // every X minutes
-	};
-
-	var killChangeLogInterval = function() {
-		if (angular.isDefined(changeLogInterval)) {
-			$interval.cancel(changeLogInterval);
-			changeLogInterval = undefined;
-		}
-	};
-
-	var getNewLogCount = function() {
-		changeLogService.getNewLogCount()
-			.then(function(result) {
-				newLogCount = result.data.response.newLogcount;
-			});
-	};
-
-	$rootScope.$on('authService::login', function() {
-		getNewLogCount();
-		createChangeLogInterval();
-	});
-
-	$rootScope.$on('authService::logout', function() {
-		killChangeLogInterval();
-	});
-
-	$rootScope.$on('changeLogService::getChangeLogs', function() {
-		newLogCount = 0;
-	});
-
-	var init = function () {
-		if (userModel.loaded) {
-			getNewLogCount();
-			createChangeLogInterval();
-		}
-	};
-	init();
-
-};
-
-ChangeLogModel.$inject = ['$rootScope', '$interval', 'changeLogService', 'userModel'];
-module.exports = ChangeLogModel;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/models/MessageModel.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/models/MessageModel.js b/traffic_ops/experimental/ui/app/src/common/models/MessageModel.js
deleted file mode 100644
index 279602b..0000000
--- a/traffic_ops/experimental/ui/app/src/common/models/MessageModel.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var MessageModel = function($rootScope) {
-
-    var model = this;
-    var queue = [];
-
-    var messages = {};
-    messages.loaded = false;
-    messages.content = [];
-
-    this.messages = messages;
-
-    this.setMessages = function(messagesArray, delay) {
-        // delay should be true if a redirect follows...
-        if (!angular.isArray(messagesArray)) return;
-        var messages = {};
-        messages.loaded = true;
-        messages.content = messagesArray;
-        if (delay) {
-            queue[0] = messages; // queue up messages to display after a location change
-        } else {
-            model.messages = messages; // show the messages asap
-            queue = []; // clear the queue as messages will be shown immediately
-        }
-    };
-
-    this.resetMessages = function() {
-        messages = {};
-        messages.loaded = false;
-        messages.content = [];
-
-        this.messages = messages;
-    };
-
-    this.removeMessage = function(message) {
-        model.messages.content = _.without(model.messages.content, message);
-    };
-
-    $rootScope.$on("$locationChangeStart", function() {
-        model.resetMessages();
-    });
-
-    $rootScope.$on("$locationChangeSuccess", function() {
-        model.messages = queue.shift() || {};
-    });
-
-};
-
-MessageModel.$inject = ['$rootScope'];
-module.exports = MessageModel;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/models/PropertiesModel.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/models/PropertiesModel.js b/traffic_ops/experimental/ui/app/src/common/models/PropertiesModel.js
deleted file mode 100644
index 5720a18..0000000
--- a/traffic_ops/experimental/ui/app/src/common/models/PropertiesModel.js
+++ /dev/null
@@ -1,31 +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 PropertiesModel = function() {
-
-	this.properties = {};
-	this.loaded = false;
-
-	this.setProperties = function(properties) {
-		this.properties = properties;
-		this.loaded = true;
-	};
-
-};
-
-PropertiesModel.$inject = [];
-module.exports = PropertiesModel;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/models/UserModel.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/models/UserModel.js b/traffic_ops/experimental/ui/app/src/common/models/UserModel.js
deleted file mode 100644
index bf1c624..0000000
--- a/traffic_ops/experimental/ui/app/src/common/models/UserModel.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var UserModel = function($rootScope) {
-
-    this.loaded = false;
-
-    this.user = {};
-
-    this.setUser = function(userData) {
-        this.loaded = true;
-        this.user = userData;
-        $rootScope.$broadcast('userModel::userUpdated', this.user);
-    };
-
-    this.resetUser = function() {
-        this.loaded = false;
-        this.userId = 0;
-        this.user = {};
-        $rootScope.$broadcast('userModel::userUpdated', this.user);
-    };
-
-};
-
-UserModel.$inject = ['$rootScope'];
-module.exports = UserModel;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/models/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/models/index.js b/traffic_ops/experimental/ui/app/src/common/models/index.js
deleted file mode 100644
index 7c35171..0000000
--- a/traffic_ops/experimental/ui/app/src/common/models/index.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.models', [])
-    .service('changeLogModel', require('./ChangeLogModel'))
-    .service('messageModel', require('./MessageModel'))
-	.service('propertiesModel', require('./PropertiesModel'))
-	.service('userModel', require('./UserModel'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/DialogConfirmController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/DialogConfirmController.js b/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/DialogConfirmController.js
deleted file mode 100644
index c936647..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/DialogConfirmController.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var DialogConfirmController = function(params, $scope, $uibModalInstance) {
-
-    $scope.params = params;
-
-    $scope.yes = function() {
-        $uibModalInstance.close();
-    };
-
-    $scope.no = function () {
-        $uibModalInstance.dismiss('no');
-    };
-
-};
-
-DialogConfirmController.$inject = ['params', '$scope', '$uibModalInstance'];
-module.exports = DialogConfirmController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/_dialog.confirm.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/_dialog.confirm.scss b/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/_dialog.confirm.scss
deleted file mode 100644
index d57b9c6..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/_dialog.confirm.scss
+++ /dev/null
@@ -1,16 +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_ops/experimental/ui/app/src/common/modules/dialog/confirm/dialog.confirm.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/dialog.confirm.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/dialog.confirm.tpl.html
deleted file mode 100644
index 235cbb3..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/dialog.confirm.tpl.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="modal-header">
-    <button type="button" class="close" ng-click="no()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-    <h4 class="modal-title">{{::params.title}}</h4>
-</div>
-<div class="modal-body">
-    <p>{{::params.message}}</p>
-</div>
-<div class="modal-footer">
-    <button class="btn action-btn" ng-click="no()">No</button>
-    <button class="btn btn-link" ng-click="yes()">Yes</button>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/index.js b/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/index.js
deleted file mode 100644
index d500733..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/confirm/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.dialog.confirm', [])
-    .controller('DialogConfirmController', require('./DialogConfirmController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/delete/DialogDeleteController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/delete/DialogDeleteController.js b/traffic_ops/experimental/ui/app/src/common/modules/dialog/delete/DialogDeleteController.js
deleted file mode 100644
index f3633cd..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/delete/DialogDeleteController.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var DialogDeleteController = function(params, $scope, $uibModalInstance) {
-
-    $scope.params = params;
-
-    $scope.delete = function() {
-        $uibModalInstance.close();
-    };
-
-    $scope.cancel = function () {
-        $uibModalInstance.dismiss('cancel');
-    };
-
-};
-
-DialogDeleteController.$inject = ['params', '$scope', '$uibModalInstance'];
-module.exports = DialogDeleteController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/delete/dialog.delete.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/delete/dialog.delete.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/dialog/delete/dialog.delete.tpl.html
deleted file mode 100644
index 852d724..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/delete/dialog.delete.tpl.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="modal-header">
-    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Cancel</span></button>
-    <h4 class="modal-title">{{::params.title}}</h4>
-</div>
-<div class="modal-body">
-    <form name="deleteForm" novalidate>
-        <p>This action CANNOT be undone. This will permanently delete '{{::params.key}}'. Please type in '{{::params.key}}' to confirm deletion.</p>
-        <input type="text" class="form-control" ng-model="confirmKey" match="params.key" required>
-    </form>
-</div>
-<div class="modal-footer">
-    <button type="button" class="btn btn-danger" ng-disabled="deleteForm.$pristine || deleteForm.$invalid" ng-click="delete()">Delete Permanently</button>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/delete/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/delete/index.js b/traffic_ops/experimental/ui/app/src/common/modules/dialog/delete/index.js
deleted file mode 100644
index 4a35c29..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/delete/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.dialog.delete', [])
-    .controller('DialogDeleteController', require('./DialogDeleteController'));

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/DialogResetController.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/DialogResetController.js b/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/DialogResetController.js
deleted file mode 100644
index 2b0c6c7..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/DialogResetController.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-var DialogResetController = function($scope, $uibModalInstance) {
-
-    $scope.userData = {
-        email: ""
-    };
-
-    $scope.reset = function (email) {
-        $uibModalInstance.close(email);
-    };
-
-    $scope.cancel = function () {
-        $uibModalInstance.dismiss('cancel');
-    };
-
-    $scope.hasError = function(input) {
-        return !input.$focused && input.$dirty && input.$invalid;
-    };
-
-    $scope.hasPropertyError = function(input, property) {
-        return !input.$focused && input.$dirty && input.$error[property];
-    };
-
-};
-
-DialogResetController.$inject = ['$scope', '$uibModalInstance'];
-module.exports = DialogResetController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/_dialog.reset.scss
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/_dialog.reset.scss b/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/_dialog.reset.scss
deleted file mode 100644
index d57b9c6..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/_dialog.reset.scss
+++ /dev/null
@@ -1,16 +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_ops/experimental/ui/app/src/common/modules/dialog/reset/dialog.reset.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/dialog.reset.tpl.html b/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/dialog.reset.tpl.html
deleted file mode 100644
index dd541f7..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/dialog.reset.tpl.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!--
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
--->
-
-<div class="modal-header">
-    <button type="button" class="close" ng-click="cancel()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-    <h5 class="modal-title">Reset User Password</h5>
-</div>
-<div class="modal-body">
-    <form name="resetPasswordForm" class="form-horizontal" role="form" novalidate>
-        <div class="form-group" ng-class="{'has-error': hasError(resetPasswordForm.email), 'has-feedback': hasError(resetPasswordForm.email)}">
-            <label for="email" class="col-sm-2 control-label">Email:</label>
-            <div class="col-sm-10">
-                <input id="email" name="email" type="email" class="form-control" placeholder="Enter your email" ng-model="userData.email" required>
-                <small class="input-error" ng-show="hasPropertyError(resetPasswordForm.email, 'required')">Required</small>
-                <small class="input-error" ng-show="hasPropertyError(resetPasswordForm.email, 'email')">Invalid email</small>
-                <span ng-show="hasError(resetPasswordForm.email)" class="form-control-feedback"><i class="fa fa-times"></i></span>
-            </div>
-        </div>
-    </form>
-</div>
-<div class="modal-footer">
-    <button class="btn btn-default" ng-click="cancel()">Cancel</button>
-    <button class="btn btn-primary" ng-disabled="resetPasswordForm.$pristine || resetPasswordForm.$invalid" ng-click="reset(userData.email)">Reset</button>
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/index.js
----------------------------------------------------------------------
diff --git a/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/index.js b/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/index.js
deleted file mode 100644
index d86c394..0000000
--- a/traffic_ops/experimental/ui/app/src/common/modules/dialog/reset/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-module.exports = angular.module('trafficPortal.dialog.reset', [])
-    .controller('DialogResetController', require('./DialogResetController'));



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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/build/build_rpm.sh
----------------------------------------------------------------------
diff --git a/traffic_portal/build/build_rpm.sh b/traffic_portal/build/build_rpm.sh
index 2ce3c97..9542f14 100755
--- a/traffic_portal/build/build_rpm.sh
+++ b/traffic_portal/build/build_rpm.sh
@@ -16,9 +16,12 @@
 
 function importFunctions() {
 	local script=$(readlink -f "$0")
+	local suff=${script##*control/}
+	local tcdirlen=$[${#script} - ${#suff}]
+	export TC_DIR=${script:0:$tcdirlen}
 	local scriptdir=$(dirname "$script")
 	export TS_DIR=$(dirname "$scriptdir")
-	export TC_DIR=$(dirname "$TS_DIR")
+
 	functions_sh="$TC_DIR/build/functions.sh"
 	if [[ ! -r $functions_sh ]]; then
 		echo "error: can't find $functions_sh"

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/build/etc/init.d/traffic_portal
----------------------------------------------------------------------
diff --git a/traffic_portal/build/etc/init.d/traffic_portal b/traffic_portal/build/etc/init.d/traffic_portal
index be4697d..9b9c384 100755
--- a/traffic_portal/build/etc/init.d/traffic_portal
+++ b/traffic_portal/build/etc/init.d/traffic_portal
@@ -25,6 +25,7 @@
 # description: My Application
 ### END CHKCONFIG INFO
 #
+#
 # 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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/build/traffic_portal.spec
----------------------------------------------------------------------
diff --git a/traffic_portal/build/traffic_portal.spec b/traffic_portal/build/traffic_portal.spec
index b3fb47a..6881030 100644
--- a/traffic_portal/build/traffic_portal.spec
+++ b/traffic_portal/build/traffic_portal.spec
@@ -82,7 +82,6 @@ tar -xzvf $RPM_SOURCE_DIR/traffic_portal-%{version}.tgz
 %attr(755,root,root) %{traffic_portal_home}/node_modules/forever/bin/*
 %config(noreplace)/etc/traffic_portal/conf/config.js
 %dir /var/log/traffic_portal
-/etc/traffic_portal/conf/config-template.js
 %{traffic_portal_home}/*
 /etc/logrotate.d/traffic_portal
 /etc/logrotate.d/traffic_portal-access

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/conf/config-template.js
----------------------------------------------------------------------
diff --git a/traffic_portal/conf/config-template.js b/traffic_portal/conf/config-template.js
deleted file mode 100644
index 6618ff5..0000000
--- a/traffic_portal/conf/config-template.js
+++ /dev/null
@@ -1,47 +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.
-
- */
-
-// this is the config for /opt/traffic_portal/server/server.js and is consumed when 'sudo service traffic_portal start'
-module.exports = {
-    timeout: '120s',
-    useSSL: false, // set to true if you plan to use https (self-signed or trusted certs).
-    port: 8080,
-    sslPort: 8443,
-    proxyPort: 8009,
-    // if useSSL is true, generate ssl certs and provide the proper locations.
-    ssl: {
-        key:    '/path/to/ssl.key',
-        cert:   '/path/to/ssl.crt',
-        ca:     [
-            '/path/to/ssl-bundle.crt'
-        ]
-    },
-    // set api 'base_url' to the traffic ops api (all api calls made from the traffic portal will be proxied to the api base_url)
-    api: {
-        base_url: 'http(s)://where-traffic-ops-api-is.com/api/'
-    },
-    // default files location (this is where the traffic portal html, css and javascript was installed)
-    files: {
-        static: '/opt/traffic_portal/public'
-    },
-    // default log location (this is where traffic_portal logs are written)
-    log: {
-        stream: '/var/log/traffic_portal/access.log'
-    },
-    reject_unauthorized: 0 // 0 if using self-signed certs, 1 if trusted certs
-};
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/conf/config.js
----------------------------------------------------------------------
diff --git a/traffic_portal/conf/config.js b/traffic_portal/conf/config.js
index f32449a..b4611a0 100644
--- a/traffic_portal/conf/config.js
+++ b/traffic_portal/conf/config.js
@@ -1,42 +1,46 @@
 /*
-
-
- 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.
  */
 
-// see config-template.js for comments
+// this is the config that is consumed by server/server.js
 module.exports = {
     timeout: '120s',
-    useSSL: false,
+    useSSL: false, // set to true if you plan to use https (self-signed or trusted certs).
     port: 8080,
     sslPort: 8443,
-    proxyPort: 8009,
+    // if useSSL is true, generate ssl certs and provide the proper locations.
     ssl: {
-        key:    '/path/to/ssl.key',
-        cert:   '/path/to/ssl.crt',
-        ca:     [
-            '/path/to/ssl-bundle.crt'
-        ]
+        key:    '/etc/pki/tls/private/localhost.key',
+        cert:   '/etc/pki/tls/certs/localhost.crt',
+        ca:     [ '/etc/pki/tls/certs/ca-bundle.crt' ]
     },
+    // set api 'base_url' to the traffic ops api (all api calls made from the traffic portal will be proxied to the api base_url)
     api: {
         base_url: 'http://localhost:3000/api/'
     },
+    // default static files location (this is where the traffic portal html, css and javascript was installed) - /opt/traffic_portal/public
     files: {
         static: './app/dist/public/'
     },
+    // default log location (this is where traffic_portal logs are written) - /var/log/traffic_portal/access.log
     log: {
         stream: './server/log/access.log'
     },
     reject_unauthorized: 0 // 0 if using self-signed certs, 1 if trusted certs
 };
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/docker/Dockerfile
----------------------------------------------------------------------
diff --git a/traffic_portal/docker/Dockerfile b/traffic_portal/docker/Dockerfile
new file mode 100644
index 0000000..6e699e9
--- /dev/null
+++ b/traffic_portal/docker/Dockerfile
@@ -0,0 +1,25 @@
+#
+#  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.
+#
+FROM node:4-onbuild
+#FROM buildpack-deps:jessie
+
+RUN apt-get update -y && apt-get install libffi-dev ruby-dev rubygems vim -y
+
+# replace this with your application's default port
+RUN gem update --system && gem install --no-rdoc --no-ri compass && gem install --no-rdoc --no-ri sass -v 3.4.22
+RUN npm install -g bower grunt-cli
+RUN echo '{ "allow_root": true }' > /root/.bowerrc
+
+ADD infrastructure/docker/build/clean_build.sh /
+CMD /clean_build.sh traffic_portal

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/docker/docker-compose.yml
----------------------------------------------------------------------
diff --git a/traffic_portal/docker/docker-compose.yml b/traffic_portal/docker/docker-compose.yml
new file mode 100644
index 0000000..dd81b61
--- /dev/null
+++ b/traffic_portal/docker/docker-compose.yml
@@ -0,0 +1,32 @@
+#
+#  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.
+#
+version: '2'
+
+services:
+  portal:
+    build:
+      context: ..
+      dockerfile: /opt/traffic_portal/docker/Dockerfile
+    ports:
+      - 80:80
+      - 443:443
+    volumes:
+      - /etc/traffic_portal/conf:/etc/traffic_portal/conf
+      - /etc/pki:/etc/pki
+    networks:
+      - default
+
+networks:
+  default:
+     driver: bridge

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/docker/reset.sh
----------------------------------------------------------------------
diff --git a/traffic_portal/docker/reset.sh b/traffic_portal/docker/reset.sh
new file mode 100755
index 0000000..91be282
--- /dev/null
+++ b/traffic_portal/docker/reset.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+# 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.
+
+sudo systemctl stop traffic_portal
+
+docker rm traffic_portal_1 #remove container
+docker rmi traffic_portal #remove image
+docker ps -a
+
+sudo systemctl start traffic_portal
+
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/etc/systemd/system/traffic_portal.service
----------------------------------------------------------------------
diff --git a/traffic_portal/etc/systemd/system/traffic_portal.service b/traffic_portal/etc/systemd/system/traffic_portal.service
new file mode 100644
index 0000000..dc24d3a
--- /dev/null
+++ b/traffic_portal/etc/systemd/system/traffic_portal.service
@@ -0,0 +1,30 @@
+#
+#  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.
+#
+#-----------------------------------------
+# Ansible managed
+#-----------------------------------------
+#
+[Unit]
+Description=Traffic Portal Docker Container
+Requires=docker.service
+After=docker.service
+
+[Service]
+Restart=always
+ExecStart=/usr/bin/docker-compose -p traffic -f /opt/traffic_portal/docker/docker-compose.yml up
+ExecStop=/usr/bin/docker-compose -p traffic -f /opt/traffic_portal/docker/docker-compose.yml down -v
+WorkingDirectory=/opt/traffic_portal/docker
+
+[Install]
+WantedBy=default.target

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/grunt/browserify2.js
----------------------------------------------------------------------
diff --git a/traffic_portal/grunt/browserify2.js b/traffic_portal/grunt/browserify2.js
old mode 100755
new mode 100644
index 122651d..2528df4
--- a/traffic_portal/grunt/browserify2.js
+++ b/traffic_portal/grunt/browserify2.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 = {
@@ -30,6 +32,7 @@ module.exports = {
                                 'angular-animate/angular-animate.min.js',
                                 'angular-bootstrap/ui-bootstrap.min.js',
                                 'angular-bootstrap/ui-bootstrap-tpls.min.js',
+                                'angular-jwt/dist/angular-jwt.min.js',
                                 'angular-loading-bar/build/loading-bar.min.js',
                                 'angular-resource/angular-resource.min.js',
                                 'angular-route/angular-route.min.js',
@@ -38,7 +41,8 @@ module.exports = {
                                 'bootstrap-sass-official/assets/javascripts/bootstrap.min.js',
                                 'es5-shim/es5-shim.min.js',
                                 'jquery/jquery.min.js',
-                                'json3/lib/json3.min.js'
+                                'json3/lib/json3.min.js',
+                                'restangular/dist/restangular.min.js'
                             ]
                     },
                     {
@@ -48,6 +52,11 @@ module.exports = {
                     },
                     {
                         cwd: '<%= globalConfig.app %>/bower_components/',
+                        src: [ 'flot/jquery.flot.pie.js' ],
+                        rename: function () { return 'jquery-flot-pie.js'; }
+                    },
+                    {
+                        cwd: '<%= globalConfig.app %>/bower_components/',
                         src: [ 'flot/jquery.flot.stack.js' ],
                         rename: function () { return 'jquery-flot-stack.js'; }
                     },
@@ -84,6 +93,7 @@ module.exports = {
                                 'angular-animate/angular-animate.js',
                                 'angular-bootstrap/ui-bootstrap.js',
                                 'angular-bootstrap/ui-bootstrap-tpls.js',
+                                'angular-jwt/dist/angular-jwt.js',
                                 'angular-loading-bar/build/loading-bar.js',
                                 'angular-resource/angular-resource.js',
                                 'angular-route/angular-route.js',
@@ -92,7 +102,8 @@ module.exports = {
                                 'bootstrap-sass-official/assets/javascripts/bootstrap.js',
                                 'es5-shim/es5-shim.js',
                                 'jquery/jquery.js',
-                                'json3/lib/json3.js'
+                                'json3/lib/json3.js',
+                                'restangular/dist/restangular.js'
                             ]
                     },
                     {
@@ -102,6 +113,11 @@ module.exports = {
                     },
                     {
                         cwd: '<%= globalConfig.app %>/bower_components/',
+                        src: [ 'flot/jquery.flot.pie.js' ],
+                        rename: function () { return 'jquery-flot-pie.js'; }
+                    },
+                    {
+                        cwd: '<%= globalConfig.app %>/bower_components/',
                         src: [ 'flot/jquery.flot.stack.js' ],
                         rename: function () { return 'jquery-flot-stack.js'; }
                     },

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/grunt/clean.js
----------------------------------------------------------------------
diff --git a/traffic_portal/grunt/clean.js b/traffic_portal/grunt/clean.js
old mode 100755
new mode 100644
index fead1ce..cb999b8
--- a/traffic_portal/grunt/clean.js
+++ b/traffic_portal/grunt/clean.js
@@ -1,23 +1,29 @@
 /*
-
-
- 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 = {
     all: [
         '<%= globalConfig.distdir %>/*',
         '<%= globalConfig.tmpdir %>/*'
-    ]
-};
\ No newline at end of file
+    ],
+    options: {
+        force: true
+    }
+};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/grunt/compass.js
----------------------------------------------------------------------
diff --git a/traffic_portal/grunt/compass.js b/traffic_portal/grunt/compass.js
old mode 100755
new mode 100644
index 5ec79fd..2aed889
--- a/traffic_portal/grunt/compass.js
+++ b/traffic_portal/grunt/compass.js
@@ -1,20 +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 = {
     options: {
         sassDir: '<%= globalConfig.srcdir %>',
@@ -41,4 +44,4 @@ module.exports = {
             environment: 'development'
         }
     }
-};
\ No newline at end of file
+};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/grunt/copy.js
----------------------------------------------------------------------
diff --git a/traffic_portal/grunt/copy.js b/traffic_portal/grunt/copy.js
old mode 100755
new mode 100644
index 4bee643..f774d39
--- a/traffic_portal/grunt/copy.js
+++ b/traffic_portal/grunt/copy.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 = {
@@ -25,9 +27,9 @@ module.exports = {
                 dest: '<%= globalConfig.resourcesdir %>',
                 src: [
                     'assets/css/**/*',
+                    'assets/fonts/**/*',
                     'assets/images/**/*',
-                    'assets/js/**/*',
-                    'assets/other/**/*'
+                    'assets/js/**/*'
                 ]
             },
             {
@@ -52,9 +54,9 @@ module.exports = {
                 dest: '<%= globalConfig.resourcesdir %>',
                 src: [
                     'assets/css/**/*',
+                    'assets/fonts/**/*',
                     'assets/images/**/*',
-                    'assets/js/**/*',
-                    'assets/other/**/*'
+                    'assets/js/**/*'
                 ]
             },
             {
@@ -73,6 +75,7 @@ module.exports = {
                 dest: '<%= globalConfig.distdir %>/public',
                 src: [
                     '*.html',
+                    'traffic_portal_release.json',
                     'traffic_portal_properties.json'
                 ]
             }

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/grunt/express.js
----------------------------------------------------------------------
diff --git a/traffic_portal/grunt/express.js b/traffic_portal/grunt/express.js
index aa76337..97c3bda 100644
--- a/traffic_portal/grunt/express.js
+++ b/traffic_portal/grunt/express.js
@@ -1,24 +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.
  */
 
 module.exports = {
     dev: {
         options: {
-            script: './server/server.js',
+            script: './server.js',
             node_env: 'dev'
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/grunt/globalConfig.js
----------------------------------------------------------------------
diff --git a/traffic_portal/grunt/globalConfig.js b/traffic_portal/grunt/globalConfig.js
old mode 100755
new mode 100644
index 9d76412..71ab1b4
--- a/traffic_portal/grunt/globalConfig.js
+++ b/traffic_portal/grunt/globalConfig.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 = function() {
@@ -20,7 +22,6 @@ module.exports = function() {
         app: 'app',
         resourcesdir: 'app/dist/public/resources',
         distdir: 'app/dist',
-        srcconfdir: './conf',
         srcserverdir: './server',
         srcdir: 'app/src',
         tmpdir: '.tmp',

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/grunt/html2js.js
----------------------------------------------------------------------
diff --git a/traffic_portal/grunt/html2js.js b/traffic_portal/grunt/html2js.js
old mode 100755
new mode 100644
index 65760e5..8cd52af
--- a/traffic_portal/grunt/html2js.js
+++ b/traffic_portal/grunt/html2js.js
@@ -1,20 +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 = {
     options: {
         base: './app/src'
@@ -24,4 +27,4 @@ module.exports = {
         dest: '<%= globalConfig.tmpdir %>/app-templates.js',
         module: 'app.templates'
     }
-};
\ No newline at end of file
+};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/grunt/install-dependencies.js
----------------------------------------------------------------------
diff --git a/traffic_portal/grunt/install-dependencies.js b/traffic_portal/grunt/install-dependencies.js
index 8af5b3c..5729bf8 100644
--- a/traffic_portal/grunt/install-dependencies.js
+++ b/traffic_portal/grunt/install-dependencies.js
@@ -16,8 +16,8 @@
  */
 
 module.exports = {
-    options: {
-        cwd: '<%= globalConfig.distdir %>',
-        isDevelopment: false
-    }
+	options: {
+		cwd: '<%= globalConfig.distdir %>',
+		isDevelopment: false
+	}
 };

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/grunt/jshint.js
----------------------------------------------------------------------
diff --git a/traffic_portal/grunt/jshint.js b/traffic_portal/grunt/jshint.js
old mode 100755
new mode 100644
index aa7be4a..f95dfa1
--- a/traffic_portal/grunt/jshint.js
+++ b/traffic_portal/grunt/jshint.js
@@ -1,23 +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.
  */
 
+
 module.exports = {
     files: ['Gruntfile.js', '<%= globalConfig.srcfiles.js %>'],
     options: {
         jshintrc:true
     }
-};
\ No newline at end of file
+};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/grunt/ngconstant.js
----------------------------------------------------------------------
diff --git a/traffic_portal/grunt/ngconstant.js b/traffic_portal/grunt/ngconstant.js
deleted file mode 100644
index 356d43e..0000000
--- a/traffic_portal/grunt/ngconstant.js
+++ /dev/null
@@ -1,46 +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 = {
-    options: {
-        space: '  ',
-        wrap: '"use strict";\n\n {%= __ngModule %}',
-        name: 'config',
-        dest: '<%= globalConfig.srcdir %>/scripts/config.js'
-    },
-    dev: {
-        constants: {
-            ENV: {
-                apiEndpoint: {
-                    '1.1': '/api/1.1/',
-                    '1.2': '/api/1.2/'
-                }
-            }
-        }
-    },
-    prod: {
-        constants: {
-            ENV: {
-                apiEndpoint: {
-                    '1.1': '/api/1.1/',
-                    '1.2': '/api/1.2/'
-                }
-            }
-        }
-    }
-};
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/grunt/uglify.js
----------------------------------------------------------------------
diff --git a/traffic_portal/grunt/uglify.js b/traffic_portal/grunt/uglify.js
old mode 100755
new mode 100644
index 1150381..5f124ce
--- a/traffic_portal/grunt/uglify.js
+++ b/traffic_portal/grunt/uglify.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 = {
@@ -23,4 +25,4 @@ module.exports = {
             ]
         }
     }
-};
\ No newline at end of file
+};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/grunt/watch.js
----------------------------------------------------------------------
diff --git a/traffic_portal/grunt/watch.js b/traffic_portal/grunt/watch.js
old mode 100755
new mode 100644
index 971b472..bc72b39
--- a/traffic_portal/grunt/watch.js
+++ b/traffic_portal/grunt/watch.js
@@ -1,20 +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 = {
     options: {
         livereload: true
@@ -31,4 +34,4 @@ module.exports = {
         files: ['app/**/*.tpl.html', 'app/**/index.html'],
         tasks: ['copy:dist', 'build-dev']
     }
-};
\ No newline at end of file
+};

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/package.json
----------------------------------------------------------------------
diff --git a/traffic_portal/package.json b/traffic_portal/package.json
index a0df0d7..069c22f 100755
--- a/traffic_portal/package.json
+++ b/traffic_portal/package.json
@@ -1,16 +1,15 @@
 {
-    "name": "trafficPortal",
-    "description": "Traffic Portal",
+    "name": "traffic_portal",
     "devDependencies": {
         "morgan": "1.7.0",
-        "errorhandler": "1.4.3",
-        "connect-modrewrite": "0.8.5",
-        "connect-timeout": "1.7.0",
-        "ssl-root-cas": "1.1.10",
-        "express": "4.13.4",
+        "connect-modrewrite": "0.10.1",
+        "connect-timeout": "1.8.0",
+        "ssl-root-cas": "1.2.3",
+        "express": "4.15.2",
+        "requirejs": "2.3.3",
+        "connect-livereload": "0.5.4",
         "grunt": "0.4.5",
         "grunt-adam-compass": "0.7.1",
-        "grunt-wiredep": "2.0.0",
         "grunt-browserify2": "0.1.8",
         "grunt-concurrent": "2.2.1",
         "grunt-contrib-clean": "1.0.0",
@@ -25,12 +24,14 @@
         "grunt-html2js": "0.3.5",
         "grunt-install-dependencies": "0.2.0",
         "grunt-newer": "1.1.2",
-        "grunt-ng-constant": "2.0.1",
+        "grunt-rev": "0.1.0",
+        "grunt-usemin": "3.0.0",
+        "grunt-wiredep": "2.0.0",
         "load-grunt-config": "0.19.1",
         "load-grunt-tasks": "3.4.1",
         "time-grunt": "1.3.0"
     },
     "engines": {
-        "node": ">=0.12.0"
+        "node": "0.11.14"
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/server/server.js
----------------------------------------------------------------------
diff --git a/traffic_portal/server/server.js b/traffic_portal/server/server.js
index 77b87e4..d87851e 100644
--- a/traffic_portal/server/server.js
+++ b/traffic_portal/server/server.js
@@ -1,66 +1,81 @@
 /*
-
-
- 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 constants = require('constants'),
     express = require('express'),
     http = require('http'),
     https = require('https'),
+    path = require('path'),
     fs = require('fs'),
     morgan = require('morgan'),
-    errorhandler = require('errorhandler'),
     modRewrite = require('connect-modrewrite'),
     timeout = require('connect-timeout');
 
 var config;
 
 try {
-    // this should exist in prod environment. no need to create this file in dev as it will use the fallback (see catch)
     config = require('/etc/traffic_portal/conf/config');
 }
 catch(e) {
-    // this is used for dev environment
-    config = require('../conf/config');
+    config = require('./conf/config');
 }
 
-var logStream = fs.createWriteStream(config.log.stream, { flags: 'a' });
-var useSSL = config.useSSL;
+var logStream = fs.createWriteStream(config.log.stream, { flags: 'a' }),
+    useSSL = config.useSSL;
 
 // Disable for self-signed certs in dev/test
 process.env.NODE_TLS_REJECT_UNAUTHORIZED = config.reject_unauthorized;
 
 var app = express();
+
+app.use(function(req, res, next) {
+    var err = null;
+    try {
+        decodeURIComponent(req.path)
+    }
+    catch(e) {
+        err = e;
+    }
+    if (err){
+        console.log(err, req.url);
+    }
+    next();
+});
+
 // Add a handler to inspect the req.secure flag (see
 // http://expressjs.com/api#req.secure). This allows us
 // to know whether the request was via http or https.
 app.all ("/*", function (req, res, next) {
     if (useSSL && !req.secure) {
-        var headersHost = req.headers.host.split(':');
-        var httpsUrl = 'https://' + headersHost[0] + ':' +  config.sslPort + req.url;
         // request was via http, so redirect to https
-        res.redirect(httpsUrl);
+        return res.redirect(['https://', req.get('Host'), ':', config.sslPort, req.url].join(''));
     } else {
+        // request was via https or useSSL=false, so do no special handling
         next();
     }
 });
 
 app.use(modRewrite([
-        '^/api/(.*?)\\?(.*)$ ' + config.api.base_url + '$1?$2 [P]',
-        '^/api/(.*)$ ' + config.api.base_url + '$1 [P]'
+    '^/api/(.*?)\\?(.*)$ ' + config.api.base_url + '$1?$2 [P]',
+    '^/api/(.*)$ ' + config.api.base_url + '$1 [P]'
 ]));
+
 app.use(express.static(config.files.static));
 app.use(morgan('combined', {
     stream: logStream,
@@ -69,11 +84,47 @@ app.use(morgan('combined', {
 app.use(timeout(config.timeout));
 
 if (app.get('env') === 'dev') {
-    app.use(errorhandler());
+    app.use(require('connect-livereload')({
+        port: 35728,
+        excludeList: ['.woff', '.flv']
+    }));
 } else {
-    app.set('env', "production");
+    app.set('env', 'production');
 }
 
+// special handling required for dbdump. haven't got this to work yet
+// app.get('/dbdump', function (req, res) {
+//     var port = (useSSL) ? config.sslPort : config.port,
+//         options = {
+//             method: 'GET',
+//             host: 'localhost',
+//             port: port,
+//             path: '/api/1.2/dbdump',
+//             headers: {
+//                 cookie: req.headers['cookie']
+//             }
+//         };
+//
+//     var request = http.request(options, function(response) {
+//         var data = [];
+//         console.log(response.statusCode);
+//         response.on('data', function(chunk) {
+//             data.push(chunk);
+//         });
+//         response.on('end', function() {
+//             data = Buffer.concat(data);
+//             res.writeHead(200, {
+//                 'Content-Type': 'application/download',
+//                 'Content-Disposition': 'attachment; filename=foo.dump.gz',
+//                 'Content-Length': data.length
+//             });
+//             res.end(data);
+//         });
+//     });
+//
+//     request.end();
+// });
+
 // Enable reverse proxy support in Express. This causes the
 // the "X-Forwarded-Proto" header field to be trusted so its
 // value can be used to determine the protocol. See
@@ -106,5 +157,4 @@ if (useSSL) {
 }
 
 console.log("Traffic Portal Port         : %s", config.port);
-console.log("Traffic Portal Proxy Port   : %s", config.proxyPort);
 console.log("Traffic Portal SSL Port     : %s", config.sslPort);

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/.bowerrc
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/.bowerrc b/traffic_portal/v1/.bowerrc
new file mode 100644
index 0000000..ba0accc
--- /dev/null
+++ b/traffic_portal/v1/.bowerrc
@@ -0,0 +1,3 @@
+{
+    "directory": "app/bower_components"
+}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/.gitignore
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/.gitignore b/traffic_portal/v1/.gitignore
new file mode 100644
index 0000000..a6d8ee5
--- /dev/null
+++ b/traffic_portal/v1/.gitignore
@@ -0,0 +1,9 @@
+.tmp
+.sass-cache
+app/bower_components
+app/dist
+app/src/scripts/config.js
+node_modules
+rpm/rpmbuild
+rpm/*.rpm
+server/log/access.log

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/.jshintrc
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/.jshintrc b/traffic_portal/v1/.jshintrc
new file mode 100644
index 0000000..6b2ddc7
--- /dev/null
+++ b/traffic_portal/v1/.jshintrc
@@ -0,0 +1,23 @@
+{
+    "browser": true,
+    "esnext": true,
+    "bitwise": true,
+    "camelcase": true,
+    "curly": true,
+    "eqeqeq": true,
+    "immed": true,
+    "indent": 2,
+    "latedef": true,
+    "newcap": true,
+    "noarg": true,
+    "quotmark": "single",
+    "regexp": true,
+    "undef": true,
+    "unused": true,
+    "strict": true,
+    "trailing": true,
+    "smarttabs": true,
+    "globals": {
+        "angular": false
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/Gruntfile.js
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/Gruntfile.js b/traffic_portal/v1/Gruntfile.js
new file mode 100755
index 0000000..f86d919
--- /dev/null
+++ b/traffic_portal/v1/Gruntfile.js
@@ -0,0 +1,96 @@
+/*
+
+
+ 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.
+
+ */
+
+'use strict';
+
+module.exports = function (grunt) {
+    var os = require("os");
+    var globalConfig = require('./grunt/globalConfig');
+
+    // load time grunt - helps with optimizing build times
+    require('time-grunt')(grunt);
+
+    // load grunt task configurations
+    require('load-grunt-config')(grunt);
+
+    // default task - runs in dev mode
+    grunt.registerTask('default', ['dev']);
+
+    // dev task - when you type 'grunt dev' <-- builds unminified app and starts dev node.js server and watches for source file changes
+    grunt.registerTask('dev', [
+        'build-dev',
+        'express:dev',
+        'watch'
+    ]);
+
+    // dist task - when you type 'grunt dist' <-- builds minified app for distribution and generates node dependencies all wrapped up nicely in a /dist folder
+    grunt.registerTask('dist', [
+        'build',
+        'install-dependencies'
+    ]);
+
+    // build tasks
+    grunt.registerTask('build', [
+        'ngconstant:prod',
+        'clean',
+        'copy:dist',
+        'build-css',
+        'build-js',
+        'build-shared-libs'
+    ]);
+
+    grunt.registerTask('build-dev', [
+        'ngconstant:dev',
+        'clean',
+        'copy:dev',
+        'build-css-dev',
+        'build-js-dev',
+        'build-shared-libs-dev'
+    ]);
+
+    // css
+    grunt.registerTask('build-css', [
+        'compass:prod'
+    ]);
+
+    grunt.registerTask('build-css-dev', [
+        'compass:dev'
+    ]);
+
+    // js (custom)
+    grunt.registerTask('build-js', [
+        'html2js',
+        'browserify2:app-prod',
+        'browserify2:app-config'
+    ]);
+
+    grunt.registerTask('build-js-dev', [
+        'html2js',
+        'browserify2:app-dev',
+        'browserify2:app-config'
+    ]);
+
+    // js (libraries)
+    grunt.registerTask('build-shared-libs', [
+        'browserify2:shared-libs-prod'
+    ]);
+
+    grunt.registerTask('build-shared-libs-dev', [
+        'browserify2:shared-libs-dev'
+    ]);
+
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/README.md
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/README.md b/traffic_portal/v1/README.md
new file mode 100644
index 0000000..92a0fa9
--- /dev/null
+++ b/traffic_portal/v1/README.md
@@ -0,0 +1,5 @@
+# Traffic Portal
+
+An AngularJS client served from a lightweight Node.js web server designed to consume the Traffic Ops 1.x API.
+
+Installation instructions found in traffic_portal/build directory.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/app/src/AppController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/app/src/AppController.js b/traffic_portal/v1/app/src/AppController.js
new file mode 100644
index 0000000..b9e87d7
--- /dev/null
+++ b/traffic_portal/v1/app/src/AppController.js
@@ -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.
+
+ */
+
+var AppController = function() {};
+
+AppController.$inject = [];
+module.exports = AppController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/app/src/app.js
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/app/src/app.js b/traffic_portal/v1/app/src/app.js
new file mode 100755
index 0000000..9d7ac4a
--- /dev/null
+++ b/traffic_portal/v1/app/src/app.js
@@ -0,0 +1,181 @@
+/*
+
+
+ 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.
+
+ */
+
+'use strict';
+require('app-templates');
+
+var App = function($urlRouterProvider) {
+    $urlRouterProvider.otherwise('/');
+};
+
+App.$inject = ['$urlRouterProvider'];
+
+var trafficPortal = angular.module('trafficPortal', [
+        'config',
+        'ngAnimate',
+        'ngResource',
+        'ngSanitize',
+        'ngRoute',
+        'ui.router',
+        'ui.bootstrap',
+        'ui.bootstrap.datetimepicker',
+        'app.templates',
+        'angular-loading-bar',
+
+        // public modules
+        require('./modules/public').name,
+        require('./modules/public/home').name,
+        require('./modules/public/home/landing').name,
+        require('./modules/public/about').name,
+
+        // private modules
+        require('./modules/private').name,
+
+        // collateral
+        require('./modules/private/collateral').name,
+
+        // dashboard
+        require('./modules/private/dashboard').name,
+        require('./modules/private/dashboard/overview').name,
+
+        // delivery service
+        require('./modules/private/deliveryService').name,
+        require('./modules/private/deliveryService/new').name,
+        require('./modules/private/deliveryService/view').name,
+        require('./modules/private/deliveryService/view/overview').name,
+        require('./modules/private/deliveryService/view/overview/detail').name,
+
+        // delivery service charts
+        require('./modules/private/deliveryService/view/charts').name,
+        require('./modules/private/deliveryService/view/charts/bandwidthPerSecond').name,
+        require('./modules/private/deliveryService/view/charts/httpStatus').name,
+        require('./modules/private/deliveryService/view/charts/transactionsPerSecond').name,
+
+        // user
+        require('./modules/private/user').name,
+        require('./modules/private/user/edit').name,
+        require('./modules/private/user/register').name,
+        require('./modules/private/user/reset').name,
+
+        // common modules
+        require('./common/modules/cacheGroups').name,
+        require('./common/modules/chart/bandwidthPerSecond').name,
+        require('./common/modules/chart/capacity').name,
+        require('./common/modules/chart/dates').name,
+        require('./common/modules/chart/httpStatus').name,
+        require('./common/modules/chart/routing').name,
+        require('./common/modules/chart/transactionsPerSecond').name,
+        require('./common/modules/dates').name,
+        require('./common/modules/deliveryService/config/edit').name,
+        require('./common/modules/dialog/confirm').name,
+        require('./common/modules/dialog/reset').name,
+        require('./common/modules/footer').name,
+        require('./common/modules/header').name,
+        require('./common/modules/message').name,
+        require('./common/modules/release/version').name,
+        require('./common/modules/tools/purge').name,
+
+        require('./common/models').name,
+        require('./common/api').name,
+
+        //directives
+        require('./common/directives/enter').name,
+        require('./common/directives/formattedDate').name,
+        require('./common/directives/match').name,
+        require('./common/directives/rcSubmit').name,
+        require('./common/directives/rcVerifySet').name,
+        require('./common/directives/selectOnClick').name,
+
+        // services
+        require('./common/service/application').name,
+        require('./common/service/utils').name,
+        require('./common/service/utils/date').name,
+
+        //filters
+        require('./common/filters').name
+
+    ], App)
+
+        .controller('AppController', require('./AppController'))
+
+        .config(function($stateProvider, $logProvider, $controllerProvider) {
+            $controllerProvider.allowGlobals();
+            $logProvider.debugEnabled(true);
+            $stateProvider
+                .state('trafficPortal', {
+                    url: '/',
+                    abstract: true,
+                    templateUrl: 'common/templates/master.tpl.html',
+                    controller: 'AppController',
+                    resolve: {
+                        properties: function(portalService, propertiesModel) {
+                            return portalService.getProperties()
+                                .then(function(result) {
+                                    propertiesModel.setProperties(result);
+                                });
+                        }
+                    }
+                });
+        })
+
+        .run(function(applicationService) {
+            applicationService.startup();
+        })
+    ;
+
+trafficPortal.factory('authInterceptor', function ($q, $location, $timeout, dateUtils, messageModel, userModel) {
+    return {
+        responseError: function (rejection) {
+            var url = $location.url(),
+                alerts = [];
+
+            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) {
+                userModel.resetUser();
+                if (url == '/' || $location.search().redirect) {
+                    messageModel.setMessages(alerts, false);
+                } else {
+                    $timeout(function () {
+                        messageModel.setMessages(alerts, true);
+                        // forward the to the home page with ?redirect=page/they/were/trying/to/reach
+                        $location.url('/').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 () {
+                    messageModel.setMessages([ { level: 'error', text: rejection.status.toString() + ': ' + rejection.statusText + ' (' + dateUtils.dateFormat(new Date(), "UTC:dd/mmm/yyyy:HH:MM:ss o") + ')'  } ], false);
+                }, 200);
+            }
+
+            return $q.reject(rejection);
+        }
+    };
+});
+
+trafficPortal.config(function ($httpProvider) {
+    $httpProvider.interceptors.push('authInterceptor');
+});
+
+

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/app/src/assets/css/custom.css
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/app/src/assets/css/custom.css b/traffic_portal/v1/app/src/assets/css/custom.css
new file mode 100644
index 0000000..c0c95c3
--- /dev/null
+++ b/traffic_portal/v1/app/src/assets/css/custom.css
@@ -0,0 +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.
+
+*/
+
+
+/*
+    This file is a placeholder for custom styles for Traffic Portal. To customize styles, create your own custom.css and copy it
+    to /resources/assets/css/ on your web server replacing the old, blank one. This file should remain blank in source control.
+    If the default bootstrap styles are sufficient, do nothing.
+*/

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/app/src/assets/images/favicon.png
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/app/src/assets/images/favicon.png b/traffic_portal/v1/app/src/assets/images/favicon.png
new file mode 100755
index 0000000..da095e9
Binary files /dev/null and b/traffic_portal/v1/app/src/assets/images/favicon.png differ

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/app/src/assets/js/.keep
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/app/src/assets/js/.keep b/traffic_portal/v1/app/src/assets/js/.keep
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/app/src/assets/other/collateral.txt
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/app/src/assets/other/collateral.txt b/traffic_portal/v1/app/src/assets/other/collateral.txt
new file mode 100644
index 0000000..f402ca7
--- /dev/null
+++ b/traffic_portal/v1/app/src/assets/other/collateral.txt
@@ -0,0 +1 @@
+This is a document you want to share with your traffic portal users.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/app/src/common/api/AuthService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/app/src/common/api/AuthService.js b/traffic_portal/v1/app/src/common/api/AuthService.js
new file mode 100644
index 0000000..c3fea82
--- /dev/null
+++ b/traffic_portal/v1/app/src/common/api/AuthService.js
@@ -0,0 +1,82 @@
+/*
+
+
+ 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 AuthService = function($http, $state, $location, $q, userModel, deliveryServicesModel, messageModel, ENV) {
+
+    this.login = function(username, password) {
+        userModel.resetUser();
+        deliveryServicesModel.resetDeliveryServices();
+        var promise = $http.post(
+                ENV.apiEndpoint['1.2'] + "user/login", { u: username, p: password })
+            .success(function(result) {
+                var redirect = decodeURIComponent($location.search().redirect);
+                if (redirect !== 'undefined') {
+                    $location.search('redirect', null); // remove the redirect query param
+                    $location.url(redirect);
+                } else {
+                    $location.url('/dashboard');
+                }
+                return result;
+            })
+            .error(function(fault) {
+                return fault;
+            });
+
+        return promise;
+    };
+
+    this.tokenLogin = function(token) {
+        userModel.resetUser();
+        deliveryServicesModel.resetDeliveryServices();
+        var deferred = $q.defer();
+        $http.post(
+                ENV.apiEndpoint['1.2'] + "user/login/token", { t: token })
+            .success(function(result) {
+                deferred.resolve(result);
+            })
+            .error(function(fault) {
+                deferred.reject(fault);
+            });
+
+        return deferred.promise;
+    };
+
+    this.logout = function() {
+        userModel.resetUser();
+        deliveryServicesModel.resetDeliveryServices();
+        var promise = $http.post(
+                ENV.apiEndpoint['1.2'] + "user/logout")
+            .success(function(result) {
+                if ($state.current.name == 'trafficPortal.public.home.landing') {
+                    messageModel.setMessages(result.alerts, false);
+                } else {
+                    messageModel.setMessages(result.alerts, true);
+                    $state.go('trafficPortal.public.home.landing');
+                }
+                return result;
+            })
+            .error(function(fault) {
+                return fault;
+            });
+
+        return promise;
+    };
+
+};
+
+AuthService.$inject = ['$http', '$state', '$location', '$q', 'userModel', 'deliveryServicesModel', 'messageModel', 'ENV'];
+module.exports = AuthService;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/app/src/common/api/DeliveryServiceService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/app/src/common/api/DeliveryServiceService.js b/traffic_portal/v1/app/src/common/api/DeliveryServiceService.js
new file mode 100644
index 0000000..e2f2976
--- /dev/null
+++ b/traffic_portal/v1/app/src/common/api/DeliveryServiceService.js
@@ -0,0 +1,177 @@
+/*
+
+
+ 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 DeliveryServiceService = function($http, $q, deliveryServicesModel, messageModel, propertiesModel, ENV) {
+
+    var capacityRequest,
+        routingMethodsRequest,
+        cacheGroupHealthRequest;
+
+    var displayTimoutError = function(options) {
+        var msg = (angular.isDefined(options.message)) ? options.message : 'Request timeout';
+        if (options.status.toString().match(/^5\d[24]$/)) {
+            // 502 or 504
+            messageModel.setMessages([ { level: 'error', text: msg } ], false);
+        }
+    };
+
+    this.getDeliveryServices = function() {
+        var promise = $http.get(ENV.apiEndpoint['1.2'] + "deliveryservices.json")
+            .success(function(result) {
+                deliveryServicesModel.setDeliveryServices(result.response);
+                return result.response;
+            })
+            .error(function(fault) {
+            });
+
+        return promise;
+    };
+
+    this.getDeliveryService = function(deliveryServiceId) {
+        var deferred = $q.defer();
+        $http.get(ENV.apiEndpoint['1.2'] + "deliveryservices/" + deliveryServiceId + ".json")
+            .success(function(result) {
+                deferred.resolve(result.response[0]);
+            })
+            .error(function(fault) {
+                deferred.resolve(null);
+            });
+
+        return deferred.promise;
+    };
+
+    this.getState = function(deliveryServiceId, ignoreLoadingBar) {
+        var deferred = $q.defer();
+        $http.get(ENV.apiEndpoint['1.2'] + "deliveryservices/" + deliveryServiceId + "/state.json", { ignoreLoadingBar: ignoreLoadingBar })
+            .success(function(result) {
+                deferred.resolve(result.response);
+            })
+            .error(function(fault, status) {
+                displayTimoutError({ status: status });
+                deferred.reject();
+            });
+
+        return deferred.promise;
+    };
+
+    this.getCapacity = function(deliveryServiceId, ignoreLoadingBar, showTimeoutError) {
+        if (capacityRequest) {
+            capacityRequest.reject();
+        }
+        capacityRequest = $q.defer();
+
+        $http.get(ENV.apiEndpoint['1.2'] + "deliveryservices/" + deliveryServiceId + "/capacity.json",
+            { timeout: capacityRequest.promise, ignoreLoadingBar: ignoreLoadingBar })
+            .success(function(result) {
+                capacityRequest.resolve(result.response);
+            })
+            .error(function(fault, status) {
+                if (showTimeoutError) displayTimoutError({ status: status });
+                capacityRequest.reject();
+            });
+
+        return capacityRequest.promise;
+    };
+
+
+    this.getRoutingMethods = function(deliveryServiceId, ignoreLoadingBar, showTimeoutError) {
+        if (routingMethodsRequest) {
+            routingMethodsRequest.reject();
+        }
+        routingMethodsRequest = $q.defer();
+
+        $http.get(ENV.apiEndpoint['1.2'] + "deliveryservices/" + deliveryServiceId + "/routing.json",
+            { timeout: routingMethodsRequest.promise, ignoreLoadingBar: ignoreLoadingBar })
+            .success(function(result) {
+                routingMethodsRequest.resolve(result.response);
+            })
+            .error(function(fault, status) {
+                if (showTimeoutError) displayTimoutError({ status: status });
+                routingMethodsRequest.reject();
+            });
+
+        return routingMethodsRequest.promise;
+    };
+
+    this.getCacheGroupHealth = function(deliveryServiceId, ignoreLoadingBar, showTimeoutError) {
+        if (cacheGroupHealthRequest) {
+            cacheGroupHealthRequest.reject();
+        }
+        cacheGroupHealthRequest = $q.defer();
+
+        $http.get(ENV.apiEndpoint['1.2'] + "deliveryservices/" + deliveryServiceId + "/health.json",
+            { timeout: cacheGroupHealthRequest.promise, ignoreLoadingBar: ignoreLoadingBar })
+            .success(function(result) {
+                cacheGroupHealthRequest.resolve(result.response);
+            })
+            .error(function(fault, status) {
+                if (showTimeoutError) displayTimoutError({ status: status });
+                cacheGroupHealthRequest.reject();
+            });
+
+        return cacheGroupHealthRequest.promise;
+    };
+
+    this.getPurgeJobs = function(deliveryServiceId, ignoreLoadingBar) {
+        var deferred = $q.defer();
+        $http.get(ENV.apiEndpoint['1.2'] + "user/current/jobs.json?dsId=" + deliveryServiceId + "&keyword=PURGE", { ignoreLoadingBar: ignoreLoadingBar })
+            .success(function(result) {
+                deferred.resolve(result.response);
+            })
+            .error(function(fault) {
+                deferred.reject();
+            });
+
+        return deferred.promise;
+    };
+
+    this.getServers = function(deliveryServiceId, ignoreLoadingBar) {
+        var deferred = $q.defer();
+        $http.get(ENV.apiEndpoint['1.2'] + "servers.json?orderby=type&dsId=" + deliveryServiceId, { ignoreLoadingBar: ignoreLoadingBar })
+            .success(function(result) {
+                deferred.resolve(result.response);
+            })
+            .error(function(fault) {
+                deferred.reject();
+            });
+
+        return deferred.promise;
+    };
+
+    this.createDSRequest = function(dsData) {
+        var deferred = $q.defer();
+        $http.post(ENV.apiEndpoint['1.2'] + "deliveryservices/request", { emailTo: propertiesModel.properties.deliveryService.request.email, details: dsData } )
+            .success(function(result) {
+                if (angular.isDefined(result.alerts)) {
+                    messageModel.setMessages(result.alerts, false);
+                }
+                deferred.resolve(result);
+            })
+            .error(function(fault) {
+                if (angular.isDefined(fault.alerts)) {
+                    messageModel.setMessages(fault.alerts, false);
+                }
+                deferred.reject();
+            });
+
+        return deferred.promise;
+    };
+
+};
+
+DeliveryServiceService.$inject = ['$http', '$q', 'deliveryServicesModel', 'messageModel', 'propertiesModel', 'ENV'];
+module.exports = DeliveryServiceService;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/app/src/common/api/HealthService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/app/src/common/api/HealthService.js b/traffic_portal/v1/app/src/common/api/HealthService.js
new file mode 100644
index 0000000..a7948cd
--- /dev/null
+++ b/traffic_portal/v1/app/src/common/api/HealthService.js
@@ -0,0 +1,45 @@
+/*
+
+
+ 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 HealthService = function($http, $q, ENV) {
+
+    var displayTimoutError = function(options) {
+        var msg = (angular.isDefined(options.message)) ? options.message : 'Request timeout. Failed to load cache groups.';
+        if (options.status.toString().match(/^5\d[24]$/)) {
+            // 502 or 504
+            messageModel.setMessages([ { level: 'error', text: msg } ], false);
+        }
+    };
+
+    this.getCacheGroupHealth = function(entityId, ignoreLoadingBar, showTimeoutError) {
+        var deferred = $q.defer();
+        $http.get(ENV.apiEndpoint['1.2'] + "cdns/health.json", { ignoreLoadingBar: ignoreLoadingBar })
+            .success(function(result) {
+                deferred.resolve(result.response);
+            })
+            .error(function(fault, status) {
+                if (showTimeoutError) displayTimoutError({ status: status });
+                deferred.reject();
+            });
+
+        return deferred.promise;
+    };
+
+};
+
+HealthService.$inject = ['$http', '$q', 'ENV'];
+module.exports = HealthService;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/app/src/common/api/PortalService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/app/src/common/api/PortalService.js b/traffic_portal/v1/app/src/common/api/PortalService.js
new file mode 100644
index 0000000..baadf8e
--- /dev/null
+++ b/traffic_portal/v1/app/src/common/api/PortalService.js
@@ -0,0 +1,43 @@
+/*
+
+
+ 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 PortalService = function($http, $q) {
+
+    this.getReleaseVersionInfo = function() {
+        var deferred = $q.defer();
+        $http.get('traffic_portal_release.json')
+            .success(function(result) {
+                deferred.resolve(result);
+            });
+
+        return deferred.promise;
+    };
+
+    this.getProperties = function() {
+        var deferred = $q.defer();
+        $http.get('traffic_portal_properties.json')
+            .success(function(result) {
+                deferred.resolve(result.properties);
+            });
+
+        return deferred.promise;
+    };
+
+};
+
+PortalService.$inject = ['$http', '$q'];
+module.exports = PortalService;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/v1/app/src/common/api/StatsService.js
----------------------------------------------------------------------
diff --git a/traffic_portal/v1/app/src/common/api/StatsService.js b/traffic_portal/v1/app/src/common/api/StatsService.js
new file mode 100644
index 0000000..98ab370
--- /dev/null
+++ b/traffic_portal/v1/app/src/common/api/StatsService.js
@@ -0,0 +1,159 @@
+/*
+
+
+ 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 StatsService = function($http, $q, messageModel, ENV) {
+
+    var edgeBandwidthRequest,
+        edgeBandwidthSummaryRequest;
+
+    var edgeTransactionsRequest,
+        edgeTransactionsSummaryRequest;
+
+    var retentionPeriodInDays; // used as an influxdb override, leave null if no override
+
+    var displayTimoutError = function(options) {
+        var msg = (angular.isDefined(options.message)) ? options.message : 'Request timeout. Please narrow your chart window.';
+        if (options.status.toString().match(/^5\d[24]$/)) {
+            // 502 or 504
+            messageModel.setMessages([ { level: 'error', text: msg } ], false);
+        }
+    };
+
+    this.getEdgeBandwidthBatch = function(deliveryService, start, end, interval, exclude, ignoreLoadingBar, showError) {
+        var deferred = $q.defer();
+
+        var url = ENV.apiEndpoint['1.2'] + "deliveryservice_stats.json",
+            params = { deliveryServiceName: deliveryService.xmlId, metricType: 'kbps', serverType: 'edge', startDate: start.seconds(00).format(), endDate: end.seconds(00).format(), interval: interval, exclude: exclude, retentionPeriodInDays: retentionPeriodInDays };
+
+        $http.get(url, { params: params, ignoreLoadingBar: ignoreLoadingBar })
+            .success(function(result) {
+                deferred.resolve(result.response);
+            })
+            .error(function(fault, status) {
+                if (showError) displayTimoutError({ status: status });
+                deferred.reject();
+            });
+
+        return deferred.promise;
+    };
+
+    this.getEdgeBandwidth = function(deliveryService, start, end, interval, exclude, ignoreLoadingBar, showError) {
+        if (edgeBandwidthRequest) {
+            edgeBandwidthRequest.reject();
+        }
+        edgeBandwidthRequest = $q.defer();
+
+        var url = ENV.apiEndpoint['1.2'] + "deliveryservice_stats.json",
+            params = { deliveryServiceName: deliveryService.xmlId, metricType: 'kbps', serverType: 'edge', startDate: start.seconds(00).format(), endDate: end.seconds(00).format(), interval: interval, exclude: exclude, retentionPeriodInDays: retentionPeriodInDays};
+
+        $http.get(url, { params: params, timeout: edgeBandwidthRequest.promise, ignoreLoadingBar: ignoreLoadingBar })
+            .success(function(result) {
+                edgeBandwidthRequest.resolve(result.response);
+            })
+            .error(function(fault, status) {
+                if (showError) displayTimoutError({ status: status });
+                edgeBandwidthRequest.reject();
+            });
+
+        return edgeBandwidthRequest.promise;
+    };
+
+    this.getEdgeBandwidthSummary = function(deliveryService, start, end, interval, exclude, ignoreLoadingBar, showError) {
+        if (edgeBandwidthSummaryRequest) {
+            edgeBandwidthSummaryRequest.reject();
+        }
+        edgeBandwidthSummaryRequest = $q.defer();
+
+        var url = ENV.apiEndpoint['1.2'] + "deliveryservice_stats.json",
+            params = { deliveryServiceName: deliveryService.xmlId, metricType: 'kbps', serverType: 'edge', startDate: start.seconds(00).format(), endDate: end.seconds(00).format(), interval: interval, exclude: exclude, retentionPeriodInDays: retentionPeriodInDays };
+
+        $http.get(url, { params: params, timeout: edgeBandwidthSummaryRequest.promise, ignoreLoadingBar: ignoreLoadingBar })
+            .success(function(result) {
+                edgeBandwidthSummaryRequest.resolve(result.response);
+            })
+            .error(function(fault, status) {
+                if (showError) displayTimoutError({ status: status });
+                edgeBandwidthSummaryRequest.reject();
+            });
+
+        return edgeBandwidthSummaryRequest.promise;
+    };
+
+    this.getEdgeTransactions = function(deliveryService, start, end, interval, exclude, ignoreLoadingBar, showError) {
+        if (edgeTransactionsRequest) {
+            edgeTransactionsRequest.reject();
+        }
+        edgeTransactionsRequest = $q.defer();
+
+        var url = ENV.apiEndpoint['1.2'] + "deliveryservice_stats.json",
+            params = { deliveryServiceName: deliveryService.xmlId, metricType: 'tps_total', serverType: 'edge', startDate: start.seconds(00).format(), endDate: end.seconds(00).format(), interval: interval, exclude: exclude, retentionPeriodInDays: retentionPeriodInDays };
+
+        $http.get(url, { params: params, timeout: edgeTransactionsRequest.promise, ignoreLoadingBar: ignoreLoadingBar })
+            .success(function(result) {
+                edgeTransactionsRequest.resolve(result.response);
+            })
+            .error(function(fault, status) {
+                if (showError) displayTimoutError({ status: status });
+                edgeTransactionsRequest.reject();
+            });
+
+        return edgeTransactionsRequest.promise;
+    };
+
+    this.getEdgeTransactionsSummary = function(deliveryService, start, end, interval, ignoreLoadingBar, showError) {
+        if (edgeTransactionsSummaryRequest) {
+            edgeTransactionsSummaryRequest.reject();
+        }
+        edgeTransactionsSummaryRequest = $q.defer();
+
+        var url = ENV.apiEndpoint['1.2'] + "deliveryservice_stats.json",
+            params = { deliveryServiceName: deliveryService.xmlId, metricType: 'tps_total', serverType: 'edge', startDate: start.seconds(00).format(), endDate: end.seconds(00).format(), interval: interval, exclude: 'series', retentionPeriodInDays: retentionPeriodInDays };
+
+        $http.get(url, { params: params, timeout: edgeTransactionsSummaryRequest.promise, ignoreLoadingBar: ignoreLoadingBar })
+            .success(function(result) {
+                edgeTransactionsSummaryRequest.resolve(result.response);
+            })
+            .error(function(fault, status) {
+                if (showError) displayTimoutError({ status: status });
+                edgeTransactionsSummaryRequest.reject();
+            });
+
+        return edgeTransactionsSummaryRequest.promise;
+    };
+
+    this.getEdgeTransactionsByStatusGroup = function(deliveryService, httpStatus, start, end, interval, exclude, ignoreLoadingBar, showError) {
+        var request = $q.defer();
+
+        var url = ENV.apiEndpoint['1.2'] + "deliveryservice_stats.json",
+            params = { deliveryServiceName: deliveryService.xmlId, metricType: 'tps_' + httpStatus, serverType: 'edge', startDate: start.seconds(00).format(), endDate: end.seconds(00).format(), interval: interval, exclude: exclude, retentionPeriodInDays: retentionPeriodInDays };
+
+        $http.get(url, { params: params, ignoreLoadingBar: ignoreLoadingBar })
+            .success(function(result) {
+                request.resolve(result.response);
+            })
+            .error(function(fault, status) {
+                if (showError) displayTimoutError({ status: status });
+                request.reject();
+            });
+
+        return request.promise;
+    };
+
+};
+
+StatsService.$inject = ['$http', '$q', 'messageModel', 'ENV'];
+module.exports = StatsService;
\ No newline at end of file


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

Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/new/index.js b/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/new/index.js
new file mode 100644
index 0000000..7485312
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/regexes/new/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.configure.deliveryServices.regexes.new', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.deliveryServices.regexes.new', {
+				url: '/new',
+				views: {
+					deliveryServiceRegexesContent: {
+						templateUrl: 'common/modules/form/deliveryServiceRegex/form.deliveryServiceRegex.tpl.html',
+						controller: 'FormNewDeliveryServiceRegexController',
+						resolve: {
+							deliveryService: function($stateParams, deliveryServiceService) {
+								return deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
+							},
+							regex: function() {
+								return {};
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/servers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/servers/index.js b/traffic_portal/app/src/modules/private/configure/deliveryServices/servers/index.js
new file mode 100644
index 0000000..fbc9826
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/servers/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.configure.deliveryServices.servers', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.deliveryServices.servers', {
+				url: '/{deliveryServiceId}/servers',
+				views: {
+					deliveryServicesContent: {
+						templateUrl: 'common/modules/table/deliveryServiceServers/table.deliveryServiceServers.tpl.html',
+						controller: 'TableDeliveryServiceServersController',
+						resolve: {
+							deliveryService: function($stateParams, deliveryServiceService) {
+								return deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
+							},
+							servers: function($stateParams, serverService) {
+								return serverService.getDeliveryServiceServers($stateParams.deliveryServiceId);
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/staticDnsEntries/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/staticDnsEntries/index.js b/traffic_portal/app/src/modules/private/configure/deliveryServices/staticDnsEntries/index.js
new file mode 100644
index 0000000..c90d81c
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/staticDnsEntries/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.configure.deliveryServices.staticDnsEntries', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.deliveryServices.staticDnsEntries', {
+				url: '/{deliveryServiceId}/static-dns-entries',
+				views: {
+					deliveryServicesContent: {
+						templateUrl: 'common/modules/table/deliveryServiceStaticDnsEntries/table.deliveryServiceStaticDnsEntries.tpl.html',
+						controller: 'TableDeliveryServiceStaticDnsEntriesController',
+						resolve: {
+							deliveryService: function($stateParams, deliveryServiceService) {
+								return deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
+							},
+							staticDnsEntries: function($stateParams, staticDnsEntryService) {
+								return staticDnsEntryService.getStaticDnsEntries($stateParams.deliveryServiceId);
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/deliveryServices/users/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/deliveryServices/users/index.js b/traffic_portal/app/src/modules/private/configure/deliveryServices/users/index.js
new file mode 100644
index 0000000..d96862b
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/deliveryServices/users/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.configure.deliveryServices.users', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.deliveryServices.users', {
+				url: '/{deliveryServiceId}/users',
+				views: {
+					deliveryServicesContent: {
+						templateUrl: 'common/modules/table/deliveryServiceUsers/table.deliveryServiceUsers.tpl.html',
+						controller: 'TableDeliveryServiceUsersController',
+						resolve: {
+							deliveryService: function($stateParams, deliveryServiceService) {
+								return deliveryServiceService.getDeliveryService($stateParams.deliveryServiceId);
+							},
+							users: function($stateParams, userService) {
+								return userService.getUsers();
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/index.js b/traffic_portal/app/src/modules/private/configure/index.js
new file mode 100644
index 0000000..d8108d1
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/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.configure', [])
+    .controller('ConfigureController', require('./ConfigureController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.configure', {
+                url: 'configure',
+                abstract: true,
+                views: {
+                    privateContent: {
+                        templateUrl: 'modules/private/configure/configure.tpl.html',
+                        controller: 'ConfigureController'
+                    }
+                }
+            });
+        $urlRouterProvider.otherwise('/');
+    });

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

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/servers/_servers.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/servers/_servers.scss b/traffic_portal/app/src/modules/private/configure/servers/_servers.scss
new file mode 100644
index 0000000..d57b9c6
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/servers/_servers.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/configure/servers/deliveryServices/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/servers/deliveryServices/index.js b/traffic_portal/app/src/modules/private/configure/servers/deliveryServices/index.js
new file mode 100644
index 0000000..bd2d42f
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/servers/deliveryServices/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.configure.servers.deliveryServices', [])
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.configure.servers.deliveryServices', {
+				url: '/{serverId}/delivery-services',
+				views: {
+					serversContent: {
+						templateUrl: 'common/modules/table/serverDeliveryServices/table.serverDeliveryServices.tpl.html',
+						controller: 'TableServerDeliveryServicesController',
+						resolve: {
+							server: function($stateParams, serverService) {
+								return serverService.getServer($stateParams.serverId);
+							},
+							serverDeliveryServices: function($stateParams, deliveryServiceService) {
+								return deliveryServiceService.getServerDeliveryServices($stateParams.serverId);
+							}
+						}
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/servers/edit/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/servers/edit/index.js b/traffic_portal/app/src/modules/private/configure/servers/edit/index.js
new file mode 100644
index 0000000..0ac3193
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/servers/edit/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.configure.servers.edit', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.configure.servers.edit', {
+                url: '/{serverId:[0-9]{1,8}}',
+                views: {
+                    serversContent: {
+                        templateUrl: 'common/modules/form/server/form.server.tpl.html',
+                        controller: 'FormEditServerController',
+                        resolve: {
+                            server: function($stateParams, serverService) {
+                                return serverService.getServer($stateParams.serverId);
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/servers/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/servers/index.js b/traffic_portal/app/src/modules/private/configure/servers/index.js
new file mode 100644
index 0000000..aeda9f9
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/servers/index.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.
+ */
+
+module.exports = angular.module('trafficPortal.private.configure.servers', [])
+    .controller('ServersController', require('./ServersController'))
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.configure.servers', {
+                url: '/servers',
+                abstract: true,
+                views: {
+                    configureContent: {
+                        templateUrl: 'modules/private/configure/servers/servers.tpl.html',
+                        controller: 'ServersController'
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/servers/list/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/servers/list/index.js b/traffic_portal/app/src/modules/private/configure/servers/list/index.js
new file mode 100644
index 0000000..eec84ec
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/servers/list/index.js
@@ -0,0 +1,39 @@
+/*
+ * 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.configure.servers.list', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.configure.servers.list', {
+                url: '',
+                views: {
+                    serversContent: {
+                        templateUrl: 'common/modules/table/servers/table.servers.tpl.html',
+                        controller: 'TableServersController',
+                        resolve: {
+                            servers: function(serverService) {
+                                return serverService.getServers();
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/servers/new/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/servers/new/index.js b/traffic_portal/app/src/modules/private/configure/servers/new/index.js
new file mode 100644
index 0000000..f7941a3
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/servers/new/index.js
@@ -0,0 +1,42 @@
+/*
+ * 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.configure.servers.new', [])
+    .config(function($stateProvider, $urlRouterProvider) {
+        $stateProvider
+            .state('trafficPortal.private.configure.servers.new', {
+                url: '/new',
+                views: {
+                    serversContent: {
+                        templateUrl: 'common/modules/form/server/form.server.tpl.html',
+                        controller: 'FormNewServerController',
+                        resolve: {
+                            server: function() {
+                                return {
+                                    updPending: false,
+                                    statusId: 1 // todo: 1 is the ID of OFFLINE, need to get the ID dynamically
+                                };
+                            }
+                        }
+                    }
+                }
+            })
+        ;
+        $urlRouterProvider.otherwise('/');
+    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/configure/servers/servers.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/configure/servers/servers.tpl.html b/traffic_portal/app/src/modules/private/configure/servers/servers.tpl.html
new file mode 100644
index 0000000..326b8fc
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/configure/servers/servers.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="serversContainer">
+    <div ui-view="serversContent"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/custom/CustomController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/custom/CustomController.js b/traffic_portal/app/src/modules/private/custom/CustomController.js
new file mode 100644
index 0000000..66f0321
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/custom/CustomController.js
@@ -0,0 +1,42 @@
+/*
+
+
+ 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 CustomController = function($scope, $sce, $timeout, $location) {
+
+	var pinIframe = function() {
+		var headerHeight = $('#header').css("height");
+		$('#customFrameWrapper').css("top", headerHeight);
+		$('#customFrameWrapper').css("bottom", 0);
+	};
+
+	$scope.url = decodeURIComponent($location.search().url);
+
+	$scope.trustSrc = function(src) {
+		return $sce.trustAsResourceUrl(src);
+	};
+
+	var init = function () {
+		$timeout(function () {
+			pinIframe();
+		}, 200);
+	};
+	init();
+
+};
+
+CustomController.$inject = ['$scope', '$sce', '$timeout', '$location'];
+module.exports = CustomController;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/custom/_custom.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/custom/_custom.scss b/traffic_portal/app/src/modules/private/custom/_custom.scss
new file mode 100644
index 0000000..184957b
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/custom/_custom.scss
@@ -0,0 +1,36 @@
+/*
+
+
+ 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.
+
+*/
+
+#customFrameWrapper {
+  position:absolute;
+  right:0;
+}
+
+body.nav-sm .container.body #customFrameWrapper {
+  left: 70px;
+}
+
+@media(min-width:992px) {
+  body.nav-md .container.body #customFrameWrapper {
+    left: 230px;
+  }
+}
+
+#customFrame {
+  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/private/custom/custom.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/custom/custom.tpl.html b/traffic_portal/app/src/modules/private/custom/custom.tpl.html
new file mode 100644
index 0000000..85d3bfe
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/custom/custom.tpl.html
@@ -0,0 +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.
+
+-->
+
+<div id="customFrameWrapper">
+    <iframe id="customFrame" ng-src="{{trustSrc(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/private/custom/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/custom/index.js b/traffic_portal/app/src/modules/private/custom/index.js
new file mode 100644
index 0000000..a46fbe6
--- /dev/null
+++ b/traffic_portal/app/src/modules/private/custom/index.js
@@ -0,0 +1,33 @@
+/*
+
+
+ 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.private.custom', [])
+	.controller('CustomController', require('./CustomController'))
+	.config(function($stateProvider, $urlRouterProvider) {
+		$stateProvider
+			.state('trafficPortal.private.custom', {
+				url: 'custom',
+				views: {
+					privateContent: {
+						templateUrl: 'modules/private/custom/custom.tpl.html',
+						controller: 'CustomController'
+					}
+				}
+			})
+		;
+		$urlRouterProvider.otherwise('/');
+	});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/dashboard/DashboardController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/dashboard/DashboardController.js b/traffic_portal/app/src/modules/private/dashboard/DashboardController.js
deleted file mode 100644
index a09ba9d..0000000
--- a/traffic_portal/app/src/modules/private/dashboard/DashboardController.js
+++ /dev/null
@@ -1,37 +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 DashboardController = function($scope, $location, chartModel, deliveryServicesModel, propertiesModel, userModel) {
-
-    $scope.deliveryServices = deliveryServicesModel.deliveryServices;
-
-    $scope.properties = propertiesModel.properties;
-
-    $scope.user = angular.copy(userModel.user);
-
-    $scope.requestDS = function() {
-        $location.url('/delivery-service/new');
-    };
-
-    var init = function () {
-        chartModel.resetChart(); // set chart back to default parameters
-    };
-    init();
-};
-
-DashboardController.$inject = ['$scope', '$location', 'chartModel', 'deliveryServicesModel', 'propertiesModel', 'userModel'];
-module.exports = DashboardController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/dashboard/_dashboard.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/dashboard/_dashboard.scss b/traffic_portal/app/src/modules/private/dashboard/_dashboard.scss
deleted file mode 100644
index 891e068..0000000
--- a/traffic_portal/app/src/modules/private/dashboard/_dashboard.scss
+++ /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.
-
-*/
-
-#dashboardContainer {
-
-  .request-ds-btn {
-    float: right;
-    margin-left: 5px;
-    margin-top: 20px;
-  }
-
-  .ds-container {
-    clear: both;
-    border: 1px solid #A8A8A8;
-    padding: 20px 20px 0 20px;
-    margin-bottom: 20px;
-  }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/dashboard/dashboard.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/dashboard/dashboard.tpl.html b/traffic_portal/app/src/modules/private/dashboard/dashboard.tpl.html
deleted file mode 100644
index 62764f0..0000000
--- a/traffic_portal/app/src/modules/private/dashboard/dashboard.tpl.html
+++ /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.
-
--->
-
-<div id="dashboardContainer">
-    <h2>CDN Health</h2>
-    <div class="row">
-        <div class="locations-container col-lg-12 col-md-12 col-sm-12">
-            <div ui-view="cacheGroupsContent"></div>
-        </div>
-    </div>
-    <hr>
-    <div class="row">
-        <div class="col-lg-7 col-md-7 col-sm-7">
-            <h2>Assigned Delivery Services <small>[ {{deliveryServices.length}} ]</small></h2>
-        </div>
-        <div class="col-lg-5 col-md-5 col-sm-5">
-            <button ng-if="properties.deliveryService.request.show" type="button" class="request-ds-btn action-btn btn" ng-click="requestDS()"><i class="fa fa-plus fa-fw"></i> New Delivery Service</button>
-        </div>
-    </div>
-    <div class="ds-container col-lg-12 col-md-12 col-sm-12">
-        <div ui-view="deliveryServicesContent"></div>
-    </div>
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/dashboard/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/dashboard/index.js b/traffic_portal/app/src/modules/private/dashboard/index.js
deleted file mode 100644
index a997c20..0000000
--- a/traffic_portal/app/src/modules/private/dashboard/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.private.dashboard', [])
-    .controller('DashboardController', require('./DashboardController'))
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.dashboard', {
-                url: 'dashboard',
-                abstract: true,
-                views: {
-                    privateContent: {
-                        templateUrl: 'modules/private/dashboard/dashboard.tpl.html',
-                        controller: 'DashboardController'
-                    }
-                }
-            });
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/dashboard/overview/deliveryServices/DashboardDeliveryServicesController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/dashboard/overview/deliveryServices/DashboardDeliveryServicesController.js b/traffic_portal/app/src/modules/private/dashboard/overview/deliveryServices/DashboardDeliveryServicesController.js
deleted file mode 100644
index 73debf6..0000000
--- a/traffic_portal/app/src/modules/private/dashboard/overview/deliveryServices/DashboardDeliveryServicesController.js
+++ /dev/null
@@ -1,188 +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 DashboardDeliveryServicesController = function($window, $rootScope, $scope, $location, $uibModal, $q, $interval, $filter, $anchorScroll, dateUtils, numberUtils, chartUtils, messageModel, chartModel, statsService) {
-
-    var bandwidthInterval;
-
-    var createDeliveryServiceSparkline = function(dsId, unitSize) {
-        var $sparkLine = $(".delivery-service-sparkline-" + dsId),
-            data = chartUtils.formatData($sparkLine.data('sparkline'));
-
-        var options = {
-            xaxis: {
-                mode: "time",
-                timezone: "browser",
-                ticks: false
-            },
-            yaxis: { ticks: false },
-            grid: {
-                borderWidth: 0,
-                hoverable: true
-            },
-            tooltip: {
-                show: true,
-                content: function(label, xval, yval, flotItem){
-                    return '<span>' + $filter('number')(yval, 2) + ' ' + unitSize + 'ps @ ' + dateUtils.dateFormat(xval, "h:MM:ss tt (Z)") + '</span>';
-                }
-            }
-        };
-
-        var series = [
-            {
-                data: data,
-                color: '#337ab7',
-                lines: {
-                    lineWidth: 0.8
-                },
-                shadowSize: 0
-            }
-        ];
-
-        // draw the sparkline
-        $.plot($sparkLine, series, options);
-    };
-
-    $scope.loadBandwidth = function(dsId, showLoading) {
-        if (!$rootScope.online) return;
-
-        var deliveryService = _.find($scope.deliveryServices, function(ds){ return ds.id === dsId }),
-            $sparkLine = $(".delivery-service-sparkline-" + dsId),
-            yesterday = moment().subtract(24, 'hours'),
-            now = moment(),
-            exclude = '';
-
-        if (showLoading) {
-            try {
-                $sparkLine.empty(); // remove the sparkline if it's there
-            } catch (err) {
-                // there was no sparkline evidently so no need to clear it
-            }
-
-            $sparkLine.html("<div>Loading...</div>");
-            $('.delivery-service-last-' + dsId).html("<div>Calculating...</div>");
-        }
-
-        statsService.getEdgeBandwidthBatch(deliveryService, yesterday, now, '60s', exclude, true, false)
-            .then(
-                function(response) {
-
-                    var sparklineData = [],
-                        originalValue = 0,
-                        convertedValue = 0,
-                        summary = response.summary,
-                        series = response.series;
-
-                    try {
-                        $scope.unitSize = numberUtils.shrink(summary.average)[1];
-                        _.each(series.values, function(seriesItem) {
-                            if (_.isNumber(seriesItem[1])) {
-                                originalValue = seriesItem[1];
-                                convertedValue = numberUtils.convertTo(seriesItem[1], $scope.unitSize);
-                                sparklineData.push(moment(seriesItem[0]).valueOf()); // time in milliseconds
-                                sparklineData.push(convertedValue); // value
-                            }
-                        });
-                    }
-                    catch (e) {
-                        // no bandwidth for delivery service
-                    }
-
-                    deliveryService.last = originalValue;
-                    var convertedLast = numberUtils.shrink(originalValue);
-                    $('.delivery-service-last-' + dsId).html($filter('number')(convertedLast[0], 2) + ' ' + convertedLast[1] + 'ps');
-                    $sparkLine.data('sparkline', sparklineData.join(','));
-                    createDeliveryServiceSparkline(dsId, $scope.unitSize);
-                },
-                function(fault) {
-                    $('.delivery-service-sparkline-' + dsId).html('Error');
-                    $('.delivery-service-last-' + dsId).html('Error');
-                });
-    };
-
-    $scope.search = {
-        query: ""
-    };
-
-    $scope.predicate = 'displayName';
-    $scope.reverse = false;
-
-    $scope.dsOptions = {
-        inactive: true
-    };
-
-    $scope.unitSize = 'Kb';
-
-    $scope.autoLoadLimit = 10;
-
-    $scope.navigateToDeliveryService = function(dsId) {
-        $location.url('/delivery-service/' + dsId).search({ start: moment(chartModel.chart.start).format(), end: moment(chartModel.chart.end).format() });
-    };
-
-    $scope.viewConfig = function(ds) {
-
-        var modalInstance = $uibModal.open({
-            templateUrl: 'common/modules/deliveryService/config/edit/deliveryService.config.edit.tpl.html',
-            controller: 'DSConfigEditController',
-            size: 'lg',
-            windowClass: 'ds-config-modal',
-            resolve: {
-                deliveryService: function (deliveryServiceService) {
-                    return deliveryServiceService.getDeliveryService(ds.id);
-                }
-            }
-        });
-
-        modalInstance.result.then(function() {
-        }, function () {
-            // do nothing
-        });
-    };
-
-    $scope.showInactive = function(show) {
-        $scope.dsOptions.inactive = show;
-    };
-
-    $scope.hideDeliveryService = function(ds) {
-        var query = $scope.search.query.toLowerCase(),
-            id = ds.id.toString(),
-            xmlId = ds.xmlId.toLowerCase(),
-            displayName = ds.displayName.toLowerCase(),
-            isSubstring = (id.indexOf(query) !== -1) || (xmlId.indexOf(query) !== -1) || (displayName.indexOf(query) !== -1);
-
-        return !isSubstring || ($scope.dsOptions.inactive == false && !ds.active);
-    };
-
-    angular.element(document).ready(function () {
-        // if you do not exceed # of delivery services allowed for autoload, we'll autoload bandwidth for each delivery service and refresh on a timer
-        if ($scope.deliveryServices.length <= $scope.autoLoadLimit) {
-            $scope.loadAllBandwidth();
-            bandwidthInterval = $interval($scope.loadAllBandwidth, (5*60*1000)); // new bandwidth data every 5 minutes
-        }
-    });
-
-    $scope.$on("$destroy", function() {
-        if (angular.isDefined(bandwidthInterval)) {
-            $interval.cancel(bandwidthInterval);
-            bandwidthInterval = undefined;
-        }
-    });
-
-};
-
-DashboardDeliveryServicesController.$inject = ['$window', '$rootScope', '$scope', '$location', '$uibModal', '$q', '$interval', '$filter', '$anchorScroll', 'dateUtils', 'numberUtils', 'chartUtils', 'messageModel', 'chartModel', 'statsService'];
-module.exports = DashboardDeliveryServicesController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/dashboard/overview/deliveryServices/_dashboard.deliveryServices.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/dashboard/overview/deliveryServices/_dashboard.deliveryServices.scss b/traffic_portal/app/src/modules/private/dashboard/overview/deliveryServices/_dashboard.deliveryServices.scss
deleted file mode 100644
index ea39454..0000000
--- a/traffic_portal/app/src/modules/private/dashboard/overview/deliveryServices/_dashboard.deliveryServices.scss
+++ /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.
-
-*/
-
-#dashboardDSSearchForm {
-  margin-bottom: 10px;
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/dashboard/overview/deliveryServices/dashboard.deliveryServices.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/dashboard/overview/deliveryServices/dashboard.deliveryServices.tpl.html b/traffic_portal/app/src/modules/private/dashboard/overview/deliveryServices/dashboard.deliveryServices.tpl.html
deleted file mode 100644
index 9df6480..0000000
--- a/traffic_portal/app/src/modules/private/dashboard/overview/deliveryServices/dashboard.deliveryServices.tpl.html
+++ /dev/null
@@ -1,52 +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="dashboardDSSearchForm" class="input-group">
-    <input type="text" class="filter-input form-control" placeholder="Filter delivery services..." ng-model="search.query">
-    <span class="filter-input-group-btn input-group-btn">
-        <button ng-show="dsOptions.inactive == true" ng-click="showInactive(false)" class="btn btn-default btn-last" type="button" uib-popover="Hide inactive delivery services" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true" popover-class="popover-class">Hide Inactive</button>
-        <button ng-show="dsOptions.inactive == false" ng-click="showInactive(true)" class="btn btn-default btn-last" type="button" uib-popover="Show inactive delivery services" popover-trigger="mouseenter" popover-placement="bottom" popover-append-to-body="true" popover-class="popover-class">Show Inactive</button>
-    </span>
-</div>
-<table id="dashboardDSTable" class="table">
-    <thead>
-    <tr>
-        <th>ID</th>
-        <th><a ng-click="predicate = 'displayName'; reverse = !reverse">Delivery Service Name <i class="fa fa-caret-up fa-fw" ng-show="predicate == 'displayName' && !reverse"></i><i class="fa fa-caret-down fa-fw" ng-show="predicate == 'displayName' && reverse"></i></a></th>
-        <th>Bandwidth (24 hrs)</th>
-        <th><a ng-click="predicate = 'last'; reverse = !reverse">Last Bandwidth <i class="fa fa-caret-up fa-fw" ng-show="predicate == 'last' && !reverse"></i><i class="fa fa-caret-down fa-fw" ng-show="predicate == 'last' && reverse"></i></a></th>
-        <th>Actions</th>
-    </tr>
-    </thead>
-    <tbody>
-    <tr class="delivery-service-row" ng-class="{'active': !deliveryService.active}" ng-repeat="deliveryService in deliveryServices | orderBy:predicate:reverse" ng-hide="hideDeliveryService(deliveryService)">
-        <td><a class="link" ng-click="navigateToDeliveryService(deliveryService.id)"><span title="{{deliveryService.id}}">{{deliveryService.id}}</span></a></td>
-        <td><a class="link" ng-click="navigateToDeliveryService(deliveryService.id)"><span title="{{deliveryService.displayName}} ({{deliveryService.id}} | {{deliveryService.xmlId}})">{{deliveryService.displayName}}</span> <span ng-show="!deliveryService.active">[ inactive ]</span></a></td>
-        <td class="delivery-service-sparkline delivery-service-sparkline-{{deliveryService.id}} loading-text"><a class="link" title="Load Bandwidth" ng-click="loadBandwidth(deliveryService.id, true)">Load Bandwidth</a></td>
-        <td class="delivery-service-last-{{deliveryService.id}} loading-text" style="min-width:120px;"></td>
-        <td style="width:130px;">
-            <a class="link" title="Refresh Delivery Service Bandwidth" ng-click="loadBandwidth(deliveryService.id, true)"><i class="fa fa-refresh fa-fw"></i></a>
-            <a class="link" title="View Delivery Service Config" ng-click="viewConfig(deliveryService)"><i class="fa fa-cog fa-fw"></i></a>
-            <a class="link" title="View Delivery Service in New Window" target="_blank" ui-sref="trafficPortal.private.deliveryService.view.overview.detail({deliveryServiceId:deliveryService.id})"><i class="fa fa-external-link fa-fw"></i></a>
-        </td>
-    </tr>
-    </tbody>
-</table>
-<div class="alert alert-info" ng-show="deliveryServices.length == 0">
-    No delivery services configured for current user
-</div>
-

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/dashboard/overview/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/dashboard/overview/index.js b/traffic_portal/app/src/modules/private/dashboard/overview/index.js
deleted file mode 100644
index 27ade92..0000000
--- a/traffic_portal/app/src/modules/private/dashboard/overview/index.js
+++ /dev/null
@@ -1,48 +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.private.dashboard.overview', [])
-    .controller('DashboardDeliveryServicesController', require('./deliveryServices/DashboardDeliveryServicesController'))
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.dashboard.overview', {
-                url: '',
-                views: {
-                    cacheGroupsContent: {
-                        templateUrl: 'common/modules/cacheGroups/cacheGroups.tpl.html',
-                        controller: 'CacheGroupsController',
-                        resolve: {
-                            entityId: function() {
-                                return null;
-                            },
-                            service: function(healthService) {
-                                return healthService;
-                            },
-                            showDownload: function() {
-                                return false;
-                            }
-                        }
-                    },
-                    deliveryServicesContent: {
-                        templateUrl: 'modules/private/dashboard/overview/deliveryServices/dashboard.deliveryServices.tpl.html',
-                        controller: 'DashboardDeliveryServicesController'
-                    }
-                }
-            })
-        ;
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/DeliveryServiceController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/DeliveryServiceController.js b/traffic_portal/app/src/modules/private/deliveryService/DeliveryServiceController.js
deleted file mode 100644
index 47bc476..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/DeliveryServiceController.js
+++ /dev/null
@@ -1,25 +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 DeliveryServiceController = function($scope, userModel) {
-
-    $scope.user = angular.copy(userModel.user);
-
-};
-
-DeliveryServiceController.$inject = ['$scope', 'userModel'];
-module.exports = DeliveryServiceController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/_deliveryService.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/_deliveryService.scss b/traffic_portal/app/src/modules/private/deliveryService/_deliveryService.scss
deleted file mode 100644
index fff23b4..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/_deliveryService.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/deliveryService/deliveryService.tpl.html
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/deliveryService.tpl.html b/traffic_portal/app/src/modules/private/deliveryService/deliveryService.tpl.html
deleted file mode 100644
index b986f5c..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/deliveryService.tpl.html
+++ /dev/null
@@ -1,18 +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 ui-view="deliveryServiceContent"></div>

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/index.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/index.js b/traffic_portal/app/src/modules/private/deliveryService/index.js
deleted file mode 100644
index 19c6ecf..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/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', [])
-    .controller('DeliveryServiceController', require('./DeliveryServiceController'))
-    .config(function($stateProvider, $urlRouterProvider) {
-        $stateProvider
-            .state('trafficPortal.private.deliveryService', {
-                url: 'delivery-service',
-                abstract: true,
-                views: {
-                    privateContent: {
-                        templateUrl: 'modules/private/deliveryService/deliveryService.tpl.html',
-                        controller: 'DeliveryServiceController'
-                    }
-                }
-            });
-        $urlRouterProvider.otherwise('/');
-    });

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/new/DeliveryServiceNewController.js
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/new/DeliveryServiceNewController.js b/traffic_portal/app/src/modules/private/deliveryService/new/DeliveryServiceNewController.js
deleted file mode 100644
index 36e81ab..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/new/DeliveryServiceNewController.js
+++ /dev/null
@@ -1,147 +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 DeliveryServiceNewController = function($scope, $location, $anchorScroll, formUtils, deliveryServiceService) {
-
-    $scope.templates = {
-        signedUrls: 'signedUrl.html',
-        queryStringHandling: 'queryStringHandling.html',
-        rangeRequestHandling: 'rangeRequestHandling.html',
-        headerRewriteEdge: 'headerRewriteEdge.html',
-        headerRewriteMid: 'headerRewriteMid.html',
-        headerRewriteRedirectRouter: 'headerRewriteRedirectRouter.html'
-    };
-
-    $scope.openTab = 'service-desc-tab';
-
-    $scope.booleans = [
-        { label: 'Yes', value: true },
-        { label: 'No', value: false }
-    ];
-
-    $scope.serviceDescStarted = true;
-    $scope.trafficStarted = false;
-    $scope.originStarted = false;
-    $scope.coreStarted = false;
-    $scope.serviceLimitStarted = false;
-    $scope.headerStarted = false;
-    $scope.notesStarted = false;
-    $scope.confirmStarted = false;
-
-    $scope.resetDSData = function() {
-        $scope.dsData = {
-            customer: '',
-            contentType: 'video-on-demand',
-            deliveryProtocol: 'http',
-            routingType: 'dns',
-            serviceDesc: '',
-            peakBPSEstimate: 'less-than-5-Gbps',
-            peakTPSEstimate: 'less-than-1000-TPS',
-            maxLibrarySizeEstimate: 'less-than-200-GB',
-            originURL: '',
-            hasOriginDynamicRemap: false,
-            originTestFile: '',
-            hasOriginACLWhitelist: false,
-            originHeaders: '',
-            otherOriginSecurity: '',
-            queryStringHandling: 'ignore-in-cache-key-and-pass-up',
-            rangeRequestHandling: 'range-requests-not-used',
-            hasSignedURLs: false,
-            hasNegativeCachingCustomization: false,
-            negativeCachingCustomizationNote: '',
-            serviceAliases: [ '' ],
-            rateLimitingGBPS: 0,
-            rateLimitingTPS: 0,
-            overflowService: '',
-            headerRewriteEdge: '',
-            headerRewriteMid: '',
-            headerRewriteRedirectRouter: '',
-            notes: ''
-        };
-    };
-    $scope.resetDSData();
-
-    $scope.onDeliveryProtocolChange = function() {
-        if ($scope.dsData.deliveryProtocol == 'http-to-https') {
-            $scope.dsData.routingType = 'http'; // routing type must be http for http-to-https protocol
-        }
-    };
-
-    $scope.onRoutingTypeChange = function() {
-        if ($scope.dsData.routingType == 'dns') {
-            $scope.dsData.headerRewriteRedirectRouter = ''; // not relevant for dns
-        }
-    };
-
-    $scope.onNegativeCachingCustomizationChange = function() {
-        if ($scope.dsData.hasNegativeCachingCustomization == false) {
-            $scope.dsData.negativeCachingCustomizationNote = ''; // note no relevant
-        }
-    };
-
-    $scope.onRateLimitingChange = function() {
-        if ($scope.dsData.rateLimitingGBPS <= 0 && $scope.dsData.rateLimitingTPS <= 0) {
-            $scope.dsData.overflowService = ''; // overflow service is irrelevant if no rate limits
-        }
-    };
-
-    $scope.navigateToDashboard = function() {
-        $location.url('/dashboard');
-    };
-
-    $scope.incomplete = function(forms) {
-        var incomplete = false;
-        if (!$scope.serviceDescStarted || !$scope.trafficStarted || !$scope.originStarted || !$scope.coreStarted || !$scope.serviceLimitStarted || !$scope.notesStarted || !$scope.confirmStarted) {
-            return true;
-        }
-        _.each(forms, function(form) {
-            if (form.$invalid) {
-                incomplete = true;
-            }
-        });
-        return incomplete;
-    };
-
-    $scope.jumpToTab = function(tab, startedFlag) {
-        $scope.openTab = tab;
-        $scope[startedFlag] = true;
-    };
-
-    $scope.submitRequest = function(dsData) {
-        deliveryServiceService.createDSRequest(dsData).finally(
-            function() { $anchorScroll(); } // scroll to top
-        );
-    };
-
-    $scope.addAlias = function() {
-        $scope.dsData.serviceAliases.push('');
-    };
-
-    $scope.removeAlias = function(index) {
-        if (index > 0) { // no removing the first one
-            $scope.dsData.serviceAliases.splice(index, 1);
-        }
-    };
-
-    $scope.hasError = formUtils.hasError;
-
-    $scope.hasPropertyError = formUtils.hasPropertyError;
-
-};
-
-DeliveryServiceNewController.$inject = ['$scope', '$location', '$anchorScroll', 'formUtils', 'deliveryServiceService'];
-module.exports = DeliveryServiceNewController;

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/3195e0cc/traffic_portal/app/src/modules/private/deliveryService/new/_deliveryService.new.scss
----------------------------------------------------------------------
diff --git a/traffic_portal/app/src/modules/private/deliveryService/new/_deliveryService.new.scss b/traffic_portal/app/src/modules/private/deliveryService/new/_deliveryService.new.scss
deleted file mode 100644
index e1efd00..0000000
--- a/traffic_portal/app/src/modules/private/deliveryService/new/_deliveryService.new.scss
+++ /dev/null
@@ -1,75 +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.
-
-*/
-
-#dsWizardContainer {
-  margin-bottom: 30px;
-
-  .row {
-    margin-right: 0;
-  }
-
-  .step-info {
-    float: right;
-    margin-top: 3px;
-  }
-
-  .not-allowed {
-    cursor: not-allowed !important;
-  }
-
-  .selected-step {
-    border-right:4px solid #428bca;
-  }
-
-  .alias-inputs {
-    width: 100%;
-
-    .input-group-btn {
-      padding-top: 25px;
-    }
-
-  }
-
-}
-
-#dsNewFormContainer {
-  position: relative;
-  text-align: left;
-  border: 1px solid #A8A8A8;
-  padding: 30px 60px;
-
-  .row {
-    margin-right: 0px;
-  }
-
-  .confirm-table {
-    .heading {
-      color: #16b6e0;
-    }
-  }
-
-}
-
-.ds-wizard-popover-small {
-  max-width: none;
-  width: 300px;
-}
-
-.ds-wizard-popover-big {
-  max-width: none;
-  width: 500px;
-}