You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by yu...@apache.org on 2014/08/08 01:42:56 UTC

git commit: AMBARI-6785. Admin View: various bug fixes and UI improvements. (yusaku)

Repository: ambari
Updated Branches:
  refs/heads/trunk d8ebf2d67 -> e8b355412


AMBARI-6785. Admin View: various bug fixes and UI improvements. (yusaku)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/e8b35541
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/e8b35541
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/e8b35541

Branch: refs/heads/trunk
Commit: e8b3554124adcee975309f9b39487ec1803f11c7
Parents: d8ebf2d
Author: Yusaku Sako <yu...@hortonworks.com>
Authored: Thu Aug 7 15:57:51 2014 -0700
Committer: Yusaku Sako <yu...@hortonworks.com>
Committed: Thu Aug 7 16:22:21 2014 -0700

----------------------------------------------------------------------
 .../main/resources/ui/admin-web/app/index.html  | 13 ++---
 .../app/scripts/controllers/LDAPModalCtrl.js    | 57 --------------------
 .../app/scripts/controllers/NavbarCtrl.js       | 20 ++++++-
 .../ambariViews/CreateViewInstanceCtrl.js       | 50 ++++++++++-------
 .../controllers/groups/GroupsListCtrl.js        | 12 -----
 .../app/scripts/controllers/mainCtrl.js         | 20 ++++++-
 .../scripts/controllers/users/UsersListCtrl.js  | 12 -----
 .../scripts/controllers/users/UsersShowCtrl.js  | 19 +++++--
 .../ui/admin-web/app/scripts/services/Auth.js   | 30 +++++++++++
 .../ui/admin-web/app/scripts/services/User.js   | 20 ++++---
 .../ui/admin-web/app/scripts/services/View.js   | 21 +++++++-
 .../ui/admin-web/app/scripts/services/ldap.js   | 30 ++++++-----
 .../resources/ui/admin-web/app/styles/main.css  | 34 ++++++++++++
 .../admin-web/app/views/ambariViews/create.html |  2 +-
 .../admin-web/app/views/ambariViews/edit.html   |  2 +-
 .../admin-web/app/views/ambariViews/list.html   |  7 ++-
 .../ui/admin-web/app/views/groups/edit.html     |  2 +-
 .../ui/admin-web/app/views/groups/list.html     |  1 -
 .../ui/admin-web/app/views/ldapModal.html       | 47 ----------------
 .../ui/admin-web/app/views/leftNavbar.html      | 12 ++++-
 .../admin-web/app/views/modals/AboutModal.html  | 42 +++++++++++++++
 .../ui/admin-web/app/views/users/list.html      |  1 -
 .../ui/admin-web/app/views/users/show.html      |  2 +-
 .../src/main/resources/ui/admin-web/gulpfile.js |  1 +
 .../main/resources/ui/admin-web/package.json    |  3 +-
 25 files changed, 267 insertions(+), 193 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/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 f201d06..9aef85b 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
@@ -40,16 +40,13 @@
       <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">
+    <div id="top-nav" ng-controller="MainCtrl">
       <header class="navbar navbar-static-top navbar-inverse">
         <div class="navbar-inner">
           <div class="container">
             <a href="#/" class="logo"><img src="/img/logo-white.png" alt="Apache Ambari" title="Apache Ambari"></a>
             <a href="#/" class="brand" title="Apache Ambari">Ambari</a>
-            <a href="" class="brand cluster-name">Ambari Admin Console</a>
-            <!-- <div class="navbar-header">
-              <a href="#/" class="navbar-brand">Ambari Admin Console</a>
-            </div>   -->
+            <a href="" class="brand cluster-name">Admin Console</a>
             <ul class="nav navbar-nav navbar-right">
               <li>
                 <div class="btn-group" dropdown is-open="status.isopen">
@@ -57,9 +54,9 @@
                     Admin <span class="caret"></span>
                   </button>
                   <ul class="dropdown-menu" role="menu">
-                    <li><a href="#">About</a></li>
+                    <li><a href ng-click="about()">About</a></li>
                     <li class="divider"></li>
-                    <li><a href="#">Sign Out</a></li>
+                    <li><a href ng-click="signOut()">Sign Out</a></li>
                   </ul>
                 </div>
               </li>
@@ -114,7 +111,6 @@
     <script src="scripts/routes.js"></script>
     <script src="scripts/controllers/mainCtrl.js"></script>
     <script src="scripts/controllers/NavbarCtrl.js"></script>
-    <script src="scripts/controllers/LDAPModalCtrl.js"></script>
     <script src="scripts/controllers/users/UsersCreateCtrl.js"></script>
     <script src="scripts/controllers/users/UsersListCtrl.js"></script>
     <script src="scripts/controllers/users/UsersShowCtrl.js"></script>
@@ -136,6 +132,7 @@
     <script src="scripts/services/PermissionLoader.js"></script>
     <script src="scripts/services/PermissionsSaver.js"></script>
     <script src="scripts/services/ConfirmationModal.js"></script>
+    <script src="scripts/services/Auth.js"></script>
     <!-- endbuild -->
 </body>
 </html>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/LDAPModalCtrl.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/LDAPModalCtrl.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/LDAPModalCtrl.js
deleted file mode 100644
index 3698e16..0000000
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/LDAPModalCtrl.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.
- */
-'use strict';
-
-angular.module('ambariAdminConsole')
-.controller('LDAPModalCtrl',['$scope', 'LDAP', 'resourceType', '$modalInstance', 'uiAlert', function($scope, LDAP, resourceType, $modalInstance, uiAlert) {
-  $scope.resourceType = resourceType;
-  $scope.isConfigured = false;
-  $scope.isDataLoaded = false;
-
-  $scope.items = [
-  ];
-
-
-  LDAP.get(resourceType).then(function(data) {
-    $scope.isConfigured = data['LDAP']['configured'];
-    $scope.items = data['LDAP'][resourceType];
-    $scope.isDataLoaded = true;
-  }).catch(function(data) {
-    uiAlert.danger(data.data.status, data.data.message);
-    $modalInstance.dismiss();
-  });
-
-  $scope.sync = function() {
-    if($scope.items){
-      var itemsToSync = $scope.items.filter(function(item) {return item.selected}).map(function(item) {
-        return item.name
-      });
-
-      LDAP.sync(resourceType, itemsToSync).then(function() {
-        $modalInstance.close();
-      }).catch(function(data) {
-        uiAlert.danger(data.data.status, data.data.message);
-        $modalInstance.close();
-      });
-    }
-  };
-
-  $scope.cancel = function() {
-    $modalInstance.dismiss();
-  };
-}]);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/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
index 0e0c5c8..1255f3b 100644
--- 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
@@ -18,7 +18,7 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('NavbarCtrl',['$scope', 'Cluster', '$location', 'uiAlert', 'ROUTES', function($scope, Cluster, $location, uiAlert, ROUTES) {
+.controller('NavbarCtrl',['$scope', 'Cluster', '$location', 'uiAlert', 'ROUTES', 'LDAP', 'ConfirmationModal', function($scope, Cluster, $location, uiAlert, ROUTES, LDAP, ConfirmationModal) {
   $scope.cluster = null;
   Cluster.getStatus().then(function(cluster) {
     $scope.cluster = cluster;
@@ -26,7 +26,6 @@ angular.module('ambariAdminConsole')
   	uiAlert.danger(data.status, data.message);
   });
 
-  // console.log($state);
   $scope.isActive = function(path) {
   	var route = ROUTES;
   	angular.forEach(path.split('.'), function(routeObj) {
@@ -35,4 +34,21 @@ angular.module('ambariAdminConsole')
   	var r = new RegExp( route.url.replace(/(:\w+)/, '\\w+'));
   	return r.test($location.path());
   };
+
+  $scope.isLDAPConfigured = false;
+  $scope.ldapData = {};
+  LDAP.get().then(function(data) {
+    $scope.ldapData = data;
+    $scope.isLDAPConfigured = data['LDAP']['configured'];
+  });
+
+  $scope.syncLDAP = function() {
+    ConfirmationModal.show('Sync LDAP', 'Are you sure you want to sync LDAP?').then(function() {
+      LDAP.sync($scope.ldapData.groups, $scope.ldapData.users).then(function() {
+        uiAlert.success('LDAP synced successful');
+      }).catch(function(data) {
+        uiAlert.danger(data.data.status, data.data.message);
+      });
+    });
+  };
 }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/CreateViewInstanceCtrl.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/CreateViewInstanceCtrl.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/CreateViewInstanceCtrl.js
index 44e2807..cb8dda0 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/CreateViewInstanceCtrl.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/CreateViewInstanceCtrl.js
@@ -21,26 +21,45 @@ angular.module('ambariAdminConsole')
 .controller('CreateViewInstanceCtrl',['$scope', 'View', 'uiAlert', '$routeParams', '$location', function($scope, View, uiAlert, $routeParams, $location) {
   $scope.form = {};
 
-  View.getMeta($routeParams.viewId, $routeParams.version).then(function(data) {
-    var viewVersion = data.data;
-    $scope.view = viewVersion;
+  function loadMeta(){
+    View.getMeta($routeParams.viewId, $scope.version).then(function(data) {
+      var viewVersion = data.data;
+      $scope.view = viewVersion;
 
-    $scope.instance = {
-      view_name: viewVersion.ViewVersionInfo.view_name,
-      version: viewVersion.ViewVersionInfo.version,
-      instance_name: '',
-      label: '',
-      visible: true,
-      icon_path: '',
-      icon64_path: '',
-      properties: viewVersion.ViewVersionInfo.parameters
-    };    
+      $scope.instance = {
+        view_name: viewVersion.ViewVersionInfo.view_name,
+        version: viewVersion.ViewVersionInfo.version,
+        instance_name: '',
+        label: '',
+        visible: true,
+        icon_path: '',
+        icon64_path: '',
+        properties: viewVersion.ViewVersionInfo.parameters
+      };    
+    });
+  }
+    
+
+  $scope.$watch(function(scope) {
+    return scope.version;
+  }, function(version) {
+    if( version ){
+      loadMeta();
+    }
   });
 
   // $scope.view = viewVersion;
   $scope.isAdvancedClosed = true;
   $scope.instanceExists = false;
 
+  $scope.versions = [];
+  $scope.version = null;
+
+  View.getVersions($routeParams.viewId).then(function(versions) {
+    $scope.versions = versions;
+    $scope.version = $scope.versions[$scope.versions.length-1];
+  });
+
 
   $scope.nameValidationPattern = /^\s*\w*\s*$/;
 
@@ -66,9 +85,4 @@ angular.module('ambariAdminConsole')
       });
     }
   };
-
-  $scope.cancel = function() {
-    $modalInstance.dismiss();
-  };
-
 }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsListCtrl.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsListCtrl.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsListCtrl.js
index eb6c869..dea8b3c 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsListCtrl.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsListCtrl.js
@@ -40,16 +40,4 @@ angular.module('ambariAdminConsole')
   .catch(function(data) {
     console.error('Get groups list error');
   });
-
-  $scope.syncLDAP = function() {
-    var modaInstance = $modal.open({
-      templateUrl: 'views/ldapModal.html',
-      controller: 'LDAPModalCtrl',
-      resolve:{
-        resourceType: function() {
-          return 'groups';
-        }
-      }
-    });
-  };
 }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/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 0755c09..d253eb1 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,5 +18,23 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('MainCtrl',[function() {
+.controller('MainCtrl',['$scope', 'Auth', 'uiAlert', '$modal', function($scope, Auth, uiAlert, $modal) {
+  $scope.signOut = function() {
+    Auth.signout().then(function() {
+     window.location.pathname = ''; // Change location hard, because Angular works only with relative urls
+    }).catch(function(data) {
+      uiAlert.danger(data.data.status, data.data.message);
+    });
+  };
+
+  $scope.about = function() {
+  	var modalInstance = $modal.open({
+  		templateUrl:'views/modals/AboutModal.html',
+  		controller: ['$scope', function($scope) {
+  			$scope.ok = function() {
+  				modalInstance.close();
+  			};
+  		}]
+  	});
+  };
 }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersListCtrl.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersListCtrl.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersListCtrl.js
index c34f26b..0c93ff6 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersListCtrl.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersListCtrl.js
@@ -49,16 +49,4 @@ angular.module('ambariAdminConsole')
       return user;
     }
   };
-
-  $scope.syncLDAP = function() {
-    var modaInstance = $modal.open({
-      templateUrl: 'views/ldapModal.html',
-      controller: 'LDAPModalCtrl',
-      resolve:{
-        resourceType: function() {
-          return 'users';
-        }
-      }
-    });
-  };
 }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersShowCtrl.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersShowCtrl.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersShowCtrl.js
index 75f7095..2911b68 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersShowCtrl.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/users/UsersShowCtrl.js
@@ -18,7 +18,7 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.controller('UsersShowCtrl', ['$scope', '$routeParams', 'User', '$modal', '$location', 'ConfirmationModal', function($scope, $routeParams, User, $modal, $location, ConfirmationModal) {
+.controller('UsersShowCtrl', ['$scope', '$routeParams', 'User', '$modal', '$location', 'ConfirmationModal', 'uiAlert', function($scope, $routeParams, User, $modal, $location, ConfirmationModal, uiAlert) {
   $scope.user = {};
 
   $scope.isGroupEditing = false;
@@ -37,7 +37,8 @@ angular.module('ambariAdminConsole')
       templateUrl: 'views/users/modals/changePassword.html',
       controller: ['$scope', function($scope) {
         $scope.passwordData = {
-          password: ''
+          password: '',
+          currentUserPassword: ''
         };
 
         $scope.form = {};
@@ -45,7 +46,11 @@ angular.module('ambariAdminConsole')
         $scope.ok = function() {
           $scope.form.passwordChangeForm.submitted = true;
           if($scope.form.passwordChangeForm.$valid){
-            modalInstance.close($scope.passwordData.password, $scope.passwordData.currentUserPassword);
+
+            modalInstance.close({
+              password: $scope.passwordData.password, 
+              currentUserPassword: $scope.passwordData.currentUserPassword
+            });
           }
         };
         $scope.cancel = function() {
@@ -54,8 +59,12 @@ angular.module('ambariAdminConsole')
       }]
     });
 
-    modalInstance.result.then(function(newPassword, currentUserPassword) {
-      User.setPassword($scope.user, newPassword, currentUserPassword);
+    modalInstance.result.then(function(data) {
+      User.setPassword($scope.user, data.password, data.currentUserPassword).then(function() {
+        uiAlert.success('Password changed.');
+      }).catch(function(data) {
+        uiAlert.danger(data.data.status, data.data.message);
+      });
     }); 
   };
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Auth.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Auth.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Auth.js
new file mode 100644
index 0000000..bffd5c7
--- /dev/null
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Auth.js
@@ -0,0 +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
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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')
+.factory('Auth',['$http', 'Settings', function($http, Settings) {
+  return {
+    signout: function() {
+      return $http({
+        method: 'GET',
+        url: Settings.baseUrl + '/logout'
+      });
+    }
+  };
+}]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/User.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/User.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/User.js
index 4f3e51c..47afce5 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/User.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/User.js
@@ -18,7 +18,7 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.factory('User', ['Restangular', function(Restangular) {
+.factory('User', ['Restangular', '$http', 'Settings', function(Restangular, $http, Settings) {
   Restangular.addResponseInterceptor(function(data, operation, what, url, response, deferred) {
     var extractedData;
     if(operation === 'getList'){
@@ -48,12 +48,20 @@ angular.module('ambariAdminConsole')
       return Restangular.one('users', userId).customPUT({'Users/active':isActive});
     },
     setPassword: function(user, password, currentUserPassword) {
-
-      return Restangular.one('users', user.user_name).customPUT({
-        'Users/password': password,
-        'Users/old_password': currentUserPassword,
-        'Users/roles': user.roles[0] || 'user'
+      return $http({
+        method: 'PUT',
+        url: Settings.baseUrl + '/users/' + user.user_name,
+        data: {
+          'Users/password': password,
+          'Users/old_password': currentUserPassword,
+          'Users/roles': user.roles[0] || 'user' 
+        }
       });
+      // return Restangular.one('users', user.user_name).customPUT({
+      //   'Users/password': password,
+      //   'Users/old_password': currentUserPassword,
+      //   'Users/roles': user.roles[0] || 'user'
+      // });
     },
     delete: function(userId) {
       return Restangular.one('users', userId).remove();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/View.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/View.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/View.js
index 2b7656a..f0f6011 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/View.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/View.js
@@ -126,7 +126,26 @@ angular.module('ambariAdminConsole')
     });
 
     return deferred.promise;
-  }
+  };
+
+  View.getVersions = function(viewName) {
+    var deferred = $q.defer();
+
+    $http({
+      method: 'GET',
+      url: Settings.baseUrl + '/views/'+viewName
+    }).success(function(data) {
+      var versions = [];
+      angular.forEach(data.versions, function(version) {
+        versions.push(version.ViewVersionInfo.version);
+      });
+
+      deferred.resolve(versions);
+    }).catch(function(data) {
+      deferred.reject(data);
+    });
+    return deferred.promise;
+  };
 
   View.createInstance = function(instanceInfo) {
     var deferred = $q.defer();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/ldap.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/ldap.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/ldap.js
index bedf33a..26d5c2e 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/ldap.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/ldap.js
@@ -18,27 +18,29 @@
 'use strict';
 
 angular.module('ambariAdminConsole')
-.factory('LDAP', ['$http', '$q', function($http, $q) {
+.factory('LDAP', ['$http', '$q', 'Settings', function($http, $q, Settings) {
 
 
   return {
-    get: function(resourceType) {
-      var deferred = $q.defer();
-
-      $http({
+    get: function() {
+      return $http({
         method: 'GET',
         url: '/api/v1/controllers/ldap'
-      })
-      .success(function(data) {
-        deferred.resolve(data);
-      })
-      .catch(function(data) {
-        deferred.reject(data);
       });
-
-      return deferred.promise;
     },
-    sync: function(resourceType, items) {
+    sync: function(groupsList, usersList) {
+      return $http({
+        method: 'POST',
+        url: Settings.baseUrl + '/controllers/ldap',
+        data:{
+          LDAP:{
+            "synced_groups": groupsList.join(','),
+            "synced_users": usersList.join(',')
+          }
+        }
+      });
+    },
+    syncResource: function(resourceType, items) {
       var items = items.map(function(item) {
         var name = 'LDAP/synced_' + resourceType;
         var obj = {};

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/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 8771ca3..4104ccb 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
@@ -17,6 +17,40 @@
  */
 
 
+.views-list-pane .glyphicon.glyphicon-chevron-right{
+  -webkit-transition: all 0.3s;
+  -o-transition: all 0.3s;
+  transition: all 0.3s;
+}
+.views-list-pane .glyphicon.glyphicon-chevron-right.opened{
+  -webkit-transform: rotateZ(90deg);
+  -ms-transform: rotateZ(90deg);
+  -o-transform: rotateZ(90deg);
+  transform: rotateZ(90deg);
+}
+
+.pulldown2{
+  -webkit-transform: translateY(2px);
+  -ms-transform: translateY(2px);
+  -o-transform: translateY(2px);
+  transform: translateY(2px);
+}
+.btn.disabled.syncldapbtn{
+  pointer-events: auto;
+  background-color: #0044cc;
+}
+
+.about .logo{
+  float: left;
+  width: 20%;
+}
+.about .content{
+  float: left;
+}
+.about .content .project{
+  font-weight: bold;
+  font-size: 2em;
+}
 /*
   Style topnav menu
 */

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/create.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/create.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/create.html
index 216018f..1b11d65 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/create.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/create.html
@@ -27,7 +27,7 @@
     <img src="http://placehold.it/32x32" alt="" class="icon-small">
     <div class="description">
       <h3>{{view.ViewVersionInfo.view_name}}</h3>
-      <span>{{view.ViewVersionInfo.label}} | Version: {{view.ViewVersionInfo.version}}</span>
+      <span>{{view.ViewVersionInfo.label}} | Version: <select ng-model="version" ng-change="versionChanged()" ng-options="o as o for o in versions"></select></span>
     </div>
   </div>
   

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/edit.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/edit.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/edit.html
index 0e3b9a1..9bfcffd 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/edit.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/edit.html
@@ -17,7 +17,7 @@
 -->
 <ol class="breadcrumb">
   <li><a href="#/views">Views</a></li>
-  <li class="active">Edit instance</li>
+  <li class="active">Edit {{instance.ViewInstanceInfo.label}}</li>
 </ol>
 <h2>Edit {{instance.ViewInstanceInfo.view_name}}: {{instance.ViewInstanceInfo.label}}</h2>
 <hr>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/list.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/list.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/list.html
index 23290d4..aad6665 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/list.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/list.html
@@ -38,10 +38,13 @@
     <div class="col-sm-3"><h4>Descirption</h4></div>
   </div>
   <accordion>
-    <accordion-group ng-repeat="view in filteredViews">
+    <accordion-group ng-repeat="view in filteredViews" is-open="open">
       <accordion-heading>
         <div class="row">
-          <div class="col-sm-3">{{view.view_name}}</div>
+          <div class="col-sm-3">
+            <i class="glyphicon glyphicon-chevron-right" ng-class="{'opened': open}"></i>
+            {{view.view_name}}
+          </div>
           <div class="col-sm-3">{{view.versions}}</div>
           <div class="col-sm-3">{{view.instances.length ? view.instances.length : 'No'}} instances</div>
           <div class="col-sm-3">This is a description</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/edit.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/edit.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/edit.html
index 1a242e9..8e8476b 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/edit.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/edit.html
@@ -17,7 +17,7 @@
 -->
 <ol class="breadcrumb">
   <li><a href="#/groups">Groups</a></li>
-  <li class="active">Edit group</li>
+  <li class="active">Edit {{group.group_name}}</li>
 </ol>
 <div class="clearfix">
   <h3 class="pull-left">Edit {{group.group_name}}</h3>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/list.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/list.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/list.html
index baa7038..12f990a 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/list.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/list.html
@@ -23,7 +23,6 @@
     <h3 class="pull-left">Groups management</h3>
     <div class="pull-right top-buffer">
       <link-to route="groups.create" class="btn btn-primary"><span class="glyphicon glyphicon-plus"></span> Create Local Group</link-to>
-      <button class="btn btn-default" ng-click="syncLDAP()">Sync LDAP</button>
     </div>
   </div>
   <hr>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/views/ldapModal.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/ldapModal.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/ldapModal.html
deleted file mode 100644
index e9c790a..0000000
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/ldapModal.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">
-  <h3 class="modal-title">LDAP {{resourceType}}</h3>
-</div>
-<div class="modal-body">
-  <div class="alert alert-danger" ng-show="isDataLoaded && !isConfigured">
-    LDAP is not configured.
-  </div>
-  <table class="table table-hover table-striped ldap-table" ng-show="isDataLoaded">
-    <tbody>
-      <tr ng-repeat="item in items">
-        <td class="col-sm-10">{{item.name}}</td>
-        <td class="col-sm-2">
-          <div class="checkbox">
-            <label>
-              <input type="checkbox" ng-model="item.selected">
-            </label>
-          </div>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info" ng-show="isConfigured && isDataLoaded && !items">
-    No {{resourceType}} to sync.
-  </div>
-  <progressbar ng-hide="isDataLoaded" class="progress-striped active" max="200" value="200" type="default"></progressbar>
-</div>
-<div class="modal-footer">
-  <button class="btn btn-primary" ng-click="sync()">Sync</button>
-  <button class="btn btn-warning" ng-click="cancel()">Cancel</button>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/views/leftNavbar.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/leftNavbar.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/leftNavbar.html
index f59931b..9f5b116 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/leftNavbar.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/leftNavbar.html
@@ -22,7 +22,7 @@
       <h5>{{cluster.Clusters.cluster_name}}</h5>
       <ul class="nav nav-pills nav-stacked">
         <li ng-class="{active: isActive('clusters.manageAccess')}">
-          <link-to route="clusters.manageAccess" id="{{cluster.Clusters.cluster_name}}">Permissions</link-to>
+          <a href="#/clusters/{{cluster.Clusters.cluster_name}}/manageAccess">Permissions</a>
         </li>
         <li><a href="/#/main/dashboard">Go to Dashboard</a></li>
       </ul>
@@ -54,5 +54,15 @@
       <li ng-class="{active: isActive('users.list')}"><link-to route="users.list">Users</link-to></li>
       <li ng-class="{active: isActive('groups.list')}"><link-to route="groups.list">Groups</link-to></li>
     </ul>
+    <hr>
+    <div ng-switch="isLDAPConfigured">
+      <a ng-switch-when="true" href class="btn btn-primary btn-block syncldapbtn" ng-click="syncLDAP()">
+        <span class="glyphicon glyphicon-transfer pulldown2"></span> Sync LDAP
+      </a>
+      <a ng-switch-default href class="btn btn-primary btn-block syncldapbtn disabled" popover="LDAP is not configured. To configure LDAP, run ambari-server setup-ldap from the command line." popover-trigger="mouseenter">
+        <span class="glyphicon glyphicon-transfer pulldown2"></span> Sync LDAP
+      </a>
+    </div>
+      
   </div>
 </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/views/modals/AboutModal.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/modals/AboutModal.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/modals/AboutModal.html
new file mode 100644
index 0000000..4f02eba
--- /dev/null
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/modals/AboutModal.html
@@ -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.
+-->
+<div class="modal-header">
+  <button type="button" class="close" data-dismiss="modal" ng-click="ok()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+  <h3 class="modal-title">About</h3>
+</div>
+<div class="modal-body">
+  <div class="about clearfix">
+    <div class="logo">
+      <img src="/img/logo.png" alt="Apache Ambari" title="Apache Ambari">
+    </div>
+    <div class="content">
+      <div class="project">Apache Ambari</div>
+      <br>
+      <span id="i18n-33">Version</span>
+      <script id="metamorph-199-start" type="text/x-placeholder"></script>1.7.0<script id="metamorph-199-end" type="text/x-placeholder"></script>
+      <br>
+      <br>
+      <a href="http://ambari.apache.org/" target="_blank"><span id="i18n-34">Get involved!</span></a>
+      <br>
+      <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank"><span id="i18n-35">Licensed under the Apache License, Version 2.0</span></a>
+  </div>
+  </div>
+</div>
+<div class="modal-footer">
+    <button class="btn btn-success" ng-click="ok()">OK</button>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/views/users/list.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/users/list.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/users/list.html
index c281c70..45c3a4f 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/users/list.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/users/list.html
@@ -23,7 +23,6 @@
     <h3 class="pull-left">Users management</h3>
     <div class="pull-right top-buffer">
       <link-to route="users.create" class="btn btn-primary"><span class="glyphicon glyphicon-plus"></span> Create Local User</link-to>
-      <button class="btn btn-default" ng-click="syncLDAP()">Sync LDAP</button>
     </div>
   </div>
   <hr>

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/app/views/users/show.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/users/show.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/users/show.html
index dadb32f..e171d0c 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/users/show.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/users/show.html
@@ -17,7 +17,7 @@
 -->
 <ol class="breadcrumb">
   <li><a href="#/users">Users</a></li>
-  <li class="active">Edit user</li>
+  <li class="active">Edit {{user.user_name}}</li>
 </ol>
 <div ng-show="user.user_name">
   <div class="clearfix">

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/gulpfile.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/gulpfile.js b/ambari-admin/src/main/resources/ui/admin-web/gulpfile.js
index 8e5e9e8..3655d6b 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/gulpfile.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/gulpfile.js
@@ -42,6 +42,7 @@ gulp.task('html', ['styles'], function () {
     var cssFilter = $.filter('**/*.css');
 
     return gulp.src('app/*.html')
+        .pipe($.plumber())
         .pipe($.useref.assets({searchPath: '{.tmp,app}'}))
         .pipe(jsFilter)
         .pipe($.uglify())

http://git-wip-us.apache.org/repos/asf/ambari/blob/e8b35541/ambari-admin/src/main/resources/ui/admin-web/package.json
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/package.json b/ambari-admin/src/main/resources/ui/admin-web/package.json
index 331c7a4..a091584 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/package.json
+++ b/ambari-admin/src/main/resources/ui/admin-web/package.json
@@ -24,7 +24,8 @@
     "gulp-useref": "^0.4.2",
     "jshint-stylish": "^0.2.0",
     "opn": "^0.1.1",
-    "wiredep": "^1.4.3"
+    "wiredep": "^1.4.3",
+    "gulp-plumber": "*"
   },
   "engines": {
     "node": ">=0.10.0"