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/25 14:32:34 UTC

[09/22] git commit: AMBARI-6996. Admin View: misc UI improvements. (yusaku)

AMBARI-6996. Admin View: misc 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/3b64d3f7
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/3b64d3f7
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/3b64d3f7

Branch: refs/heads/branch-alerts-dev
Commit: 3b64d3f7c9c850492e99208f364d924051e72286
Parents: a1ab301
Author: Yusaku Sako <yu...@hortonworks.com>
Authored: Fri Aug 22 12:26:56 2014 -0700
Committer: Yusaku Sako <yu...@hortonworks.com>
Committed: Fri Aug 22 13:16:04 2014 -0700

----------------------------------------------------------------------
 .../scripts/controllers/users/UsersShowCtrl.js  | 65 ++++++++------
 .../ui/admin-web/app/scripts/services/User.js   |  3 +-
 .../resources/ui/admin-web/app/styles/main.css  | 12 ++-
 .../admin-web/app/views/ambariViews/create.html |  6 +-
 .../admin-web/app/views/ambariViews/edit.html   | 95 +++++++++++---------
 .../admin-web/app/views/ambariViews/list.html   | 81 -----------------
 .../app/views/ambariViews/listTable.html        |  2 +-
 .../app/views/clusters/manageAccess.html        | 75 +++++++++-------
 .../ui/admin-web/app/views/groups/list.html     | 10 ++-
 .../ui/admin-web/app/views/users/show.html      |  2 +-
 .../controllers/global/cluster_controller.js    |  4 +-
 11 files changed, 162 insertions(+), 193 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/3b64d3f7/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 f5fa89f..ee61cb1 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
@@ -108,10 +108,17 @@ angular.module('ambariAdminConsole')
   };
 
   $scope.toggleUserActive = function() {
-    User.setActive($scope.user.user_name, !$scope.user.active);
+    if(!$scope.isCurrentUser){
+      User.setActive($scope.user.user_name, !$scope.user.active);
+    }
   };    
   $scope.toggleUserAdmin = function() {
-    User.setAdmin($scope.user.user_name, !$scope.user.admin);
+    if(!$scope.isCurrentUser){
+      User.setAdmin($scope.user.user_name, !$scope.user.admin)
+      .then(function() {
+        loadPrivilegies();
+      });
+    }
   };    
 
   $scope.deleteUser = function() {
@@ -123,30 +130,36 @@ angular.module('ambariAdminConsole')
   };
 
   // Load privilegies
-  User.getPrivilegies($routeParams.id).then(function(data) {
-    var privilegies = {
-      clusters: {},
-      views: {}
-    };
-    angular.forEach(data.data.items, function(privilegie) {
-      privilegie = privilegie.PrivilegeInfo;
-      if(privilegie.type === 'CLUSTER'){
-        // This is cluster
-        privilegies.clusters[privilegie.cluster_name] = privilegies.clusters[privilegie.cluster_name] || '';
-        privilegies.clusters[privilegie.cluster_name] += privilegies.clusters[privilegie.cluster_name] ? ', ' + privilegie.permission_name : privilegie.permission_name;
-      } else if ( privilegie.type === 'VIEW'){
-        privilegies.views[privilegie.instance_name] = privilegies.views[privilegie.instance_name] || { privileges:''};
-        privilegies.views[privilegie.instance_name].version = privilegie.version;
-        privilegies.views[privilegie.instance_name].view_name = privilegie.view_name;
-        privilegies.views[privilegie.instance_name].privileges += privilegies.views[privilegie.instance_name].privileges ? ', ' + privilegie.permission_name : privilegie.permission_name;
-
-      }
-    });
+  function loadPrivilegies(){
+    User.getPrivilegies($routeParams.id).then(function(data) {
+      var privilegies = {
+        clusters: {},
+        views: {}
+      };
+      angular.forEach(data.data.items, function(privilegie) {
+        privilegie = privilegie.PrivilegeInfo;
+        if(privilegie.type === 'CLUSTER'){
+          // This is cluster
+          privilegies.clusters[privilegie.cluster_name] = privilegies.clusters[privilegie.cluster_name] || '';
+          privilegies.clusters[privilegie.cluster_name] += privilegies.clusters[privilegie.cluster_name] ? ', ' + privilegie.permission_name : privilegie.permission_name;
+        } else if ( privilegie.type === 'VIEW'){
+          privilegies.views[privilegie.instance_name] = privilegies.views[privilegie.instance_name] || { privileges:''};
+          privilegies.views[privilegie.instance_name].version = privilegie.version;
+          privilegies.views[privilegie.instance_name].view_name = privilegie.view_name;
+          privilegies.views[privilegie.instance_name].privileges += privilegies.views[privilegie.instance_name].privileges ? ', ' + privilegie.permission_name : privilegie.permission_name;
+
+        }
+      });
+
+      $scope.privileges = data.data.items.length ? privilegies : null;
+      $scope.dataLoaded = true;
 
-    $scope.privileges = data.data.items.length ? privilegies : null;
-    $scope.dataLoaded = true;
+    }).catch(function(data) {
+      uiAlert.danger(data.data.status, data.data.message);
+    });
+  }
 
-  }).catch(function(data) {
-    uiAlert.danger(data.data.status, data.data.message);
-  });
+  loadPrivilegies();
+  
+    
 }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/3b64d3f7/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 b49a2ce..9c2e36a 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
@@ -64,8 +64,7 @@ angular.module('ambariAdminConsole')
         url: Settings.baseUrl + '/users/' + user.user_name,
         data: {
           'Users/password': password,
-          'Users/old_password': currentUserPassword,
-          'Users/roles': user.roles[0] || 'user'
+          'Users/old_password': currentUserPassword
         }
       });
     },

http://git-wip-us.apache.org/repos/asf/ambari/blob/3b64d3f7/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 fd85def..4cfe0bd 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
@@ -133,7 +133,7 @@
   background-color: #e6e6e6;
   cursor: not-allowed;
 }
-.btn.deleteuser-btn.disabled, .btn.deleteuser-btn[disabled]{
+.btn.deleteuser-btn.disabled, .btn.deleteuser-btn[disabled], .btn.btn-delete-instance.disabled{
   pointer-events: auto;
   cursor: not-allowed;
   background-color: #e6e6e6;
@@ -251,8 +251,13 @@
   top: 30px;
 }
 .groups-pane .search-container .close{
-  top: 5px;
+  top: 30px;
 }
+.views-list-table .search-container .close{
+  top: 5px;
+  right: 50px;
+  z-index: 10;
+} 
 .views-list-pane .search-container .close{
   right: 50px;
   top: 5px;
@@ -337,6 +342,9 @@ table.no-border tr td{
 .top-margin-4{
   margin-top: 4px;
 }
+.table > thead > tr > th.vertical-top{
+  vertical-align: top;
+}
 
 .groups-pane table ul{
   list-style-type: none;

http://git-wip-us.apache.org/repos/asf/ambari/blob/3b64d3f7/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 d63a267..ba01520 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
@@ -63,18 +63,18 @@
       ng-class="{'has-error' : ( (form.isntanceCreateForm.displayLabel.$error.required || form.isntanceCreateForm.displayLabel.$error.pattern) && form.isntanceCreateForm.submitted)}">
         <label for="" class="control-label 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" autocomplete="off">
+          <input type="text" class="form-control instancelabel-input" name="displayLabel" ng-model="instance.label" required ng-pattern="/^([a-zA-Z0-9._\s]+)$/" 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.
           </div>
           <div class="alert alert-danger no-margin-bottom top-margin" ng-show='form.isntanceCreateForm.displayLabel.$error.pattern && form.isntanceCreateForm.submitted'>
-            Must not contain any special characters or spaces.
+            Must not contain any special characters.
           </div>
         </div>
       </div>
       <div class="form-group" ng-class="{'has-error' : form.isntanceCreateForm.description.$error.required && form.isntanceCreateForm.submitted }">
-        <label for="" class="control-label col-sm-2">Instance Description</label>
+        <label for="" class="control-label col-sm-2">Description</label>
         <div class="col-sm-10">
           <input type="text" class="form-control" name="description" ng-model="instance.description" maxlength="140" required>
           <div class="alert alert-danger no-margin-bottom top-margin" ng-show='form.isntanceCreateForm.description.$error.required && form.isntanceCreateForm.submitted'>

http://git-wip-us.apache.org/repos/asf/ambari/blob/3b64d3f7/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 63bbcb2..857957d 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
@@ -20,8 +20,9 @@
     <li><a href="#/views">Views</a></li>
     <li class="active">{{instance.ViewInstanceInfo.label}}</li>
   </ol>
-  <div class="pull-right top-margin-4">
-    <button class="btn btn-danger" ng-click="deleteInstance(instance)">Delete Instance</button>
+  <div class="pull-right top-margin-4" ng-switch="instance.ViewInstanceInfo.static">
+    <button ng-switch-when="true" class="btn disabled btn-default btn-delete-instance" tooltip="Cannot Delete Static Instances">Delete Instance</button>
+    <button ng-switch-when="false" class="btn btn-danger" ng-click="deleteInstance(instance)">Delete Instance</button>
   </div>
 </div>
 <hr>
@@ -30,7 +31,7 @@
     <h3 class="panel-title pull-left">Settings</h3>
     <div class="pull-right" ng-switch="instance.ViewInstanceInfo.static">
       <a href ng-switch-when="false" ng-click="toggleSettingsEdit()" ng-show="editSettingsDisabled" class="settings-edit-toggle"> <span class="glyphicon glyphicon-pencil" ></span> Edit</a>
-      <a href ng-switch-when="true" class="settings-edit-toggle disabled" tooltip="You can`t edit XML driven instances"> <span class="glyphicon glyphicon-pencil" ></span> Edit</a>
+      <a href ng-switch-when="true" class="settings-edit-toggle disabled" tooltip="Cannot Edit Static Instances"> <span class="glyphicon glyphicon-pencil" ></span> Edit</a>
     </div>
   </div>
   <div class="panel-body">
@@ -48,17 +49,20 @@
           <label for="" class="col-sm-2 control-label">Instance Name</label>
           <div class="col-sm-10"><input disabled="disabled" type="text" class="form-control instancename-input" placeholder="Display Name" value="{{instance.ViewInstanceInfo.instance_name}}"></div>
         </div>
-        <div class="form-group" ng-class="{'has-error' : settingsForm.displayName.$error.required && !editSettingsDisabled}">
+        <div class="form-group" ng-class="{'has-error' : (settingsForm.displayName.$error.required || settingsForm.displayName.$error.pattern) && !editSettingsDisabled}">
           <label for="" class="col-sm-2 control-label">Display Name</label>
           <div class="col-sm-10">
-            <input type="text" class="form-control instancename-input" placeholder="Display Name" name="displayName" required ng-model="settings.label">
+            <input type="text" class="form-control instancename-input" placeholder="Display Name" name="displayName" required ng-model="settings.label" ng-pattern="/^([a-zA-Z0-9._\s]+)$/">
             <div class="alert alert-danger no-margin-bottom top-margin" ng-show='settingsForm.displayName.$error.required  && !editSettingsDisabled'>
               This field is required.
             </div>
+            <div class="alert alert-danger no-margin-bottom top-margin" ng-show='settingsForm.displayName.$error.pattern && !editSettingsDisabled'>
+              Must not contain any special characters.
+            </div>
           </div>
         </div>
         <div class="form-group" ng-class="{'has-error' : settingsForm.description.$error.required  && !editSettingsDisabled}">
-          <label for="" class="control-label col-sm-2">Instance Description</label>
+          <label for="" class="control-label col-sm-2">Description</label>
           <div class="col-sm-10">
             <input type="text" class="form-control" ng-model="settings.description" name="description" placeholder="Instance Description" required>
             <div class="alert alert-danger no-margin-bottom top-margin" ng-show='settingsForm.description.$error.required  && !editSettingsDisabled'>
@@ -94,41 +98,52 @@
     </div>
   </div>
   <div class="panel-body">
-    <form class="form-horizontal" ng-show="!isPermissionsEmpty">
-      <div class="form-group">
-        <div class="col-sm-2"></div>
-        <label class="col-sm-5 control-label text-left">Users</label>
-        <label class="col-sm-5 control-label text-left">Groups</label>
-      </div>
-      <div class="form-group" ng-repeat="permission in permissions">
-        <label class="col-sm-2 control-label">{{permission.PermissionInfo.permission_name}}</label>
-        <div class="col-sm-5" ng-switch="editPermissionDisabled">
-          <textarea name="" id="" cols="30" rows="4" class="form-control permission-textarea-user" ng-model="permissionsEdit[permission.PermissionInfo.permission_name].USER" ng-switch-when="false"></textarea>
-          <div class="well" ng-switch-when="true">
-            <span ng-repeat="user in permission.USER">
-              <link-to route="users.show" id="{{user}}">{{user}}</link-to>
-              {{$last ? '' :', '}}
-            </span>
-          </div>
-        </div>
-        <div class="col-sm-5" ng-switch="editPermissionDisabled">
-          <textarea name="" id="" cols="30" rows="4" class="form-control permission-textarea-group" ng-model="permissionsEdit[permission.PermissionInfo.permission_name].GROUP" ng-switch-when="false"></textarea>
-          <div class="well" ng-switch-when="true">
-            <span ng-repeat="group in permission.GROUP">
-              <link-to route="groups.edit" id="{{group}}" >{{group}}</link-to>
-              {{$last ? '' :', '}}
-            </span>
-          </div>
-        </div>
-      </div>
-      
-      <div class="form-group" ng-hide="editPermissionDisabled">
-        <div class="col-sm-offset-2 col-sm-10">
-          <button class="btn btn-primary pull-right left-margin permissions-save" ng-click="savePermissions()">Save</button>
-          <button class="btn btn-default pull-right permissions-cancel" ng-click="cancelPermissions()">Cancel</button>
-        </div>
+    
+
+    <table class="table" ng-show="!isPermissionsEmpty">
+      <thead>
+        <tr>
+          <th class="col-sm-2"><label>Permission</label></th>
+          <th><label>Grant permission to these users</label></th>
+          <th><label>Grant permission to these groups</label></th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr ng-repeat="permission in permissions">
+          <td>
+            <label class="">{{permission.PermissionInfo.permission_name}}</label>
+          </td>
+          <td>
+            <div class="" ng-switch="editPermissionDisabled">
+              <textarea name="" id="" cols="30" rows="4" class="form-control permission-textarea-user" ng-model="permissionsEdit[permission.PermissionInfo.permission_name].USER" ng-switch-when="false"></textarea>
+              <div class="well" ng-switch-when="true">
+                <span ng-repeat="user in permission.USER">
+                  <link-to route="users.show" id="{{user}}">{{user}}</link-to>
+                  {{$last ? '' :', '}}
+                </span>
+              </div>
+            </div>
+          </td>
+          <td>
+            <div class="" ng-switch="editPermissionDisabled">
+              <textarea name="" id="" cols="30" rows="4" class="form-control permission-textarea-group" ng-model="permissionsEdit[permission.PermissionInfo.permission_name].GROUP" ng-switch-when="false"></textarea>
+              <div class="well" ng-switch-when="true">
+                <span ng-repeat="group in permission.GROUP">
+                  <link-to route="groups.edit" id="{{group}}" >{{group}}</link-to>
+                  {{$last ? '' :', '}}
+                </span>
+              </div>
+            </div>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+    <div class="form-group" ng-hide="editPermissionDisabled">
+      <div class="col-sm-offset-2 col-sm-10">
+        <button class="btn btn-primary pull-right left-margin permissions-save" ng-click="savePermissions()">Save</button>
+        <button class="btn btn-default pull-right permissions-cancel" ng-click="cancelPermissions()">Cancel</button>
       </div>
-    </form>
+    </div>
     <div ng-show="isPermissionsEmpty">
       <div class="alert alert-info">There are no permissions defined for this view.</div>
     </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/3b64d3f7/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
deleted file mode 100644
index 2c26791..0000000
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/list.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<!--
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
--->
-    
-<div class="views-list-pane">
-  <div class="clearfix">
-    <ol class="breadcrumb pull-left">
-      <li class="active">Views</li>
-    </ol>
-    <div class="pull-right col-sm-4">
-      <div class="input-group search-container">
-        <input type="text" class="form-control search-input" placeholder="Search" ng-model="viewsFilter" ng-change="getFilteredViews()">
-        <button type="button" class="close clear-search" ng-show="viewsFilter" ng-click="viewsFilter=''; getFilteredViews()"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
-        <span class="input-group-addon">
-          <span class="glyphicon glyphicon-search"></span>
-        </span>
-      </div>
-    </div>
-  </div>
-  <hr>
-  <div class="row">
-    <div class="col-sm-3 padding-left-30"><h4>View Name</h4></div>
-    <div class="col-sm-3"><h4>Versions</h4></div>
-    <div class="col-sm-3"><h4>Instances</h4></div>
-    <div class="col-sm-3"><h4>Description</h4></div>
-  </div>
-  <accordion>
-    <accordion-group ng-repeat="view in filteredViews" is-open="open">
-      <accordion-heading>
-        <div class="row">
-          <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>
-        </div>
-      </accordion-heading>
-      <table class="table">
-        <tbody>
-          <tr ng-repeat="instance in view.instances">
-            <td class="col-sm-3"></td>
-            <td class="col-sm-3">{{instance.ViewInstanceInfo.version}}</td>
-            <td class="col-sm-3">
-              <a href="#/views/{{view.view_name}}/versions/{{instance.ViewInstanceInfo.version}}/instances/{{instance.ViewInstanceInfo.instance_name}}/edit" class="instance-link">{{instance.ViewInstanceInfo.label}}</a>
-            </td>
-            <td class="col-sm-3">
-            </td>
-          </tr>
-        </tbody>
-        <tfoot>
-          <tr>
-            <td class="col-sm-3"></td>
-            <td class="col-sm-3"></td>
-            <td class="col-sm-3">
-              <a class="btn btn-default createisntance-btn" href="#/views/{{view.view_name}}/versions/{{view.versionsList[view.versionsList.length-1].ViewVersionInfo.version}}/new"><span class="glyphicon glyphicon-plus" ></span> Create Instance</a>
-            </td>
-            <td class="col-sm-3">
-            </td>
-          </tr>
-        </tfoot>
-      </table>
-    </accordion-group>
-
-  </accordion>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/3b64d3f7/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/listTable.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/listTable.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/listTable.html
index e5963ef..a166c10 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/listTable.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/ambariViews/listTable.html
@@ -35,7 +35,7 @@
   <div class="row">
     <div class="col-sm-3 padding-left-30"><h4>View Name</h4></div>
     <div class="col-sm-3"><h4>Instances</h4></div>
-    <div class="col-sm-6"><h4>Description</h4></div>
+    <div class="col-sm-6"><h4></h4></div>
   </div>
   <accordion close-others="false">
     <accordion-group ng-repeat="view in filteredViews" is-open="view.isOpened">

http://git-wip-us.apache.org/repos/asf/ambari/blob/3b64d3f7/ambari-admin/src/main/resources/ui/admin-web/app/views/clusters/manageAccess.html
----------------------------------------------------------------------
diff --git a/ambari-admin/src/main/resources/ui/admin-web/app/views/clusters/manageAccess.html b/ambari-admin/src/main/resources/ui/admin-web/app/views/clusters/manageAccess.html
index 47ae621..c6954ca 100644
--- a/ambari-admin/src/main/resources/ui/admin-web/app/views/clusters/manageAccess.html
+++ b/ambari-admin/src/main/resources/ui/admin-web/app/views/clusters/manageAccess.html
@@ -22,41 +22,50 @@
       <li class="active">{{clusterName}} Permissions</li>
     </ol>
     <div class="pull-right top-margin-4">
-      <a href class="btn btn-primary"  ng-click="toggleEditMode()"><span class="glyphicon glyphicon-pencil"></span> Edit</a>
+      <a href class="btn btn-primary"  ng-hide="isEditMode" ng-click="toggleEditMode()"><span class="glyphicon glyphicon-pencil"></span> Edit</a>
     </div>
   </div>
   <hr>
-  <form class="form-horizontal">
-    <div class="form-group">
-      <div class="col-sm-2"></div>
-      <label class="col-sm-5 control-label text-left">Users</label>
-      <label class="col-sm-5 control-label text-left">Groups</label>
-    </div>
-    <div class="form-group" ng-repeat="permission in permissions">
-      <label class="col-sm-2 control-label">{{permission.PermissionInfo.permission_name}}</label>
-      <div class="col-sm-5" ng-switch="isEditMode">
-        <textarea ng-switch-when="true" name="" id="" cols="30" rows="4" class="form-control permission-user-input" ng-model="permissionsEdit[permission.PermissionInfo.permission_name].USER"></textarea>
-        <div class="well" ng-switch-default>
-          <span ng-repeat="user in permission.USER">
-            <link-to route="users.show" id="{{user}}" >{{user}}</link-to>
-            {{$last ? '' :', '}}
-          </span>
-        </div>
-      </div>
-      <div class="col-sm-5" ng-switch="isEditMode">
-        <textarea ng-switch-when="true" name="" id="" cols="30" rows="4" class="form-control permission-group-input" ng-model="permissionsEdit[permission.PermissionInfo.permission_name].GROUP"></textarea>
-        <div class="well" ng-switch-default>
-          <span ng-repeat="group in permission.GROUP">
-            <link-to route="groups.edit" id="{{group}}">{{group}}</link-to>
-            {{$last ? '' :', '}}
-          </span>
-        </div>
-      </div>
-    </div>
-    <div class="form-group" ng-show="isEditMode">
-      <div class="col-sm-offset-2 col-sm-10">
-        <button class="btn btn-default pull-right left-margin permissions-cancel" ng-click="cancel()">Cancel</button>
-        <button class="btn btn-primary pull-right permission-save" ng-click="save()">Save</button>
-      </div>
+  <table class="table">
+    <thead>
+      <tr>
+        <th class="col-sm-2"><label>Permission</label></th>
+        <th><label>Grant permission to these users</label></th>
+        <th><label>Grant permission to these groups</label></th>
+      </tr>
+    </thead>
+    <tbody>
+      <tr ng-repeat="permission in permissions">
+        <td><label class="">{{permission.PermissionInfo.permission_name}}</label></td>
+        <td>
+          <div class="" ng-switch="isEditMode">
+            <textarea ng-switch-when="true" name="" id="" cols="30" rows="4" class="form-control permission-user-input" ng-model="permissionsEdit[permission.PermissionInfo.permission_name].USER"></textarea>
+            <div class="well" ng-switch-default>
+              <span ng-repeat="user in permission.USER">
+                <link-to route="users.show" id="{{user}}" >{{user}}</link-to>
+                {{$last ? '' :', '}}
+              </span>
+            </div>
+          </div>
+        </td>
+        <td>
+          <div class="" ng-switch="isEditMode">
+            <textarea ng-switch-when="true" name="" id="" cols="30" rows="4" class="form-control permission-group-input" ng-model="permissionsEdit[permission.PermissionInfo.permission_name].GROUP"></textarea>
+            <div class="well" ng-switch-default>
+              <span ng-repeat="group in permission.GROUP">
+                <link-to route="groups.edit" id="{{group}}">{{group}}</link-to>
+                {{$last ? '' :', '}}
+              </span>
+            </div>
+          </div>
+        </td>
+      </tr>
+    </tbody>
+  </table>
+  <div class="form-group" ng-show="isEditMode">
+    <div class="col-sm-offset-2 col-sm-10">
+      <button class="btn btn-primary pull-right permission-save left-margin" ng-click="save()">Save</button>
+      <button class="btn btn-default pull-right permissions-cancel" ng-click="cancel()">Cancel</button>
     </div>
+  </div>
 </div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/3b64d3f7/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 ed8de4a..b809b7b 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
@@ -27,7 +27,7 @@
   <hr>
   <table class="table table-striped table-hover col-sm-12">
     <thead>
-      <tr>
+      <!-- <tr>
         <th>
           <label for="">Group Name</label>
         </th>
@@ -35,22 +35,26 @@
           <label for="">Type</label>
         </th>
         <th><label for="">Members</label></th>
-      </tr>
+      </tr> -->
       <tr>
         <th class="col-sm-8">
           <div class="search-container">
+            <label for="">Group Name</label>
             <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 class="col-sm-2">
+          <label for="">Type</label>
           <select class="form-control typefilter"
             ng-model="currentTypeFilter"
             ng-options="item.label for item in typeFilterOptions"
             ng-change="resetPagination();">
           </select>
         </th>
-        <th class="col-sm-2"></th>
+        <th class="col-sm-2 vertical-top">
+          <label for="">Members</label>
+        </th>
       </tr>
     </thead>
     <tbody>

http://git-wip-us.apache.org/repos/asf/ambari/blob/3b64d3f7/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 b87da82..1ba09d3 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
@@ -117,7 +117,7 @@
             </tr>
           </tbody>
         </table>
-        <div class="alert alert-info" ng-show="!privileges">This user does not have any privileges.</div>
+        <div class="alert alert-info" ng-show="!privileges && !user.admin">This user does not have any privileges.</div>
         <div class="alert alert-info" ng-show="user.admin">This user is an Ambari Admin and has all privileges.</div>
       </div>
     </div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/3b64d3f7/ambari-web/app/controllers/global/cluster_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/global/cluster_controller.js b/ambari-web/app/controllers/global/cluster_controller.js
index 31d9901..6a6cdd2 100644
--- a/ambari-web/app/controllers/global/cluster_controller.js
+++ b/ambari-web/app/controllers/global/cluster_controller.js
@@ -385,7 +385,9 @@ App.ClusterController = Em.Controller.extend({
             instanceName: instance.ViewInstanceInfo.instance_name,
             href: instance.ViewInstanceInfo.context_path
           });
-          self.get('ambariViews').pushObject(current_instance);
+          if( current_instance.visible){
+            self.get('ambariViews').pushObject(current_instance);
+          }
         }, this);
       }, this);
     }, this);