You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by at...@apache.org on 2017/11/03 10:40:44 UTC

[3/5] ambari git commit: AMBARI-22352 Ambari 3.0: Implement new design for Admin View. (atkach)

http://git-wip-us.apache.org/repos/asf/ambari/blob/b8f7369b/ambari-admin/src/main/resources/ui/admin-web/app/assets/fonts/Roboto-Regular-webfont.ttf
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/assets/fonts/Roboto-Regular-webfont.ttf b/ambari-admin/src/main/resources/ui/admin-web/app/assets/fonts/Roboto-Regular-webfont.ttf
new file mode 100644
index 0000000..305f0d5
Binary files /dev/null and b/ambari-admin/src/main/resources/ui/admin-web/app/assets/fonts/Roboto-Regular-webfont.ttf differ

http://git-wip-us.apache.org/repos/asf/ambari/blob/b8f7369b/ambari-admin/src/main/resources/ui/admin-web/app/assets/fonts/Roboto-Regular-webfont.woff
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/assets/fonts/Roboto-Regular-webfont.woff b/ambari-admin/src/main/resources/ui/admin-web/app/assets/fonts/Roboto-Regular-webfont.woff
new file mode 100644
index 0000000..ac7452a
Binary files /dev/null and b/ambari-admin/src/main/resources/ui/admin-web/app/assets/fonts/Roboto-Regular-webfont.woff differ

http://git-wip-us.apache.org/repos/asf/ambari/blob/b8f7369b/ambari-admin/src/main/resources/ui/admin-web/app/index.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/index.html b/ambari-admin/src/main/resources/ui/admin-web/app/index.html
index 52e41f6..e9983aa 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/index.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/index.html
@@ -44,53 +44,47 @@
 <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
 <![endif]-->
 
-<div id="top-nav" ng-controller="MainCtrl">
-  <header class="navbar navbar-static-top navbar-inverse">
-    <div class="navbar-inner">
-      <div class="container">
-        <a href="{{fromSiteRoot('/#/main/dashboard')}}" class="logo"><img src="/img/ambari-logo.png" alt="{{'common.apacheAmbari' | translate}}" title="{{'common.apacheAmbari' | translate}}" data-qa="ambari-logo"></a>
-        <a href="{{fromSiteRoot('/#/main/dashboard')}}" class="brand" title="{{'common.apacheAmbari' | translate}}" data-qa="ambari-title">{{'common.ambari' | translate}}</a>
-        <ul class="nav navbar-nav navbar-right">
-          <li>
-            <div class="btn-group navbar-views-dropdown" dropdown is-open="viewsdropdown.isopen" ng-mouseover="viewsdropdown.isopen=true" ng-mouseout="viewsdropdown.isopen=false">
-              <a href="{{fromSiteRoot('/#/main/views')}}" ng-click="gotoViewsDashboard()" class="dropdown-toggle"><i class="fa fa-th"></i></a>
-              <ul class="dropdown-menu" role="menu">
-                <li ng-repeat="instance in viewInstances"><a href="{{fromSiteRoot('/#/main/views/' + instance.viewUrl)}}" target="_blank">{{instance.label}}</a></li>
-                <li ng-show="!viewInstances.length" class="disabled"><a>{{'common.noViews' | translate}}</a></li>
-              </ul>
-            </div>
-          </li>
-          <li>
-            <div class="btn-group" dropdown is-open="status.isopen">
-              <button type="button" class="btn btn-default dropdown-toggle navbar-btn" ng-disabled="disabled">
-                <i class="fa fa-user"></i> {{currentUser}} <span class="caret"></span>
-              </button>
-              <ul class="dropdown-menu" role="menu">
-                <li><a href ng-click="about()">{{'common.about' | translate}}</a></li>
-                <li class="divider"></li>
-                <li><a href ng-click="signOut()">{{'common.signOut' | translate}}</a></li>
-              </ul>
-            </div>
-          </li>
-        </ul>
-      </div>
-    </div>
-  </header>
-</div>
+<div id="wrapper" ng-controller="AppCtrl">
 
+  <div ng-include="'views/sideNav.html'" ng-controller="SideNavCtrl"></div>
 
-<div class="container">
-  <div class="row">
-    <div class="col-sm-3">
-      <div ng-include="'views/leftNavbar.html'" ng-controller="NavbarCtrl"></div>
+  <div id="main">
+    <div id="top-nav">
+     <nav class="navbar navbar-default navbar-static-top">
+       <div class="container">
+         <div class="navbar-header navbar-nav">
+           <ol class="breadcrumb">
+             <li ng-repeat="breadcrumb in breadcrumbs" ng-class="$last && 'active'">{{breadcrumb}}</li>
+           </ol>
+         </div>
+         <ul class="nav navbar-nav navbar-right">
+           <li>
+             <p class="navbar-text">{{cluster.Clusters.cluster_name}}</p>
+           </li>
+           <li class="dropdown">
+             <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" ng-disabled="disabled">
+               <i class="fa fa-user"></i>&nbsp;{{currentUser}}&nbsp;<span class="caret"></span>
+             </a>
+             <ul class="dropdown-menu">
+               <li><a href ng-click="about()">{{'common.about' | translate}}</a></li>
+               <li role="separator" class="divider"></li>
+               <li><a href ng-click="signOut()">{{'common.signOut' | translate}}</a></li>
+             </ul>
+           </li>
+         </ul>
+       </div>
+     </nav>
     </div>
-    <div class="col-sm-9">
-      <ng-view></ng-view>
+    <div class="container main-container">
+      <div class="row">
+        <div class="col-sm-12">
+          <ng-view></ng-view>
+        </div>
+      </div>
     </div>
   </div>
 </div>
 
-
 <!-- build:js scripts/vendor.js -->
 <!-- bower:js -->
 <script src="bower_components/jquery/dist/jquery.js"></script>
@@ -119,6 +113,7 @@
 <script src="bower_components/bootstrap/js/scrollspy.js"></script>
 <script src="bower_components/bootstrap/js/collapse.js"></script>
 <script src="bower_components/bootstrap/js/tab.js"></script>
+<script src="scripts/theme/bootstrap-ambari.js"></script>
 
 <!-- endbuild -->
 
@@ -127,7 +122,8 @@
 <script src="scripts/routes.js"></script>
 <script src="scripts/i18n.config.js"></script>
 <script src="scripts/controllers/mainCtrl.js"></script>
-<script src="scripts/controllers/NavbarCtrl.js"></script>
+<script src="scripts/controllers/AppCtrl.js"></script>
+<script src="scripts/controllers/SideNavCtrl.js"></script>
 <script src="scripts/controllers/authentication/AuthenticationMainCtrl.js"></script>
 <script src="scripts/controllers/loginActivities/LoginActivitiesMainCtrl.js"></script>
 <script src="scripts/controllers/loginActivities/LoginMessageMainCtrl.js"></script>

http://git-wip-us.apache.org/repos/asf/ambari/blob/b8f7369b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/AppCtrl.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/AppCtrl.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/AppCtrl.js
new file mode 100644
index 0000000..4ac5b38
--- /dev/null
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/AppCtrl.js
@@ -0,0 +1,177 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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';
+
+angular.module('ambariAdminConsole')
+.controller('AppCtrl',['$scope','$rootScope', '$route', '$window','Auth', 'Alert', '$modal', 'Cluster', '$translate', '$http', 'Settings', 'Utility', '$q', function($scope, $rootScope, $route, $window, Auth, Alert, $modal, Cluster, $translate, $http, Settings, Utility, $q) {
+  var $t = $translate.instant;
+  $scope.signOut = function () {
+    Auth.signout().finally(function () {
+      $window.location.pathname = Settings.siteRoot;
+    });
+  };
+
+  //todo replace with breadcrumb service
+  $scope.$watch(function () {
+    return $route.current;
+  }, function (value) {
+    var breadcrumbs = [$t('common.admin')];
+    if (value && value.$$route.label) {
+      breadcrumbs.push(value.$$route.label);
+    }
+    $scope.breadcrumbs = breadcrumbs;
+  });
+
+
+  $scope.ambariVersion = null;
+  $rootScope.supports = {};
+  $rootScope.authDataLoad = $q.defer();
+
+  Utility.getUserPref('user-pref-' + Auth.getCurrentUser() + '-supports').then(function (data) {
+    $rootScope.supports = data.data ? data.data : {};
+  });
+
+  $http.get(Settings.baseUrl + '/users/' + Auth.getCurrentUser() + '/authorizations?fields=*')
+    .then(function (data) {
+      var auth = !!data.data && !!data.data.items ? data.data.items.map(function (a) {
+          return a.AuthorizationInfo.authorization_id;
+        }) : [],
+        canPersistData = auth.indexOf('CLUSTER.MANAGE_USER_PERSISTED_DATA') > -1;
+      $rootScope.authDataLoad.resolve(canPersistData);
+      if (auth.indexOf('AMBARI.RENAME_CLUSTER') == -1) {
+        $window.location = $rootScope.fromSiteRoot("/#/main/dashboard");
+      }
+    });
+
+  $scope.about = function () {
+    var ambariVersion = $scope.ambariVersion;
+    var modalInstance = $modal.open({
+      templateUrl: 'views/modals/AboutModal.html',
+      controller: ['$scope', function ($scope) {
+        $scope.ok = function () {
+          modalInstance.close();
+        };
+        $scope.ambariVersion = ambariVersion;
+      }]
+    });
+  };
+
+  $scope.currentUser = Auth.getCurrentUser();
+
+  $scope.cluster = null;
+  $scope.isLoaded = null;
+
+  function loadAmbariVersion() {
+    Cluster.getAmbariVersion().then(function (version) {
+      $scope.ambariVersion = version;
+    });
+  }
+
+  function loadClusterData() {
+    Cluster.getStatus().then(function (cluster) {
+      $rootScope.cluster = cluster;
+      $scope.cluster = cluster;
+      $scope.isLoaded = true;
+      if (cluster && cluster.Clusters.provisioning_state === 'INIT') {
+        setTimeout(loadClusterData, 1000);
+      }
+    }).catch(function (data) {
+      Alert.error($t('common.alerts.cannotLoadClusterStatus'), data.statusText);
+    });
+  }
+
+  loadClusterData();
+  loadAmbariVersion();
+
+  $scope.startInactiveTimeoutMonitoring = function (timeout) {
+    var TIME_OUT = timeout;
+    var active = true;
+    var lastActiveTime = Date.now();
+
+    var keepActive = function () {
+      if (active) {
+        lastActiveTime = Date.now();
+      }
+    };
+
+    $(window).bind('mousemove', keepActive);
+    $(window).bind('keypress', keepActive);
+    $(window).bind('click', keepActive);
+
+    var checkActiveness = function () {
+      var remainTime = TIME_OUT - (Date.now() - lastActiveTime);
+      if (remainTime < 0) {
+        active = false;
+        $(window).unbind('mousemove', keepActive);
+        $(window).unbind('keypress', keepActive);
+        $(window).unbind('click', keepActive);
+        clearInterval($rootScope.userActivityTimeoutInterval);
+        $scope.signOut();
+      } else if (remainTime < 60000 && !$rootScope.timeoutModal) {
+        $rootScope.timeoutModal = $modal.open({
+          templateUrl: 'views/modals/TimeoutWarning.html',
+          backdrop: false,
+          controller: ['$scope', 'Auth', function ($scope, Auth) {
+            $scope.remainTime = 60;
+            $scope.title = $t('main.autoLogOut');
+            $scope.primaryText = $t('main.controls.remainLoggedIn');
+            $scope.secondaryText = $t('main.controls.logOut');
+            $scope.remain = function () {
+              $rootScope.timeoutModal.close();
+              delete $rootScope.timeoutModal;
+            };
+            $scope.logout = function () {
+              $rootScope.timeoutModal.close();
+              delete $rootScope.timeoutModal;
+              Auth.signout().finally(function () {
+                $window.location.pathname = Settings.siteRoot;
+              });
+            };
+            $scope.countDown = function () {
+              $scope.remainTime--;
+              $scope.$apply();
+              if ($scope.remainTime == 0) {
+                Auth.signout().finally(function () {
+                  $window.location.pathname = Settings.siteRoot;
+                });
+              }
+            };
+            setInterval($scope.countDown, 1000);
+          }]
+        });
+      }
+    };
+    $rootScope.userActivityTimeoutInterval = window.setInterval(checkActiveness, 1000);
+  };
+
+  // Send noop requests every 10 seconds just to keep backend session alive
+  $scope.startNoopPolling = function () {
+    $rootScope.noopPollingInterval = setInterval(Cluster.getAmbariTimeout, 10000);
+  };
+
+  if (!$rootScope.userActivityTimeoutInterval) {
+    Cluster.getAmbariTimeout().then(function (timeout) {
+      $rootScope.userTimeout = Number(timeout) * 1000;
+      if ($rootScope.userTimeout > 0)
+        $scope.startInactiveTimeoutMonitoring($rootScope.userTimeout);
+    });
+  }
+  if (!$rootScope.noopPollingInterval) {
+    $scope.startNoopPolling();
+  }
+}]);

http://git-wip-us.apache.org/repos/asf/ambari/blob/b8f7369b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/NavbarCtrl.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/NavbarCtrl.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/NavbarCtrl.js
deleted file mode 100644
index cbf38e8..0000000
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/NavbarCtrl.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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';
-
-angular.module('ambariAdminConsole')
-.controller('NavbarCtrl',['$scope', 'Cluster', '$location', 'Alert', 'ROUTES', 'ConfirmationModal', '$rootScope', 'Stack', '$translate', 'Settings', function($scope, Cluster, $location, Alert, ROUTES, ConfirmationModal, $rootScope, Stack, $translate, Settings) {
-  var $t = $translate.instant;
-  $scope.cluster = null;
-  $scope.totalRepos = 0;
-  $scope.editCluster = {
-    name        : '',
-    editingName : false
-  };
-  $scope.settings = Settings;
-
-  function loadClusterData() {
-    Cluster.getStatus().then(function (cluster) {
-      $scope.cluster = cluster;
-      Stack.allRepos({version: '',
-        cluster: {
-          options: [],
-          current: null
-        }}, {}).then(function (repos) {
-          $scope.totalRepos = repos.itemTotal;
-        });
-      if (cluster && cluster.Clusters.provisioning_state === 'INIT') {
-        setTimeout(loadClusterData, 1000);
-      }
-    }).catch(function (data) {
-      Alert.error($t('common.alerts.cannotLoadClusterStatus'), data.statusText);
-    });
-  }
-  loadClusterData();
-
-  $scope.toggleEditName = function($event) {
-    if ($event && $event.keyCode !== 27) {
-      // 27 = Escape key
-      return false;
-    }
-
-    $scope.editCluster.name         = $scope.cluster.Clusters.cluster_name;
-    $scope.editCluster.editingName  = !$scope.editCluster.editingName;
-  };
-
-  $scope.clusterDisplayName = function () {
-    var name="";
-    if($scope.cluster && $scope.cluster.Clusters)
-    {
-       name = $scope.cluster.Clusters.cluster_name;
-    }
-    return name.length > 13 ? name.substr(0, 13) + "..." : name;
-  };
-
-  $scope.confirmClusterNameChange = function() {
-    ConfirmationModal.show(
-      $t('common.clusterNameChangeConfirmation.title'),
-      $t('common.clusterNameChangeConfirmation.message', {
-        clusterName: $scope.editCluster.name
-      })
-    )
-      .then(function() {
-        $scope.saveClusterName();
-      }).catch(function() {
-        // user clicked cancel
-        $scope.toggleEditName();
-      });
-  };
-
-  $scope.saveClusterName = function() {
-    var oldClusterName = $scope.cluster.Clusters.cluster_name,
-        newClusterName = $scope.editCluster.name;
-
-    Cluster.editName(oldClusterName, newClusterName).then(function(data) {
-      $scope.cluster.Clusters.cluster_name = newClusterName;
-      Alert.success($t('common.alerts.clusterRenamed', {clusterName: newClusterName}));
-    }).catch(function(data) {
-      Alert.error($t('common.alerts.cannotRenameCluster', {clusterName: newClusterName}), data.data.message);
-    });
-
-    $scope.toggleEditName();
-  };
-
-  $scope.isActive = function(path) {
-  	var route = ROUTES;
-  	angular.forEach(path.split('.'), function(routeObj) {
-  		route = route[routeObj];
-  	});
-  	var r = new RegExp( route.url.replace(/(:\w+)/, '\\w+'));
-  	return r.test($location.path());
-  };
-}]);

http://git-wip-us.apache.org/repos/asf/ambari/blob/b8f7369b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/SideNavCtrl.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/SideNavCtrl.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/SideNavCtrl.js
new file mode 100644
index 0000000..558d110
--- /dev/null
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/SideNavCtrl.js
@@ -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.
+ */
+'use strict';
+
+angular.module('ambariAdminConsole')
+.controller('SideNavCtrl', ['$scope', '$location', 'ROUTES', '$rootScope', 'Stack', 'Settings', function($scope, $location, ROUTES, $rootScope, Stack, Settings) {
+  $scope.totalRepos = 0;
+  $scope.settings = Settings;
+
+  $scope.$watch(function() {
+    return $rootScope.cluster;
+  }, function() {
+    $scope.cluster = $rootScope.cluster;
+  }, true);
+
+  function loadRepos() {
+    Stack.allRepos({version: '',
+      cluster: {
+        options: [],
+        current: null
+      }}, {}).then(function (repos) {
+      $scope.totalRepos = repos.itemTotal;
+    });
+  }
+
+  function initNavigationBar () {
+    $('body').on('DOMNodeInserted', '.navigation-bar', function() {
+      $('.navigation-bar').navigationBar({
+        fitHeight: true,
+        collapseNavBarClass: 'fa-angle-double-left',
+        expandNavBarClass: 'fa-angle-double-right'
+      });
+      //initTooltips();
+      $('body').off('DOMNodeInserted', '.navigation-bar');
+    });
+  }
+
+  function initTooltips () {
+    $('[rel="tooltip"]').tooltip();
+  }
+
+  initNavigationBar();
+  loadRepos();
+
+  $scope.isActive = function(path) {
+    var route = ROUTES;
+    angular.forEach(path.split('.'), function(routeObj) {
+      route = route[routeObj];
+    });
+    var r = new RegExp( route.url.replace(/(:\w+)/, '\\w+'));
+    return r.test($location.path());
+  };
+}]);

http://git-wip-us.apache.org/repos/asf/ambari/blob/b8f7369b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/mainCtrl.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/mainCtrl.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/mainCtrl.js
index c945644..30f7568 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/mainCtrl.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/mainCtrl.js
@@ -18,166 +18,10 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('MainCtrl',['$scope','$rootScope','$window','Auth', 'Alert', '$modal', 'Cluster', 'View', '$translate', '$http', 'Settings', 'Utility', '$q', function($scope, $rootScope, $window, Auth, Alert, $modal, Cluster, View, $translate, $http, Settings, Utility, $q) {
-  var $t = $translate.instant;
-  $scope.signOut = function() {
-    Auth.signout().finally(function() {
-      $window.location.pathname = Settings.siteRoot;
-    });
-  };
-
-  $scope.ambariVersion = null;
-  $rootScope.supports = {};
-  $rootScope.authDataLoad = $q.defer();
-
-  Utility.getUserPref('user-pref-' + Auth.getCurrentUser() + '-supports').then(function(data) {
-    $rootScope.supports = data.data ? data.data : {};
-  });
-
-  $http.get(Settings.baseUrl + '/users/' + Auth.getCurrentUser() + '/authorizations?fields=*')
-    .then(function(data) {
-      var auth = !!data.data && !!data.data.items ? data.data.items.map(function (a) {
-          return a.AuthorizationInfo.authorization_id;
-        }) : [],
-        canPersistData = auth.indexOf('CLUSTER.MANAGE_USER_PERSISTED_DATA') > -1;
-      $rootScope.authDataLoad.resolve(canPersistData);
-      if(auth.indexOf('AMBARI.RENAME_CLUSTER') == -1) {
-        $window.location = $rootScope.fromSiteRoot("/#/main/dashboard");
-      }
-    });
-
-  $scope.about = function() {
-   var ambariVersion = $scope.ambariVersion;
-  	var modalInstance = $modal.open({
-  		templateUrl:'views/modals/AboutModal.html',
-  		controller: ['$scope', function($scope) {
-  			$scope.ok = function() {
-  				modalInstance.close();
-  			};
-        $scope.ambariVersion = ambariVersion;
-  		}]
-  	});
-  };
-
-  $scope.currentUser = Auth.getCurrentUser();
-
-  $scope.cluster = null;
-  $scope.isLoaded = null;
-
-  function loadAmbariVersion() {
-    Cluster.getAmbariVersion().then(function(version){
-      $scope.ambariVersion = version;
-    });
-  }
-
-  function loadClusterData(){
-    Cluster.getStatus().then(function(cluster) {
-      $scope.cluster = cluster;
-      $scope.isLoaded = true;
-      if(cluster && cluster.Clusters.provisioning_state === 'INIT'){
-        setTimeout(loadClusterData, 1000);
-      }
-    }).catch(function(data) {
-      Alert.error($t('common.alerts.cannotLoadClusterStatus'), data.statusText);
-    });
-  }
-  loadClusterData();
-  loadAmbariVersion();
-
-  $scope.viewInstances = [];
-
-  $scope.updateInstances = function () {
-    View.getAllVisibleInstance().then(function(instances) {
-      $scope.viewInstances = instances.map(function(i) {
-        i.viewUrl = i.view_name + '/' + i.version + '/' + i.instance_name;
-        return i;
-      });
-    });
-  };
-
-  $scope.gotoViewsDashboard =function() {
-    window.location = Settings.siteRoot + '#/main/views';
-  };
-
-  $scope.$root.$on('instancesUpdate', function (event, data) {
-    $scope.updateInstances();
-  });
-
-  $scope.startInactiveTimeoutMonitoring = function(timeout) {
-    var TIME_OUT = timeout;
-    var active = true;
-    var lastActiveTime = Date.now();
-
-    var keepActive = function() {
-      if (active) {
-        lastActiveTime = Date.now();
-      }
-    };
-
-    $(window).bind('mousemove', keepActive);
-    $(window).bind('keypress', keepActive);
-    $(window).bind('click', keepActive);
-
-    var checkActiveness = function() {
-      var remainTime = TIME_OUT - (Date.now() - lastActiveTime);
-      if (remainTime < 0) {
-        active = false;
-        $(window).unbind('mousemove', keepActive);
-        $(window).unbind('keypress', keepActive);
-        $(window).unbind('click', keepActive);
-        clearInterval($rootScope.userActivityTimeoutInterval);
-        $scope.signOut();
-      } else if (remainTime < 60000 && !$rootScope.timeoutModal) {
-        $rootScope.timeoutModal = $modal.open({
-          templateUrl: 'views/modals/TimeoutWarning.html',
-          backdrop: false,
-          controller: ['$scope', 'Auth', function($scope, Auth) {
-            $scope.remainTime = 60;
-            $scope.title = $t('main.autoLogOut');
-            $scope.primaryText = $t('main.controls.remainLoggedIn');
-            $scope.secondaryText = $t('main.controls.logOut');
-            $scope.remain = function() {
-              $rootScope.timeoutModal.close();
-              delete $rootScope.timeoutModal;
-            };
-            $scope.logout = function() {
-              $rootScope.timeoutModal.close();
-              delete $rootScope.timeoutModal;
-              Auth.signout().finally(function() {
-                $window.location.pathname = Settings.siteRoot;
-              });
-            };
-            $scope.countDown = function() {
-              $scope.remainTime--;
-              $scope.$apply();
-              if ($scope.remainTime == 0) {
-                Auth.signout().finally(function() {
-                  $window.location.pathname = Settings.siteRoot;
-                });
-              }
-            };
-            setInterval($scope.countDown, 1000);
-          }]
-        });
-      }
-    };
-    $rootScope.userActivityTimeoutInterval = window.setInterval(checkActiveness, 1000);
-  };
-
-  // Send noop requests every 10 seconds just to keep backend session alive
-  $scope.startNoopPolling = function() {
-    $rootScope.noopPollingInterval = setInterval(Cluster.getAmbariTimeout, 10000);
-  };
-
-  if (!$rootScope.userActivityTimeoutInterval) {
-    Cluster.getAmbariTimeout().then(function(timeout) {
-      $rootScope.userTimeout = Number(timeout) * 1000;
-      if ($rootScope.userTimeout > 0)
-        $scope.startInactiveTimeoutMonitoring($rootScope.userTimeout);
-    });
-  }
-  if (!$rootScope.noopPollingInterval) {
-    $scope.startNoopPolling();
-  }
-  $scope.updateInstances();
+.controller('MainCtrl',['$scope','$rootScope', function($scope, $rootScope) {
+  $scope.$watch(function() {
+    return $rootScope.cluster;
+  }, function() {
+    $scope.cluster = $rootScope.cluster;
+  }, true);
 }]);

http://git-wip-us.apache.org/repos/asf/ambari/blob/b8f7369b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/i18n.config.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/i18n.config.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/i18n.config.js
index 183a276..cb52df1 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/i18n.config.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/i18n.config.js
@@ -39,6 +39,7 @@ angular.module('ambariAdminConsole')
     'common.versions': 'Versions',
     'common.stack': 'Stack',
     'common.details': 'Details',
+    'common.dashboard': 'Dashboard',
     'common.goToDashboard': 'Go to Dashboard',
     'common.exportBlueprint': 'Export Blueprint',
     'common.blueprint': 'Blueprint',
@@ -70,7 +71,6 @@ angular.module('ambariAdminConsole')
     'common.renameCluster': 'Rename Cluster',
     'common.renameClusterTip': 'Only alpha-numeric characters, up to 80 characters',
     'common.clusterCreationInProgress': 'Cluster creation in progress...',
-    'common.userGroupManagement': 'User + Group Management',
     'common.all': 'All',
     'common.group': 'Group',
     'common.user': 'User',
@@ -96,6 +96,10 @@ angular.module('ambariAdminConsole')
     'common.undo': 'Undo',
     'common.fromGroupMark': '(from group)',
     'common.copy': '_Copy',
+    'common.clusterInformation': 'Cluster Information',
+    'common.clusterManagement': 'Cluster Management',
+    'common.userManagement': 'User Management',
+    'common.admin': 'Admin',
 
     'common.clusterNameChangeConfirmation.title': 'Confirm Cluster Name Change',
     'common.clusterNameChangeConfirmation.message': 'Are you sure you want to change the cluster name to {{clusterName}}?',
@@ -277,7 +281,7 @@ angular.module('ambariAdminConsole')
 
     'clusters.alerts.cannotLoadClusterData': 'Cannot load cluster data',
 
-    'groups.createLocal': 'Create Local Group',
+    'groups.createLocal': 'Add Groups',
     'groups.name': 'Group name',
     'groups.members': 'Members',
     'groups.membersPlural': '{{n}} member{{n == 1 ? "" : "s"}}',
@@ -298,7 +302,7 @@ angular.module('ambariAdminConsole')
     'users.yourPassword': 'Your Password',
     'users.newPassword': 'New User Password',
     'users.newPasswordConfirmation': 'New User Password Confirmation',
-    'users.create': 'Create Local User',
+    'users.create': 'Add Users',
     'users.active': 'Active',
     'users.inactive': 'Inactive',
     'users.status': 'Status',
@@ -369,6 +373,7 @@ angular.module('ambariAdminConsole')
     'versions.installOn': 'Install on...',
 
     'versions.register.title': 'Register Version',
+    'versions.add.title': 'Add Version',
 
     'versions.register.error.header': 'Unable to Register',
     'versions.register.error.body': 'You are attempting to register a version with a Base URL that is already in use with an existing registered version. You *must* review your Base URLs and confirm they are unique for the version you are trying to register.',

http://git-wip-us.apache.org/repos/asf/ambari/blob/b8f7369b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/routes.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/routes.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/routes.js
index a1ca59c..d2d8253 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/routes.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/routes.js
@@ -22,7 +22,8 @@ angular.module('ambariAdminConsole')
   root: {
     url: '/',
     templateUrl: 'views/main.html',
-    controller: 'MainCtrl'
+    controller: 'MainCtrl',
+    label: 'Welcome'
   },
   authentication: {
     main: {
@@ -47,122 +48,144 @@ angular.module('ambariAdminConsole')
     list: {
       url: '/users',
       templateUrl: 'views/users/list.html',
-      controller: 'UsersListCtrl'
+      controller: 'UsersListCtrl',
+      label: 'Users'
     },
     edit: {
       url: '/users/:id/edit',
       templateUrl: 'views/users/create.html',
-      controller: 'UsersCreateCtrl'
+      controller: 'UsersCreateCtrl',
+      label: 'Users'
     },
     create: {
       url: '/users/new',
       templateUrl: 'views/users/create.html',
-      controller: 'UsersCreateCtrl'
+      controller: 'UsersCreateCtrl',
+      label: 'Users'
     },
     show: {
       url: '/users/:id*',
       templateUrl: 'views/users/show.html',
-      controller: 'UsersShowCtrl'
+      controller: 'UsersShowCtrl',
+      label: 'Users'
     }
   },
   groups: {
     list: {
       url: '/groups',
       templateUrl: 'views/groups/list.html',
-      controller: 'GroupsListCtrl'
+      controller: 'GroupsListCtrl',
+      label: 'Groups'
     },
     edit: {
       url: '/groups/:id/edit',
       templateUrl: 'views/groups/edit.html',
-      controller: 'GroupsEditCtrl'
+      controller: 'GroupsEditCtrl',
+      label: 'Groups'
     },
     create: {
       url: '/groups/new',
       templateUrl: 'views/groups/create.html',
-      controller: 'GroupsCreateCtrl'
+      controller: 'GroupsCreateCtrl',
+      label: 'Groups'
     }
   },
   views: {
     list: {
       url: '/views',
       templateUrl: 'views/ambariViews/listTable.html',
-      controller: 'ViewsListCtrl'
+      controller: 'ViewsListCtrl',
+      label: 'Views'
     },
     listViewUrls: {
       url: '/viewUrls',
       templateUrl: 'views/ambariViews/listUrls.html',
-      controller: 'ViewsListCtrl'
+      controller: 'ViewsListCtrl',
+      label: 'Views'
     },
     createViewUrl:{
       url: '/urls/new',
       templateUrl: 'views/urls/create.html',
-      controller: 'ViewUrlCtrl'
+      controller: 'ViewUrlCtrl',
+      label: 'Views'
     },
     linkViewUrl:{
       url: '/urls/link/:viewName/:viewVersion/:viewInstanceName',
       templateUrl: 'views/urls/create.html',
-      controller: 'ViewUrlCtrl'
+      controller: 'ViewUrlCtrl',
+      label: 'Views'
     },
     editViewUrl:{
       url: '/urls/edit/:urlName',
       templateUrl: 'views/urls/edit.html',
-      controller: 'ViewUrlEditCtrl'
+      controller: 'ViewUrlEditCtrl',
+      label: 'Views'
     },
     clone: {
       url: '/views/:viewId/versions/:version/instances/:instanceId/clone',
       templateUrl: 'views/ambariViews/create.html',
-      controller: 'CreateViewInstanceCtrl'
+      controller: 'CreateViewInstanceCtrl',
+      label: 'Views'
     },
     edit: {
       url: '/views/:viewId/versions/:version/instances/:instanceId/edit',
       templateUrl: 'views/ambariViews/edit.html',
-      controller: 'ViewsEditCtrl'
+      controller: 'ViewsEditCtrl',
+      label: 'Views'
     },
     create: {
       url: '/views/:viewId/new',
       templateUrl: 'views/ambariViews/create.html',
-      controller: 'CreateViewInstanceCtrl'
+      controller: 'CreateViewInstanceCtrl',
+      label: 'Views'
     }
   },
   stackVersions: {
     list: {
       url: '/stackVersions',
       templateUrl: 'views/stackVersions/list.html',
-      controller: 'StackVersionsListCtrl'
+      controller: 'StackVersionsListCtrl',
+      label: 'Cluster Information'
     },
     create: {
       url: '/stackVersions/create',
       templateUrl: 'views/stackVersions/stackVersionPage.html',
-      controller: 'StackVersionsCreateCtrl'
+      controller: 'StackVersionsCreateCtrl',
+      label: 'Cluster Information'
     },
     edit: {
       url: '/stackVersions/:stackName/:versionId/edit',
       templateUrl: 'views/stackVersions/stackVersionPage.html',
-      controller: 'StackVersionsEditCtrl'
+      controller: 'StackVersionsEditCtrl',
+      label: 'Cluster Information'
     }
   },
   remoteClusters: {
     list: {
       url: '/remoteClusters',
       templateUrl: 'views/remoteClusters/list.html',
-      controller: 'RemoteClustersListCtrl'
+      controller: 'RemoteClustersListCtrl',
+      label: 'Remote Clusters'
     },
     create: {
       url: '/remoteClusters/create',
       templateUrl: 'views/remoteClusters/remoteClusterPage.html',
-      controller: 'RemoteClustersCreateCtrl'
+      controller: 'RemoteClustersCreateCtrl',
+      label: 'Remote Clusters'
     },
      edit: {
      url: '/remoteClusters/:clusterName/edit',
      templateUrl: 'views/remoteClusters/editRemoteClusterPage.html',
-     controller: 'RemoteClustersEditCtrl'
+     controller: 'RemoteClustersEditCtrl',
+       label: 'Remote Clusters'
      }
   },
   clusters: {
     manageAccess: {
       url: '/clusters/:id/manageAccess',
       templateUrl: 'views/clusters/manageAccess.html',
-      controller: 'ClustersManageAccessCtrl'
+      controller: 'ClustersManageAccessCtrl',
+      label: 'Roles'
     },
     userAccessList: {
       url: '/clusters/:id/userAccessList',

http://git-wip-us.apache.org/repos/asf/ambari/blob/b8f7369b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/theme/bootstrap-ambari.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/theme/bootstrap-ambari.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/theme/bootstrap-ambari.js
new file mode 100644
index 0000000..434d1e9
--- /dev/null
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/theme/bootstrap-ambari.js
@@ -0,0 +1,269 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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';
+
+$(document).ready(function () {
+  var $accordionToggler = $(this).find('[data-toggle="collapseAccordion"]');
+  $accordionToggler.off('click').on('click', function (event) {
+    var $this = $(this);
+    $this.siblings('.panel-body').slideToggle(500);
+    $this.children().children('.panel-toggle').toggleClass('fa-angle-down fa-angle-up');
+    event.stopPropagation();
+    return false;
+  });
+});
+'use strict';
+
+(function ($) {
+
+  /**
+   * jQuery plugin for navigation bars
+   * Usage:
+   * <pre>
+   *   $('.navigation-bar').navigationBar();
+   * </pre>
+   *
+   * @param {object} options see <code>$.fn.navigationBar.defaults</code>
+   * @returns {$}
+   */
+
+  $.fn.navigationBar = function (options) {
+
+    var settings = $.extend({}, $.fn.navigationBar.defaults, options);
+
+    return this.each(function () {
+      var _this = this;
+
+      var containerSelector = '.navigation-bar-container';
+      var $navigationContainer = $(this).find(containerSelector);
+      var $sideNavToggler = $(this).find('[data-toggle=' + settings.navBarToggleDataAttr + ']');
+      var $subMenuToggler = $(this).find('[data-toggle=' + settings.subMenuNavToggleDataAttr + ']');
+      var firstLvlMenuItemsSelector = '.side-nav-menu>li';
+      var secondLvlMenuItemsSelector = '.side-nav-menu>li>ul>li';
+      var $moreActions = $(this).find('.more-actions');
+      var $dropdownMenu = $moreActions.children('.dropdown-menu');
+
+      $subMenuToggler.each(function (index, toggler) {
+        return $(toggler).parent().addClass('has-sub-menu');
+      });
+
+      if (settings.fitHeight) {
+        $(this).addClass('navigation-bar-fit-height');
+
+        // make scrolling effect on side nav ONLY, i.e. not effected on ambari main contents
+        $(this).find('.side-nav-menu').on('DOMMouseScroll mousewheel', function (ev) {
+          var $this = $(this),
+              scrollTop = this.scrollTop,
+              scrollHeight = this.scrollHeight,
+              height = $this.innerHeight(),
+              delta = ev.originalEvent.wheelDelta,
+              up = delta > 0;
+          var prevent = function prevent() {
+            ev.stopPropagation();
+            ev.preventDefault();
+            ev.returnValue = false;
+            return false;
+          };
+
+          if (!up && -delta > scrollHeight - height - scrollTop) {
+            // Scrolling down, but this will take us past the bottom.
+            $this.scrollTop(scrollHeight);
+            return prevent();
+          } else if (up && delta > scrollTop) {
+            // Scrolling up, but this will take us past the top.
+            $this.scrollTop(0);
+            return prevent();
+          }
+        });
+      }
+
+      //set main content left margin based on the width of side-nav
+      var containerWidth = $navigationContainer.width();
+      if (settings.moveLeftContent) {
+        $(settings.content).css('margin-left', containerWidth);
+      }
+      if (settings.moveLeftFooter) {
+        $(settings.footer).css('margin-left', containerWidth);
+      }
+
+      function popStateHandler() {
+        var path = window.location.pathname + window.location.hash;
+        $navigationContainer.find('li a').each(function (index, link) {
+          var $link = $(link);
+          var href = $link.attr('data-href') || $link.attr('href');
+          if (path.indexOf(href) !== -1 && ['', '#'].indexOf(href) === -1) {
+            $link.parent().addClass('active');
+          } else {
+            $link.parent().removeClass('active');
+          }
+        });
+      }
+
+      if (settings.handlePopState) {
+        popStateHandler();
+        $(window).bind('popstate', popStateHandler);
+      }
+
+      function clickHandler(el) {
+        var $li = $(el).parent();
+        var activeClass = settings.activeClass;
+
+        var activeMenuItems = firstLvlMenuItemsSelector + '.' + activeClass;
+        var activeSubMenuItems = secondLvlMenuItemsSelector + '.' + activeClass;
+        $navigationContainer.find(activeMenuItems).removeClass(activeClass);
+        $navigationContainer.find(activeSubMenuItems).removeClass(activeClass);
+        $li.addClass(activeClass);
+      }
+
+      /**
+       * Click on menu item
+       */
+      $(firstLvlMenuItemsSelector + '>a').on('click', function () {
+        clickHandler(this);
+      });
+
+      /**
+       * Click on sub menu item
+       */
+      $(secondLvlMenuItemsSelector + '>a').on('click', function () {
+        clickHandler(this);
+        $(this).parent().parent().parent().addClass(settings.activeClass);
+      });
+
+      /**
+       * Slider for sub menu
+       */
+      $subMenuToggler.off('click').on('click', function (event) {
+        // ignore click if navigation-bar is collapsed
+        if ($navigationContainer.hasClass('collapsed')) {
+          return false;
+        }
+        var $this = $(this);
+        $this.siblings('.sub-menu').slideToggle(600, function () {
+          var $topMenuItem = $this.parent();
+          var $subMenu = $topMenuItem.find('ul');
+          return $subMenu.is(':visible') ? $topMenuItem.removeClass('collapsed') : $topMenuItem.addClass('collapsed');
+        });
+        $this.children('.toggle-icon').toggleClass(settings.menuLeftClass + ' ' + settings.menuDownClass);
+        event.stopPropagation();
+        return false;
+      });
+
+      if (settings.fitHeight) {
+        $moreActions.on('click', function () {
+          // set actions submenu position
+          var $moreIcon = $(this);
+          var $header = $('.side-nav-header');
+          $dropdownMenu.css({
+            top: $moreIcon.offset().top - $header.offset().top + 20 + 'px',
+            left: $moreIcon.offset().left + 'px'
+          });
+        });
+      }
+      $dropdownMenu.on('click', function () {
+        // some action was triggered, should hide this icon
+        var moreIcon = $(this).parent();
+        setTimeout(function () {
+          moreIcon.hide();
+        }, 1000);
+      });
+      $navigationContainer.children('.side-nav-menu').scroll(function () {
+        $moreActions.removeClass('open');
+      });
+
+      /**
+       * Expand/collapse navigation bar
+       */
+      $sideNavToggler.click(function () {
+
+        $navigationContainer.toggleClass('collapsed').promise().done(function () {
+          var subMenuSelector = 'ul.sub-menu';
+          var $subMenus = $navigationContainer.find(subMenuSelector);
+          var $subMenuItems = $navigationContainer.find('.side-nav-menu>li');
+          if ($navigationContainer.hasClass('collapsed')) {
+            // set sub menu invisible when collapsed
+            $subMenus.hide();
+            $moreActions.hide();
+            // set the hover effect when collapsed, should show sub-menu on hovering
+            $subMenuItems.hover(function () {
+              $(this).find(subMenuSelector).show();
+              // set sub-menu position
+              var $parent = $(this);
+              var $header = $('.side-nav-header');
+              if (settings.fitHeight) {
+                $(this).find(subMenuSelector).css({
+                  position: 'fixed',
+                  top: $parent.offset().top - $header.offset().top + 'px',
+                  left: 50 + 'px'
+                });
+              }
+            }, function () {
+              $(this).find(subMenuSelector).hide();
+            });
+          } else {
+            // keep showing all sub menu
+            $subMenus.show().each(function (index, item) {
+              return $(item).parent().removeClass('collapsed');
+            });
+            $subMenuItems.unbind('mouseenter mouseleave');
+            $navigationContainer.find('.toggle-icon').removeClass(settings.menuLeftClass).addClass(settings.menuDownClass);
+            $moreActions.show();
+            // set sub-menu position
+            if (settings.fitHeight) {
+              $(_this).find(subMenuSelector).css({
+                position: 'relative',
+                top: 0,
+                left: 0
+              });
+            }
+          }
+
+          $navigationContainer.on('transitionend', function () {
+            //set main content left margin based on the width of side-nav
+            var containerWidth = $navigationContainer.width();
+            if (settings.moveLeftContent) {
+              $(settings.content).css('margin-left', containerWidth);
+            }
+            if (settings.moveLeftFooter) {
+              $(settings.footer).css('margin-left', containerWidth);
+            }
+          });
+          $sideNavToggler.find('span').toggleClass(settings.collapseNavBarClass + ' ' + settings.expandNavBarClass);
+        });
+        return false;
+      });
+    });
+  };
+
+  $.fn.navigationBar.defaults = {
+    handlePopState: true,
+    fitHeight: false,
+    content: '#main',
+    footer: 'footer',
+    moveLeftContent: true,
+    moveLeftFooter: true,
+    menuLeftClass: 'glyphicon-menu-right',
+    menuDownClass: 'glyphicon-menu-down',
+    collapseNavBarClass: 'fa-angle-double-left',
+    expandNavBarClass: 'fa-angle-double-right',
+    activeClass: 'active',
+    navBarToggleDataAttr: 'collapse-side-nav',
+    subMenuNavToggleDataAttr: 'collapse-sub-menu'
+  };
+})(jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b8f7369b/ambari-admin/src/main/resources/ui/admin-web/app/styles/main.css
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/styles/main.css b/ambari-admin/src/main/resources/ui/admin-web/app/styles/main.css
index 946007d..66f23af 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/styles/main.css
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/styles/main.css
@@ -415,79 +415,6 @@ a.gotoinstance{
   background-color: #da4f49;
   color: white;
 }
-/*
-  Style topnav menu
-*/
-.navbar-views-dropdown > a{
-  color: #c3c3c3;
-  font-size: 1.3em;
-  padding: 10px 25px 18px;
-  display: block;
-  box-shadow: none!important;
-  background: none!important;
-  text-decoration: none;
-}
-.navbar-views-dropdown > a:hover{
-  color: #fff;
-}
-.navbar-views-dropdown > a > i{
-  display: block;
-  margin-top: 1px;
-  margin-bottom: -12px;
-}
-.navbar-views-dropdown .dropdown-menu, .verison-label-row .dropdown-menu {
-  margin-top: -2px;
-}
-
-.navbar-views-dropdown .dropdown-menu a:hover{
-  background: #666;
-  color: #fff;
-}
-.navbar-views-dropdown .dropdown-menu .disabled a:hover{
-  background: none;
-  color: #999;
-}
-#top-nav .navbar.navbar-static-top{
-  min-height: 40px;
-}
-#top-nav .navbar-inverse{
-  background: none;
-  border: none;
-}
-#top-nav .navbar.navbar-static-top .navbar-inner {
-  background-color: #313d54;
-  -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
-  box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
-  max-height: 40px;
-  height: 40px;
-}
-#top-nav .dropdown-toggle.navbar-btn{
-  margin: 4px 0 0 0;
-}
-#top-nav .navbar.navbar-static-top .logo {
-  float: left;
-  padding-top: 2px;
-}
-#top-nav .navbar.navbar-static-top .logo img {
-  height: 32px;
-}
-#top-nav .navbar.navbar-static-top .brand {
-  color: #ffffff;
-  font-size: 16px;
-  font-weight: normal;
-  line-height: 32px;
-  margin-left: 0;
-  padding: 2px 5px 0 10px;
-  text-shadow: 0 1px 0 #555555;
-  display: block;
-  float: left;
-  text-decoration: none;
-
-}
-#top-nav .navbar.navbar-static-top .brand.cluster-name{
-  margin-left: 10px;
-}
 
 .create-view-form, .register-version-form, .edit-version-form {
   padding-bottom: 50px;
@@ -579,24 +506,6 @@ a.gotoinstance{
   border: 0;
 }
 
-.container{
-  padding-left: 0;
-  width: 940px;
-}
-
-
-@media (min-width: 1200px) {
-  .container, .navbar-static-top .container, .navbar-fixed-top .container, .navbar-fixed-bottom .container{
-    width: 1130px;
-  }
-  .container{
-    width: 1170px;
-  }
-  .mainpage .panel-body #main-operations-boxes .col-sm-5 {
-    width: 44%;
-  }
-}
-
 ul.nav li > a{
   cursor: pointer;
 }
@@ -701,318 +610,6 @@ table.no-border tr td{
 /*.login-message-pane .well {height: 74px;}
 .login-message-pane input {margin-left: 3px;}*/
 
-
-.btn {
-  display: inline-block;
-  *display: inline;
-  padding: 4px 14px;
-  margin-bottom: 0;
-  *margin-left: .3em;
-  font-size: 14px;
-  line-height: 20px;
-  *line-height: 20px;
-  color: #333333;
-  text-align: center;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-  vertical-align: middle;
-  cursor: pointer;
-  background-color: #f5f5f5;
-  *background-color: #e6e6e6;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
-  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
-  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
-  background-repeat: repeat-x;
-  border: 1px solid #bbbbbb;
-  *border: 0;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
-  border-bottom-color: #a2a2a2;
-  -webkit-border-radius: 4px;
-     -moz-border-radius: 4px;
-          border-radius: 4px;
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-  *zoom: 1;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn:hover,
-.btn:active,
-.btn.active,
-.btn.disabled,
-.btn[disabled] {
-  color: #333333;
-  background-color: #e6e6e6;
-  *background-color: #d9d9d9;
-}
-
-.btn:active,
-.btn.active {
-  background-color: #cccccc \9;
-}
-
-.btn:first-child {
-  *margin-left: 0;
-}
-
-.btn:hover {
-  color: #333333;
-  text-decoration: none;
-  background-color: #e6e6e6;
-  *background-color: #d9d9d9;
-  /* Buttons in IE7 don't get borders, so darken on hover */
-
-  background-position: 0 -15px;
-  -webkit-transition: background-position 0.1s linear;
-     -moz-transition: background-position 0.1s linear;
-       -o-transition: background-position 0.1s linear;
-          transition: background-position 0.1s linear;
-}
-
-.btn:focus {
-  outline: thin dotted #333;
-  outline: 5px auto -webkit-focus-ring-color;
-  outline-offset: -2px;
-}
-
-.btn.active,
-.btn:active {
-  background-color: #e6e6e6;
-  background-color: #d9d9d9 \9;
-  background-image: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn.disabled,
-.btn[disabled] {
-  cursor: default;
-  background-color: #e6e6e6;
-  background-image: none;
-  opacity: 0.65;
-  filter: alpha(opacity=65);
-  -webkit-box-shadow: none;
-     -moz-box-shadow: none;
-          box-shadow: none;
-}
-
-
-
-.btn-primary.active,
-.btn-warning.active,
-.btn-danger.active,
-.btn-success.active,
-.btn-info.active,
-.btn-inverse.active {
-  color: rgba(255, 255, 255, 0.75);
-}
-
-.btn {
-  border-color: #c5c5c5;
-  border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
-}
-
-.btn-primary {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #006dcc;
-  *background-color: #0044cc;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
-  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
-  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
-  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
-  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
-  background-repeat: repeat-x;
-  border-color: #0044cc #0044cc #002a80;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-primary:hover,
-.btn-primary:active,
-.btn-primary.active,
-.btn-primary.disabled,
-.btn-primary[disabled],
-.btn-primary.disabled:hover,
-.btn-primary[disabled]:hover
- {
-  color: #ffffff;
-  background-color: #0044cc;
-  *background-color: #003bb3;
-}
-
-.btn-primary:active,
-.btn-primary.active {
-  background-color: #003399 \9;
-}
-
-.btn-warning {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #faa732;
-  *background-color: #f89406;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
-  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
-  background-image: -o-linear-gradient(top, #fbb450, #f89406);
-  background-image: linear-gradient(to bottom, #fbb450, #f89406);
-  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
-  background-repeat: repeat-x;
-  border-color: #f89406 #f89406 #ad6704;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-warning:hover,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
-  color: #ffffff;
-  background-color: #f89406;
-  *background-color: #df8505;
-}
-
-.btn-warning:active,
-.btn-warning.active {
-  background-color: #c67605 \9;
-}
-
-.btn-danger {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #da4f49;
-  *background-color: #bd362f;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
-  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
-  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
-  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
-  background-repeat: repeat-x;
-  border-color: #bd362f #bd362f #802420;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-danger:hover,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
-  color: #ffffff;
-  background-color: #bd362f;
-  *background-color: #a9302a;
-}
-
-.btn-danger:active,
-.btn-danger.active {
-  background-color: #942a25 \9;
-}
-
-.btn-success {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #5bb75b;
-  *background-color: #51a351;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
-  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
-  background-image: -o-linear-gradient(top, #62c462, #51a351);
-  background-image: linear-gradient(to bottom, #62c462, #51a351);
-  background-image: -moz-linear-gradient(top, #62c462, #51a351);
-  background-repeat: repeat-x;
-  border-color: #51a351 #51a351 #387038;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-success:hover,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
-  color: #ffffff;
-  background-color: #51a351;
-  *background-color: #499249;
-}
-
-.btn-success:active,
-.btn-success.active {
-  background-color: #408140 \9;
-}
-
-.btn-info {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #49afcd;
-  *background-color: #2f96b4;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
-  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
-  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
-  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
-  background-repeat: repeat-x;
-  border-color: #2f96b4 #2f96b4 #1f6377;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-info:hover,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
-  color: #ffffff;
-  background-color: #2f96b4;
-  *background-color: #2a85a0;
-}
-
-.btn-info:active,
-.btn-info.active {
-  background-color: #24748c \9;
-}
-
-.btn-inverse {
-  color: #ffffff;
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-  background-color: #363636;
-  *background-color: #222222;
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
-  background-image: -webkit-linear-gradient(top, #444444, #222222);
-  background-image: -o-linear-gradient(top, #444444, #222222);
-  background-image: linear-gradient(to bottom, #444444, #222222);
-  background-image: -moz-linear-gradient(top, #444444, #222222);
-  background-repeat: repeat-x;
-  border-color: #222222 #222222 #000000;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
-  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-inverse:hover,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
-  color: #ffffff;
-  background-color: #222222;
-  *background-color: #151515;
-}
-
-.btn-inverse:active,
-.btn-inverse.active {
-  background-color: #080808 \9;
-}
-
 button.btn,
 input[type="submit"].btn {
   *padding-top: 3px;
@@ -1050,6 +647,10 @@ button.btn.btn-xs{
   border-radius: 3px;
 }
 
+a.btn-primary {
+  color: #fff;
+}
+
 .clusterDisplayName {
   display:inline-block;
   width:90%;
@@ -1872,4 +1473,28 @@ legend {
 .ellipsis-overflow {
   overflow: hidden;
   text-overflow: ellipsis;
-}
\ No newline at end of file
+}
+
+.pull-right {
+  float: right;
+}
+
+body {
+  height: 100%;
+  background-color: #f0f0f0;
+}
+
+#main {
+  transition: .5s ease;
+  overflow: visible;
+  min-width: 980px;
+}
+
+#side-nav .ambari-header-link:hover {
+  text-decoration: none;
+}
+
+.main-container {
+  background-color: #fff;
+  padding: 15px;
+}