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

[07/12] git commit: AMBARI-6866. Admin View: various UI improvements. (yusaku)

AMBARI-6866. Admin View: various 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/d79289bb
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/d79289bb
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/d79289bb

Branch: refs/heads/branch-alerts-dev
Commit: d79289bb3da0f895640bf736f0f04238e43775d6
Parents: 86ca284
Author: Yusaku Sako <yu...@hortonworks.com>
Authored: Thu Aug 14 12:25:55 2014 -0700
Committer: Jonathan Hurley <jh...@hortonworks.com>
Committed: Fri Aug 15 09:15:57 2014 -0400

----------------------------------------------------------------------
 .../main/resources/ui/admin-web/app/index.html  |  3 +-
 .../controllers/groups/GroupsEditCtrl.js        | 36 ++++++-----
 .../controllers/groups/GroupsListCtrl.js        | 36 ++++++-----
 .../app/scripts/controllers/mainCtrl.js         |  2 +
 .../scripts/controllers/users/UsersListCtrl.js  | 65 ++++++++++----------
 .../app/scripts/directives/disabledTooltip.js   | 41 ++++++++++++
 .../ui/admin-web/app/scripts/services/Group.js  | 18 +++---
 .../ui/admin-web/app/scripts/services/User.js   | 18 +++---
 .../resources/ui/admin-web/app/styles/main.css  | 27 +++++++-
 .../admin-web/app/views/ambariViews/create.html | 14 ++---
 .../admin-web/app/views/ambariViews/edit.html   |  6 +-
 .../ui/admin-web/app/views/groups/create.html   |  2 +-
 .../ui/admin-web/app/views/groups/edit.html     | 37 ++++++-----
 .../ui/admin-web/app/views/groups/list.html     | 25 ++++----
 .../ui/admin-web/app/views/leftNavbar.html      |  2 +-
 .../ui/admin-web/app/views/users/create.html    |  6 +-
 .../ui/admin-web/app/views/users/list.html      | 14 +++--
 .../app/views/users/modals/changePassword.html  |  6 +-
 .../ui/admin-web/app/views/users/show.html      | 17 ++---
 ambari-web/app/templates/application.hbs        |  2 +-
 ambari-web/app/templates/main/menu_item.hbs     |  4 +-
 21 files changed, 235 insertions(+), 146 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/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 a1d33da..7b03087 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
@@ -52,7 +52,7 @@
               <li>
                 <div class="btn-group" dropdown is-open="status.isopen">
                 <button type="button" class="btn btn-default dropdown-toggle navbar-btn" ng-disabled="disabled">
-                    Admin <span class="caret"></span>
+                    {{currentUser}} <span class="caret"></span>
                   </button>
                   <ul class="dropdown-menu" role="menu">
                     <li><a href ng-click="about()">About</a></li>
@@ -125,6 +125,7 @@
     <script src="scripts/controllers/clusters/ClustersManageAccessCtrl.js"></script>
     <script src="scripts/directives/linkToDir.js"></script>
     <script src="scripts/directives/PasswordVerify.js"></script>
+    <script src="scripts/directives/disabledTooltip.js"></script>
     <script src="scripts/services/User.js"></script>
     <script src="scripts/services/Group.js"></script>
     <script src="scripts/services/View.js"></script>

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsEditCtrl.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsEditCtrl.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsEditCtrl.js
index 5e0c4d9..b5bcded 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsEditCtrl.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/groups/GroupsEditCtrl.js
@@ -24,6 +24,26 @@ angular.module('ambariAdminConsole')
   $scope.group.editingUsers = [];
   $scope.groupMembers = [];
   $scope.dataLoaded = false;
+  
+  $scope.isMembersEditing = false;
+  
+  $scope.enableMembersEditing = function() {
+    $scope.isMembersEditing = true;
+    $scope.group.editingUsers = angular.copy($scope.groupMembers);
+  };
+  $scope.cancelUpdate = function() {
+    $scope.isMembersEditing = false;
+    $scope.group.editingUsers = '';
+  };
+  $scope.updateMembers = function() {
+    var newMembers = $scope.group.editingUsers.toString().split(',').filter(function(item) {return item.trim();}).map(function(item) {return item.trim()});
+    $scope.group.members = newMembers;
+    $scope.group.saveMembers().then(loadMembers)
+    .catch(function(data) {
+      uiAlert.danger(data.status, data.message);
+    });
+    $scope.isMembersEditing = false;
+  };
 
 
   function loadMembers(){
@@ -37,22 +57,6 @@ angular.module('ambariAdminConsole')
     loadMembers();
   });
 
-  $scope.toggleEditMode = function() {
-    $scope.editMode = !$scope.editMode;
-
-    if( $scope.editMode ){
-      // $scope.group.editingUsers = $scope.group.members.join(', ');
-      $scope.group.editingUsers = $scope.groupMembers;
-    } else {
-      var newMembers = $scope.group.editingUsers.toString().split(',').filter(function(item) {return item.trim();}).map(function(item) {return item.trim()});
-      $scope.group.members = newMembers;
-      $scope.group.saveMembers().then(loadMembers)
-      .catch(function(data) {
-        uiAlert.danger(data.status, data.message);
-      });
-    }
-  };
-
   $scope.deleteGroup = function(group) {
     ConfirmationModal.show('Delete Group', 'Are you sure you want to delete group "'+ group.group_name +'"?').then(function() {
       group.destroy().then(function() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/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 286e098..1ae4c44 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
@@ -24,7 +24,7 @@ angular.module('ambariAdminConsole')
   $scope.groupsPerPage = 10;
   $scope.currentPage = 1;
   $scope.totalGroups = 1;
-  $scope.search = '';
+  $scope.currentNameFilter = '';
   $scope.maxVisiblePages=20;
 
   $scope.pageChanged = function() {
@@ -34,8 +34,18 @@ angular.module('ambariAdminConsole')
     loadGroups();
   };
 
+  $scope.resetPagination = function() {
+    $scope.currentPage = 1;
+    loadGroups();
+  };
+
   function loadGroups(){
-    Group.all($scope.currentPage, $scope.groupsPerPage, $scope.search).then(function(groups) {
+    Group.all({
+      currentPage: $scope.currentPage, 
+      groupsPerPage: $scope.groupsPerPage, 
+      searchString: $scope.currentNameFilter,
+      ldap_group: $scope.currentTypeFilter.value
+    }).then(function(groups) {
       $scope.totalGroups = groups.itemTotal;
       $scope.groups = groups;
     })
@@ -44,20 +54,12 @@ angular.module('ambariAdminConsole')
     });
   }
 
-  loadGroups();
-
-  $scope.typeFilterOptions = ['All', 'Local', 'LDAP'];
-  $scope.currentTypeFilter = 'All';
-  $scope.typeFilter = function(group) {
-    var tf = $scope.currentTypeFilter;
-    if (tf === 'All') {
-      return group;
-    } else if(tf === 'Local' && !group.ldap_group){
-      return group;
-    } else if(tf === 'LDAP' && group.ldap_group){
-      return group;
-    }
-  };
-
+  $scope.typeFilterOptions = [
+    {label:'All', value:'*'},
+    {label:'Local', value: false},
+    {label:'LDAP', value:true}
+  ];
+  $scope.currentTypeFilter = $scope.typeFilterOptions[0];
   
+  loadGroups();
 }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/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 d253eb1..c6a118a 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
@@ -37,4 +37,6 @@ angular.module('ambariAdminConsole')
   		}]
   	});
   };
+
+  $scope.currentUser = Auth.getCurrentUser();
 }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/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 4e8c409..4fee376 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
@@ -23,49 +23,48 @@ angular.module('ambariAdminConsole')
   $scope.usersPerPage = 10;
   $scope.currentPage = 1;
   $scope.totalUsers = 1;
-  $scope.search = '';
+  $scope.currentNameFilter = '';
   $scope.maxVisiblePages=20;
 
   $scope.pageChanged = function() {
-    loadUsers();
+    $scope.loadUsers();
   };
   $scope.usersPerPageChanges = function() {
-    loadUsers();
+    $scope.loadUsers();
   };
 
-  function loadUsers(){
-    User.list($scope.currentPage, $scope.usersPerPage, $scope.search).then(function(data) {
-      $scope.totalUsers = data.itemTotal;
-      $scope.users = data.items;
+  $scope.loadUsers = function(){
+    User.list({
+      currentPage: $scope.currentPage, 
+      usersPerPage: $scope.usersPerPage, 
+      searchString: $scope.currentNameFilter,
+      ldap_user: $scope.currentTypeFilter.value,
+      active: $scope.currentActiveFilter.value
+    }).then(function(data) {
+      $scope.totalUsers = data.data.itemTotal;
+      $scope.users = data.data.items;
     });
-  }
+  };
 
-  loadUsers();
+  $scope.resetPagination = function() {
+    $scope.currentPage = 1;
+    $scope.loadUsers();
+  };
 
+  $scope.actvieFilterOptions = [
+    {label: 'All', value: '*'}, 
+    {label: 'Active', value: true}, 
+    {label:'Inactive', value:false}
+  ];
+  $scope.currentActiveFilter = $scope.actvieFilterOptions[0];
+  
 
-  $scope.actvieFilterOptions = ['All', 'Active', 'Inactive'];
-  $scope.currentActiveFilter = 'All';
-  $scope.activeFilter = function(user) {
-    var af = $scope.currentActiveFilter;
-    if (af === 'All') {
-      return user;
-    } else if(af === 'Active' && user.Users.active){
-      return user;
-    } else if(af === 'Inactive' && !user.Users.active){
-      return user;
-    }
-  };
+  $scope.typeFilterOptions = [
+    {label:'All', value:'*'},
+    {label:'Local', value:false},
+    {label:'LDAP', value:true}
+  ];
+  $scope.currentTypeFilter = $scope.typeFilterOptions[0];
 
-  $scope.typeFilterOptions = ['All', 'Local', 'LDAP'];
-  $scope.currentTypeFilter = 'All';
-  $scope.typeFilter = function(user) {
-    var tf = $scope.currentTypeFilter;
-    if (tf === 'All') {
-      return user;
-    } else if(tf === 'Local' && !user.Users.ldap_user){
-      return user;
-    } else if(tf === 'LDAP' && user.Users.ldap_user){
-      return user;
-    }
-  };
+  $scope.loadUsers();
 }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/ambari-admin/src/main/resources/ui/admin-web/app/scripts/directives/disabledTooltip.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/directives/disabledTooltip.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/directives/disabledTooltip.js
new file mode 100644
index 0000000..3e29b46
--- /dev/null
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/directives/disabledTooltip.js
@@ -0,0 +1,41 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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')
+.directive('disabledTooltip', function() {
+  return {
+    restrict: 'A',
+    link: function(scope, elem, attrs, ctrl) {
+      if(!attrs.ngDisabled){
+        return;
+      }
+      scope.$watch(function(scope) {
+        return scope[attrs.ngDisabled];
+      }, function(val) {
+        if(val){
+          elem.tooltip({
+            title: attrs.disabledTooltip
+          });
+        } else {
+          elem.tooltip('destroy');
+        }
+      });
+    }
+  };
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Group.js
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Group.js b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Group.js
index ddadbb5..efe39a3 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Group.js
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/services/Group.js
@@ -147,18 +147,16 @@ angular.module('ambariAdminConsole')
     return $http.post(Settings.baseUrl + '/groups/' + groupName + '/members/'+memberName);
   };
 
-  Group.all = function(currentPage, groupsPerPage) {
+  Group.all = function(params) {
     var deferred = $q.defer();
 
-    $http({
-      method: 'GET',
-      url: Settings.baseUrl + '/groups',
-      params: {
-        'fields': 'Groups/ldap_group',
-        page_size: groupsPerPage,
-        from: (currentPage-1)*groupsPerPage
-      }
-    })
+    $http.get(Settings.baseUrl + '/groups?'
+      + 'Groups/group_name.matches(.*'+params.searchString+'.*)'
+      + '&fields=*'
+      + '&from='+ (params.currentPage-1)*params.groupsPerPage
+      + '&page_size=' + params.groupsPerPage
+      + (params.ldap_group === '*' ? '' : '&Groups/ldap_group='+params.ldap_group)
+    )
     .success(function(data) {
       var groups = [];
       if(Array.isArray(data.items)){

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/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 0bec8da..17583f6 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
@@ -34,12 +34,16 @@ angular.module('ambariAdminConsole')
   var Users = Restangular.all('users');
 
   return {
-    list: function(currentPage, usersPerPage) {
-      return Users.customGET('', {
-        fields: '*',
-        page_size: usersPerPage,
-        from: (currentPage-1)*usersPerPage
-      });
+    list: function(params) {
+      return $http.get(
+        Settings.baseUrl + '/users/?' 
+        + 'Users/user_name.matches(.*'+params.searchString+'.*)'
+        + '&fields=*'
+        + '&from=' + (params.currentPage-1)*params.usersPerPage
+        + '&page_size=' + params.usersPerPage
+        + (params.ldap_user === '*' ? '' : '&Users/ldap_user=' + params.ldap_user)
+        + (params.active === '*' ? '' : '&Users/active=' + params.active)
+      );
     },
     get: function(userId) {
       return Restangular.one('users', userId).get();
@@ -60,7 +64,7 @@ angular.module('ambariAdminConsole')
         data: {
           'Users/password': password,
           'Users/old_password': currentUserPassword,
-          'Users/roles': user.roles[0] || 'user' 
+          'Users/roles': user.roles[0] || 'user'
         }
       });
     },

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/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 ac98538..9b1b31d 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
@@ -33,6 +33,9 @@
   border: none;
   margin-top: 0;
 }
+.views-list-table h4{
+  font-size: 14px;
+}
 .views-list-table .panel-group .panel + .panel{
   margin-top: 0;
 }
@@ -73,6 +76,14 @@
 .ats-switch{
   border-color: #333;
 }
+.ats-switch.disabled, .ats-switch.disabled:hover{
+  cursor: not-allowed !important;
+  box-shadow: none!important;
+  border-color: #ccc!important;
+}
+.ats-switch.disabled .switch-left, .ats-switch.disabled .switch-right, .ats-switch.disabled .knob{
+  cursor: not-allowed!important;
+}
 .hide-soft{
   display: none;
 }
@@ -84,8 +95,12 @@
 }
 .panel{
   box-shadow: none;
+  border-radius: 0;
 }
 
+.users-pane table .glyphicon{
+  width: 14px;
+}
 
 .pulldown2{
   -webkit-transform: translateY(2px);
@@ -96,6 +111,12 @@
 .btn.disabled.syncldapbtn{
   pointer-events: auto;
   background-color: #e6e6e6;
+  cursor: not-allowed;
+}
+.btn.deleteuser-btn.disabled, .btn.deleteuser-btn[disabled]{
+  pointer-events: auto;
+  cursor: not-allowed;
+  background-color: #e6e6e6;
 }
 
 .about .logo{
@@ -178,10 +199,12 @@
 .create-view-form .description{
   display: inline-block;
   vertical-align: middle;
-  padding-left: 20px;
+}
+.create-view-form .description h4 span{
+  font-weight: normal;
+  
 }
 .create-view-form .view-header{
-  margin-bottom: 20px;
 }
 
 .left-navbar .panel{

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/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 07d1184..6c5ded8 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
@@ -22,11 +22,9 @@
 <hr>
 <form class="form-horizontal create-view-form" role="form" name="form.isntanceCreateForm" novalidate>
   <div class="view-header">
-    <img src="http://placehold.it/64x64" alt="" class="icon-big">
-    <img src="http://placehold.it/32x32" alt="" class="icon-small">
     <div class="description">
-      <h3>{{view.ViewVersionInfo.view_name}}</h3>
-      <span>{{view.ViewVersionInfo.label}} | Version: <select ng-model="version" class="instanceversion-input" ng-change="versionChanged()" ng-options="o as o for o in versions"></select></span>
+      <h4>View: <span>{{view.ViewVersionInfo.view_name}}</span></h4>
+      <h4>Version: <select ng-model="version" class="instanceversion-input" ng-change="versionChanged()" ng-options="o as o for o in versions"></select></h4>
     </div>
   </div>
   
@@ -38,9 +36,9 @@
       <div class="form-group" 
       ng-class="{'has-error' : ( (form.isntanceCreateForm.instanceNameInput.$error.required || form.isntanceCreateForm.instanceNameInput.$error.pattern) && form.isntanceCreateForm.submitted) || instanceExists }"
       >
-        <label for="" class="control-labe col-sm-2">Instance Name</label>
+        <label for="" class="control-label col-sm-2">Instance Name</label>
         <div class="col-sm-10">
-          <input type="text" class="form-control instancename-input" name="instanceNameInput" ng-pattern="nameValidationPattern" required ng-model="instance.instance_name">
+          <input type="text" class="form-control instancename-input" name="instanceNameInput" ng-pattern="nameValidationPattern" required ng-model="instance.instance_name" autocomplete="off">
 
           <div class="alert alert-danger no-margin-bottom top-margin" ng-show='form.isntanceCreateForm.instanceNameInput.$error.required && form.isntanceCreateForm.submitted'>
             This field is required.
@@ -57,7 +55,7 @@
       ng-class="{'has-error' : ( (form.isntanceCreateForm.displayLabel.$error.required || form.isntanceCreateForm.displayLabel.$error.pattern) && form.isntanceCreateForm.submitted)}">
         <label for="" class="control-labe col-sm-2">Display Label</label>
         <div class="col-sm-10">
-          <input type="text" class="form-control instancelabel-input" name="displayLabel" ng-model="instance.label" required ng-pattern="nameValidationPattern">
+          <input type="text" class="form-control instancelabel-input" name="displayLabel" ng-model="instance.label" required ng-pattern="nameValidationPattern" autocomplete="off">
 
           <div class="alert alert-danger no-margin-bottom top-margin" ng-show='form.isntanceCreateForm.displayLabel.$error.required && form.isntanceCreateForm.submitted'>
             This field is required.
@@ -87,7 +85,7 @@
         ng-class="{'has-error' : (form.isntanceCreateForm[parameter.name].$error.required && form.isntanceCreateForm.submitted)}" >
         <label for="" class="col-sm-3 control-label" ng-class="{'not-required': !parameter.required}">{{parameter.description}}{{parameter.required ? '*' : ''}}</label>
         <div class="col-sm-9">
-          <input type="text" class="form-control viewproperty-input"  name="{{parameter.name}}" ng-required="parameter.required" ng-model="parameter.value">
+          <input type="text" class="form-control viewproperty-input"  name="{{parameter.name}}" ng-required="parameter.required" ng-model="parameter.value" autocomplete="off">
           <div class="alert alert-danger no-margin-bottom top-margin" ng-show='form.isntanceCreateForm[parameter.name].$error.required && form.isntanceCreateForm.submitted'>
             Field requried!
           </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/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 875a9c4..92fbecb 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
@@ -29,7 +29,7 @@
   <div class="panel-heading clearfix">
     <h3 class="panel-title pull-left">Settings</h3>
     <div class="pull-right">
-      <a href ng-click="editSettingsDisabled = !editSettingsDisabled" ng-show="editSettingsDisabled" class="settings-edit-toggle"> <span class="glyphicon glyphicon-cog"></span> Edit</a>
+      <a href ng-click="editSettingsDisabled = !editSettingsDisabled" ng-show="editSettingsDisabled" class="settings-edit-toggle"> <span class="glyphicon glyphicon-pencil"></span> Edit</a>
     </div>
   </div>
   <div class="panel-body">
@@ -75,7 +75,7 @@
   <div class="panel-heading clearfix">
     <h3 class="panel-title pull-left">Permissions</h3>
     <div class="pull-right" >
-      <a ng-hide="isPermissionsEmpty" href class="permissions-edit-toggle" ng-click="editPermissionDisabled = !editPermissionDisabled" ng-show="editPermissionDisabled"> <span class="glyphicon glyphicon-cog"></span> Edit</a>
+      <a ng-hide="isPermissionsEmpty" href class="permissions-edit-toggle" ng-click="editPermissionDisabled = !editPermissionDisabled" ng-show="editPermissionDisabled"> <span class="glyphicon glyphicon-pencil"></span> Edit</a>
     </div>
   </div>
   <div class="panel-body">
@@ -124,7 +124,7 @@
   <div class="panel-heading clearfix">
     <h3 class="panel-title pull-left">Properties</h3>
     <div class="pull-right">
-      <a href ng-hide="isConfigurationEmpty" ng-click="editConfigurationDisabled = !editConfigurationDisabled" ng-show="editConfigurationDisabled" class="properties-toggle"> <span class="glyphicon glyphicon-cog"></span> Edit</a>
+      <a href ng-hide="isConfigurationEmpty" ng-click="editConfigurationDisabled = !editConfigurationDisabled" ng-show="editConfigurationDisabled" class="properties-toggle"> <span class="glyphicon glyphicon-pencil"></span> Edit</a>
     </div>
   </div>
   <div class="panel-body">

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/create.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/create.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/create.html
index c722cda..2395da7 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/create.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/groups/create.html
@@ -24,7 +24,7 @@
   <div class="form-group" ng-class="{'has-error' : (form.group_name.$error.required || form.group_name.$error.pattern) && form.submitted}">
     <label for="groupname" class="col-sm-2 control-label">Group name</label>
     <div class="col-sm-10">
-      <input type="text" id="groupname" class="form-control groupname-input" name="group_name" placeholder="Group name" ng-model="group.group_name" required ng-pattern="/^([a-zA-Z0-9._\s]+)$/">
+      <input type="text" id="groupname" class="form-control groupname-input" name="group_name" placeholder="Group name" ng-model="group.group_name" required ng-pattern="/^([a-zA-Z0-9._\s]+)$/" autocomplete="off">
       <div class="alert alert-danger top-margin" ng-show="form.group_name.$error.required && form.submitted">
         Required
       </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/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 f3c995f..7e399c0 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
@@ -34,28 +34,37 @@
     </div>
   </div>
   <div class="form-group">
-    <label for="" class="col-sm-2 control-label">{{group.ldap_group ? 'LDAP Members' : 'Local Members'}}</label>
+    <label for="members" class="col-sm-2 control-label">{{group.ldap_group ? 'LDAP Members' : 'Local Members'}}</label>
     <div class="col-sm-10">
-      <div ng-switch="editMode">
-        <div class="well users" ng-switch-when="false">
-          <span ng-repeat="member in groupMembers" >
-            <link-to route='users.show' id="{{member}}">
-              {{member}}
-            </link-to>
-            {{$last ? '' : ', '}}
-          </span>
+      <div class="row" ng-hide="isMembersEditing">
+        <div class="col-sm-10">
+          <div class="well users">
+            <span ng-repeat="member in groupMembers" >
+              <link-to route='users.show' id="{{member}}">
+                {{member}}
+              </link-to>
+              {{$last ? '' : ', '}}
+            </span>
+          </div>
         </div>
-        <div ng-switch-when="true">
-          <textarea class="form-control bottom-margin" id=""  ng-model="group.editingUsers"></textarea>
+        <div class="col-sm-2">
+          <a href ng-click="enableMembersEditing()" ng-hide="user.ldap_group"><span class="glyphicon glyphicon-pencil"></span> Edit</a>
+        </div>
+      </div>
+      <div class="row" ng-show="isMembersEditing">
+        <div class="col-sm-12">
+          <textarea name="groups" id="" cols="30" rows="5" class="form-control bottom-margin usergroups" ng-model="group.editingUsers"></textarea>
+          <a href class="btn btn-primary pull-right left-margin updategroups" ng-click="updateMembers()">Save</a>
+          <button class="btn btn-default pull-right cancel-groups-update" ng-click="cancelUpdate()">Cancel</button>
         </div>
       </div>
-      <button ng-show="!group.ldap_group" class="btn btn-primary pull-right" ng-click="toggleEditMode()"><span class="glyphicon {{editMode ? 'glyphicon-save' : 'glyphicon-pencil'}}"></span> {{editMode ? 'Save': 'Edit'}}</button>
     </div>
   </div>
-  <div class="form-group" ng-show="dataLoaded">
+
+  <div class="form-group">
       <label for="" class="col-sm-2 control-label">Privileges</label>
       <div class="col-sm-10">
-        <table class="table" ng-show="privileges">
+        <table class="table">
           <thead>
             <tr>
               <th>Resource</th>

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/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 138703e..bfb2b87 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
@@ -25,7 +25,7 @@
     </div>
   </div>
   <hr>
-  <table class="table table-striped table-hover">
+  <table class="table table-striped table-hover col-sm-12">
     <thead>
       <tr>
         <th>
@@ -38,32 +38,33 @@
         <th>Members</th>
       </tr>
       <tr>
-        <th>
+        <th class="col-sm-8">
           <div class="search-container">
-            <input type="text" class="form-control namefilter" ng-model="currentNameFilter">
-            <button type="button" class="close" ng-show="currentNameFilter" ng-click="currentNameFilter=''"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+            <input type="text" class="form-control namefilter" ng-model="currentNameFilter" ng-change="resetPagination()">
+            <button type="button" class="close" ng-show="currentNameFilter" ng-click="currentNameFilter=''; resetPagination()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
           </div>
         </th>
-        <th>
+        <th class="col-sm-2">
           <select class="form-control typefilter"
             ng-model="currentTypeFilter"
-            ng-options="item for item in typeFilterOptions">
+            ng-options="item.label for item in typeFilterOptions"
+            ng-change="resetPagination();">
           </select>
         </th>
-        <th></th>
+        <th class="col-sm-2"></th>
       </tr>
     </thead>
     <tbody>
-      <tr ng-repeat="group in groups | filter:typeFilter | filter:currentNameFilter">
-        <td>
+      <tr ng-repeat="group in groups">
+        <td class="col-sm-8">
           <link-to route="groups.edit" class="link-to-group" id="{{group.group_name}}">{{group.group_name}}</link-to>
         </td>
-        <td>{{group.ldap_group ? 'LDAP' : 'Local'}}</td>
-        <td>{{group.members.length}} {{group.members.length === 1 ? 'member' : 'members'}}</td>
+        <td class="col-sm-2">{{group.ldap_group ? 'LDAP' : 'Local'}}</td>
+        <td class="col-sm-2">{{group.members.length}} {{group.members.length === 1 ? 'member' : 'members'}}</td>
       </tr>
     </tbody>
   </table>
-  <div class="alert alert-info" ng-show="!groups.length">
+  <div class="alert alert-info col-sm-12" ng-show="!groups.length">
     No groups to display.
   </div>
   <div class="col-sm-12">

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/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 805095b..0d4570c 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
@@ -60,7 +60,7 @@
         <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-default btn-block syncldapbtn disabled" popover="LDAP is not configured. To configure LDAP, run ambari-server setup-ldap from the command line." popover-trigger="mouseenter">
+        <a ng-switch-default href class="btn btn-default btn-block syncldapbtn disabled" tooltip="LDAP is not configured. To configure LDAP, run ambari-server setup-ldap from the command line.">
           <span class="glyphicon glyphicon-transfer pulldown2"></span> Sync LDAP
         </a>
       </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/ambari-admin/src/main/resources/ui/admin-web/app/views/users/create.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/users/create.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/users/create.html
index d9b6e11..fb379ce 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/users/create.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/users/create.html
@@ -43,7 +43,7 @@
     </div>
   </div>
   <div class="form-group">
-    <label for="" class="col-sm-2 control-label">Ambari Admin</label>
+    <label for="" class="col-sm-2 control-label"><span class="glyphicon glyphicon-flash"></span>Ambari Admin</label>
     <div class="col-sm-10">
       <toggle-switch ng-disabled="isCurrentUser" model="user.admin" on-label="Yes" off-label="No" class="switch-primary userstatus" data-off-color="danger"></toggle-switch>
     </div>
@@ -51,9 +51,9 @@
   <div class="form-group" ng-class="{'has-error' : (form.password.$error.required && form.submitted) || form.confirmPassword.$error.passwordVerify}">
     <label for="password" class="col-sm-2 control-label">Password</label>
     <div class="col-sm-10">
-      <input type="password" class="form-control bottom-margin userpassword" name="password" placeholder="Password" required ng-model="user.password">
+      <input type="password" class="form-control bottom-margin userpassword" name="password" placeholder="Password" required ng-model="user.password" autocomplete="off">
       <input type="password" class="form-control bottom-margin userpasswordconfirm" name="confirmPassword" placeholder="Password confirmation" required ng-model="user.passwordConfirmation"
-        password-verify="user.password">
+        password-verify="user.password" autocomplete="off">
 
       <div class="alert alert-danger" ng-show='form.confirmPassword.$error.passwordVerify'>
         Password must match!

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/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 76e36ee..d30581b 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
@@ -32,15 +32,16 @@
         <th>
           <div class="search-container">
             <label for="">Username</label>
-            <input type="text" class="form-control namefilter" ng-model="currentNameFilter">
-            <button type="button" class="close clearfilter" ng-show="currentNameFilter" ng-click="currentNameFilter=''"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
+            <input type="text" class="form-control namefilter" ng-model="currentNameFilter" ng-change="resetPagination()">
+            <button type="button" class="close clearfilter" ng-show="currentNameFilter" ng-click="currentNameFilter=''; resetPagination()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
           </div>
         </th>
         <th>
           <label for="">Type</label>
           <select class="form-control typefilter"
             ng-model="currentTypeFilter"
-            ng-options="item for item in typeFilterOptions">
+            ng-options="item.label for item in typeFilterOptions"
+            ng-change="resetPagination()">
           </select>
 
         </th>
@@ -48,15 +49,16 @@
           <label for="">Status</label>
           <select class="form-control statusfilter" 
             ng-model="currentActiveFilter"
-            ng-options="item for item in actvieFilterOptions">
+            ng-options="item.label for item in actvieFilterOptions"
+            ng-change="resetPagination()">
           </select>
         </th>
       </tr>
     </thead>
     <tbody>
-      <tr ng-repeat="user in users | filter:activeFilter | filter:typeFilter | filter:currentNameFilter">
+      <tr ng-repeat="user in users">
         <td>
-          <span class="glyphicon glyphicon-flash" ng-show="user.Users.admin"></span>
+          <span class="glyphicon" tooltip="{{user.Users.admin ? 'Ambari Admin' : ''}}" ng-class="{'glyphicon-flash' : user.Users.admin}"></span>
           <link-to route="users.show" id="{{user.Users.user_name}}">{{user.Users.user_name}}</link-to>
         </td>
         <td>{{user.Users.ldap_user ? 'LDAP' : 'Local'}}</td>

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/ambari-admin/src/main/resources/ui/admin-web/app/views/users/modals/changePassword.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/users/modals/changePassword.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/users/modals/changePassword.html
index 24f174b..c912d4c 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/users/modals/changePassword.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/users/modals/changePassword.html
@@ -23,7 +23,7 @@
     <div class="form-group" ng-class="{'has-error' : (form.passwordChangeForm.currentPassword.$error.required && form.passwordChangeForm.submitted)}">
       <label for="" class="col-sm-4 control-label" >Your Password</label>
       <div class="col-sm-8">
-        <input type="password" name="currentPassword" class="form-control bottom-margin" placeholder="Your password" required ng-model="passwordData.currentUserPassword">
+        <input type="password" name="currentPassword" class="form-control bottom-margin" placeholder="Your password" required ng-model="passwordData.currentUserPassword" autocomplete="off">
         <div class="alert alert-danger no-margin-bottom" ng-show='form.passwordChangeForm.password.$error.required && form.passwordChangeForm.submitted'>
           Password required!
         </div>
@@ -32,9 +32,9 @@
     <div class="form-group no-margin-bottom" ng-class="{'has-error' : (form.passwordChangeForm.password.$error.required && form.passwordChangeForm.submitted) || form.passwordChangeForm.confirmPassword.$error.passwordVerify}">
       <label for="" class="col-sm-4 control-label">New Password:</label>
       <div class="col-sm-8">
-        <input type="password" class="form-control bottom-margin" name="password" placeholder="Password" required ng-model="passwordData.password">
+        <input type="password" class="form-control bottom-margin" name="password" placeholder="Password" required ng-model="passwordData.password" autocomplete="off">
         <input type="password" class="form-control bottom-margin" name="confirmPassword" placeholder="Password confirmation" required ng-model="passwordData.passwordConfirmation"
-          password-verify="passwordData.password">
+          password-verify="passwordData.password" autocomplete="off">
         <div class="alert alert-danger no-margin-bottom" ng-show='form.passwordChangeForm.confirmPassword.$error.passwordVerify'>
           Password must match!
         </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/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 e6b3b02..cbd0092 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
@@ -20,10 +20,13 @@
   <div class="clearfix">
     <ol class="breadcrumb pull-left">
       <li><a href="#/users">Users</a></li>
-      <li class="active">{{user.user_name}}</li>
+      <li class="active"><span class="glyphicon glyphicon-flash" ng-show="user.admin"></span>{{user.user_name}}</li>
     </ol>
     <div class="pull-right top-margin-4">
-      <button class="btn deleteuser-btn" ng-class="{'btn-danger': !isCurrentUser, 'btn-default' : isCurrentUser}" ng-click="deleteUser()" ng-disabled="isCurrentUser">Delete User</button>
+      <div ng-switch="isCurrentUser">
+        <button class="btn deleteuser-btn disabled btn-default" ng-switch-when="true" tooltip="Cannot Delete User">Delete User</button>
+        <button class="btn deleteuser-btn btn-danger" ng-switch-when="false" ng-click="deleteUser()">Delete User</button>
+      </div>
     </div>
   </div>
   <hr>
@@ -37,13 +40,13 @@
     <div class="form-group">
       <label for="" class="col-sm-2 control-label">Status</label>
       <div class="col-sm-10">
-        <toggle-switch on-change="toggleUserActive()" ng-disabled="isCurrentUser" model="user.active" on-label="Active" off-label="Inactive" class="switch-primary userstatus" data-off-color="danger"></toggle-switch>
+        <toggle-switch on-change="toggleUserActive()" disabled-tooltip="Cannot Change Status" ng-disabled="isCurrentUser" model="user.active" on-label="Active" off-label="Inactive" class="switch-primary userstatus" data-off-color="danger"></toggle-switch>
       </div>
     </div>
     <div class="form-group">
-      <label for="" class="col-sm-2 control-label">Ambari Admin</label>
+      <label for="" class="col-sm-2 control-label"><span class="glyphicon glyphicon-flash"></span> Ambari Admin</label>
       <div class="col-sm-10">
-        <toggle-switch on-change="toggleUserAdmin()" ng-disabled="isCurrentUser" model="user.admin" on-label="Yes" off-label="No" class="switch-primary userstatus" data-off-color="danger"></toggle-switch>
+        <toggle-switch on-change="toggleUserAdmin()" disabled-tooltip="Cannot Change Admin" ng-disabled="isCurrentUser" model="user.admin" on-label="Yes" off-label="No" class="switch-primary userstatus" data-off-color="danger"></toggle-switch>
       </div>
     </div>
     <div class="form-group">
@@ -79,10 +82,10 @@
       </div>
         
     </div>
-    <div class="form-group" ng-show="dataLoaded">
+    <div class="form-group">
       <label for="" class="col-sm-2 control-label">Privileges</label>
       <div class="col-sm-10">
-        <table class="table" ng-show="privileges">
+        <table class="table">
           <thead>
             <tr>
               <th>Resource</th>

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/ambari-web/app/templates/application.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/application.hbs b/ambari-web/app/templates/application.hbs
index e4361af..5a6ce4c 100644
--- a/ambari-web/app/templates/application.hbs
+++ b/ambari-web/app/templates/application.hbs
@@ -50,7 +50,7 @@
               <ul class="dropdown-menu">
                   <li><a href="" {{action showAboutPopup target="controller"}}>{{t app.aboutAmbari}}</a></li>
                   {{#if App.isAdmin }}
-                    <li><a href="/views/ADMIN_VIEW/1.0.0/INSTANCE/#/">{{t app.manageAmbari}}</a></li>
+                    <li><a href="/views/ADMIN_VIEW/1.0.0/INSTANCE/#/" target="adminconsole">{{t app.manageAmbari}}</a></li>
                   {{/if}}
                 {{#if isClusterDataLoaded}}
                   {{#if App.isAdmin}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/d79289bb/ambari-web/app/templates/main/menu_item.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/menu_item.hbs b/ambari-web/app/templates/main/menu_item.hbs
index b21d66e..278e3e9 100644
--- a/ambari-web/app/templates/main/menu_item.hbs
+++ b/ambari-web/app/templates/main/menu_item.hbs
@@ -41,7 +41,9 @@
   <ul class="top-nav-dropdown-menu">
     {{#if view.content.views}}
       {{#each category in view.content.views}}
-        <li><a href="#" {{action "setView" category target="App.router.mainViewsController"}}>{{category.label}}</a></li>
+        {{#if category.visible }}
+          <li><a href="#" {{action "setView" category target="App.router.mainViewsController"}}>{{category.label}}</a></li>
+        {{/if}}
       {{/each}}
     {{else}}
       <li class="disabled"><a href="javascript:void(null);">{{t menu.item.views.noViews}}</a></li>