Repository: ambari
Updated Branches:
  refs/heads/trunk 62fb70e15 -> 48b61d0cc


AMBARI-6962. 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/48b61d0c
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/48b61d0c
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/48b61d0c

Branch: refs/heads/trunk
Commit: 48b61d0cc5c7ac927bcdd23ab2513d3e22f5ce57
Parents: 62fb70e
Author: Yusaku Sako <yus...@hortonworks.com>
Authored: Wed Aug 20 14:04:49 2014 -0700
Committer: Yusaku Sako <yus...@hortonworks.com>
Committed: Wed Aug 20 15:00:19 2014 -0700

----------------------------------------------------------------------
 .../ambariViews/CreateViewInstanceCtrl.js       |   3 +-
 .../ambariViews/EditViewInstanceCtrl.js         | 154 -------------------
 .../controllers/ambariViews/ViewsEditCtrl.js    |  74 +++++----
 .../controllers/ambariViews/ViewsListCtrl.js    |   1 -
 .../scripts/controllers/users/UsersListCtrl.js  |  11 +-
 .../scripts/controllers/users/UsersShowCtrl.js  |   9 +-
 .../ui/admin-web/app/scripts/services/User.js   |   1 +
 .../ui/admin-web/app/scripts/services/View.js   |   7 +-
 .../resources/ui/admin-web/app/styles/main.css  |  24 +++
 .../admin-web/app/views/ambariViews/create.html |   9 ++
 .../admin-web/app/views/ambariViews/edit.html   |  41 +++--
 .../app/views/ambariViews/listTable.html        |   8 +-
 .../ui/admin-web/app/views/groups/list.html     |   3 +-
 .../ui/admin-web/app/views/users/list.html      |   9 ++
 .../app/views/users/modals/changePassword.html  |   8 +-
 .../ui/admin-web/app/views/users/show.html      |  11 +-
 16 files changed, 160 insertions(+), 213 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/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 cb8dda0..92398ed 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
@@ -34,7 +34,8 @@ angular.module('ambariAdminConsole')
         visible: true,
         icon_path: '',
         icon64_path: '',
-        properties: viewVersion.ViewVersionInfo.parameters
+        properties: viewVersion.ViewVersionInfo.parameters,
+        description: ''
       };    
     });
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/EditViewInstanceCtrl.js
----------------------------------------------------------------------
diff --git 
a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/EditViewInstanceCtrl.js
 
b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/EditViewInstanceCtrl.js
deleted file mode 100644
index e63fe14..0000000
--- 
a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/EditViewInstanceCtrl.js
+++ /dev/null
@@ -1,154 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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('EditViewInstanceCtrl', ['$scope', 'View', 'uiAlert', 
'PermissionLoader', 'PermissionSaver', 'instance', '$modalInstance', '$modal', 
function($scope, View, uiAlert, PermissionLoader, PermissionSaver, instance, 
$modalInstance, $modal) {
-
-  $scope.instance = instance;
-  $scope.settings = {
-    'visible': $scope.instance.ViewInstanceInfo.visible,
-    'label': $scope.instance.ViewInstanceInfo.label
-  };
-  $scope.configuration = 
angular.copy($scope.instance.ViewInstanceInfo.properties);
-  
-  function reloadViewPrivilegies(){
-    PermissionLoader.getViewPermissions({
-      viewName: $scope.instance.ViewInstanceInfo.view_name,
-      version: $scope.instance.ViewInstanceInfo.version,
-      instanceId: $scope.instance.ViewInstanceInfo.instance_name
-    })
-    .then(function(permissions) {
-      // Refresh data for rendering
-      $scope.permissionsEdit = permissions;
-      $scope.permissions = angular.copy(permissions);
-    })
-    .catch(function(data) {
-      uiAlert.danger(data.data.status, data.data.message);
-    });
-  }
-
-  $scope.permissions = [];
-  
-  reloadViewPrivilegies();
-
-  $scope.edit = {};
-  $scope.edit.editSettingsDisabled = true;
-  
-
-  $scope.saveSettings = function() {
-    View.updateInstance($scope.instance.ViewInstanceInfo.view_name, 
$scope.instance.ViewInstanceInfo.version, 
$scope.instance.ViewInstanceInfo.instance_name, {
-      'ViewInstanceInfo':{
-        'visible': $scope.settings.visible,
-        'label': $scope.settings.label
-      }
-    })
-    .success(function() {
-      $scope.edit.editSettingsDisabled = true;
-    })
-    .catch(function(data) {
-      uiAlert.danger(data.data.status, data.data.message);
-    });
-  };
-
-  $scope.cancelSettings = function() {
-    $scope.settings = {
-      'visible': $scope.instance.ViewInstanceInfo.visible,
-      'label': $scope.instance.ViewInstanceInfo.label
-    };
-    $scope.edit.editSettingsDisabled = true;
-  };
-
-  $scope.edit.editConfigurationDisabled = true;
-
-  $scope.saveConfiguration = function() {
-    View.updateInstance($scope.instance.ViewInstanceInfo.view_name, 
$scope.instance.ViewInstanceInfo.version, 
$scope.instance.ViewInstanceInfo.instance_name, {
-      'ViewInstanceInfo':{
-        'properties': $scope.configuration
-      }
-    })
-    .success(function() {
-      $scope.edit.editConfigurationDisabled = true;
-    })
-    .catch(function(data) {
-      uiAlert.danger(data.data.status, data.data.message);
-    });
-  };
-  $scope.cancelConfiguration = function() {
-    $scope.configuration = 
angular.copy($scope.instance.ViewInstanceInfo.properties);
-    $scope.edit.editConfigurationDisabled = true;
-  };
-
-  // Permissions edit
-  $scope.edit.editPermissionDisabled = true;
-  $scope.cancelPermissions = function() {
-    $scope.permissionsEdit = angular.copy($scope.permissions); // Reset 
textedit areaes
-    $scope.edit.editPermissionDisabled = true;
-  };
-
-  $scope.savePermissions = function() {
-    PermissionSaver.saveViewPermissions(
-      $scope.permissions,
-      $scope.permissionsEdit,
-      {
-        view_name: $scope.instance.ViewInstanceInfo.view_name,
-        version: $scope.instance.ViewInstanceInfo.version,
-        instance_name: $scope.instance.ViewInstanceInfo.instance_name
-      }
-    )
-    .then(reloadViewPrivilegies)
-    .catch(function(data) {
-      reloadViewPrivilegies();
-      uiAlert.danger(data.data.status, data.data.message);
-    });
-    $scope.edit.editPermissionDisabled = true;
-  };
-
-  $scope.removePermission = function(permissionName, principalType, 
principalName) {
-    var modalInstance = $modal.open({
-      templateUrl: 'views/ambariViews/modals/create.html',
-      size: 'lg',
-      controller: 'CreateViewInstanceCtrl',
-      resolve: {
-        viewVersion: function(){
-          return '';
-        }
-      }
-    });
-
-
-
-    View.deletePrivilege({
-      view_name: $scope.instance.ViewInstanceInfo.view_name,
-      version: $scope.instance.ViewInstanceInfo.version,
-      instance_name: $scope.instance.ViewInstanceInfo.instance_name,
-      permissionName: permissionName,
-      principalType: principalType,
-      principalName: principalName
-    })
-    .then(reloadViewPrivilegies)
-    .catch(function(data) {
-      reloadViewPrivilegies();
-      uiAlert.danger(data.data.status, data.data.message);
-    });
-  };
-
-  $scope.close = function() {
-    $modalInstance.close();
-  };
-}]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/ViewsEditCtrl.js
----------------------------------------------------------------------
diff --git 
a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/ViewsEditCtrl.js
 
b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/ViewsEditCtrl.js
index 6d251a5..46f184e 100644
--- 
a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/ViewsEditCtrl.js
+++ 
b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/ViewsEditCtrl.js
@@ -25,12 +25,19 @@ angular.module('ambariAdminConsole')
     View.getInstance($routeParams.viewId, $routeParams.version, 
$routeParams.instanceId)
     .then(function(instance) {
       $scope.instance = instance;
+
       $scope.settings = {
         'visible': $scope.instance.ViewInstanceInfo.visible,
-        'label': $scope.instance.ViewInstanceInfo.label
+        'label': $scope.instance.ViewInstanceInfo.label,
+        'description': $scope.instance.ViewInstanceInfo.description
       };
 
       $scope.configuration = 
angular.copy($scope.instance.ViewInstanceInfo.properties);
+      for(var confName in $scope.configuration){
+        if( $scope.configuration.hasOwnProperty(confName) ){
+          $scope.configuration[confName] = $scope.configuration[confName] === 
'null' ? '' : $scope.configuration[confName];
+        }
+      }
       $scope.isConfigurationEmpty = angular.equals({}, $scope.configuration);
     })
     .catch(function(data) {
@@ -72,45 +79,56 @@ angular.module('ambariAdminConsole')
   reloadViewPrivilegies();
 
   $scope.editSettingsDisabled = true;
-  
+  $scope.toggleSettingsEdit = function() {
+    $scope.editSettingsDisabled = !$scope.editSettingsDisabled;
+  };
 
   $scope.saveSettings = function() {
-    View.updateInstance($routeParams.viewId, $routeParams.version, 
$routeParams.instanceId, {
-      'ViewInstanceInfo':{
-        'visible': $scope.settings.visible,
-        'label': $scope.settings.label
-      }
-    })
-    .success(function() {
-      reloadViewInfo();
-      $scope.editSettingsDisabled = true;
-    })
-    .catch(function(data) {
-      uiAlert.danger(data.data.status, data.data.message);
-    });
+    if( $scope.settingsForm.$valid ){
+      View.updateInstance($routeParams.viewId, $routeParams.version, 
$routeParams.instanceId, {
+        'ViewInstanceInfo':{
+          'visible': $scope.settings.visible,
+          'label': $scope.settings.label,
+          'description': $scope.settings.description
+        }
+      })
+      .success(function() {
+        reloadViewInfo();
+        $scope.editSettingsDisabled = true;
+      })
+      .catch(function(data) {
+        uiAlert.danger(data.data.status, data.data.message);
+      });
+    }
   };
   $scope.cancelSettings = function() {
     $scope.settings = {
       'visible': $scope.instance.ViewInstanceInfo.visible,
-      'label': $scope.instance.ViewInstanceInfo.label
+      'label': $scope.instance.ViewInstanceInfo.label,
+      'description': $scope.instance.ViewInstanceInfo.description
     };
     $scope.editSettingsDisabled = true;
   };
 
+  
   $scope.editConfigurationDisabled = true;
-
+  $scope.togglePropertiesEditing = function() {
+     $scope.editConfigurationDisabled = !$scope.editConfigurationDisabled;
+  }
   $scope.saveConfiguration = function() {
-    View.updateInstance($routeParams.viewId, $routeParams.version, 
$routeParams.instanceId, {
-      'ViewInstanceInfo':{
-        'properties': $scope.configuration
-      }
-    })
-    .success(function() {
-      $scope.editConfigurationDisabled = true;
-    })
-    .catch(function(data) {
-      uiAlert.danger(data.data.status, data.data.message);
-    });
+    if( $scope.propertiesForm.$valid ){
+      View.updateInstance($routeParams.viewId, $routeParams.version, 
$routeParams.instanceId, {
+        'ViewInstanceInfo':{
+          'properties': $scope.configuration
+        }
+      })
+      .success(function() {
+        $scope.editConfigurationDisabled = true;
+      })
+      .catch(function(data) {
+        uiAlert.danger(data.data.status, data.data.message);
+      });
+    }
   };
   $scope.cancelConfiguration = function() {
     $scope.configuration = 
angular.copy($scope.instance.ViewInstanceInfo.properties);

http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/ViewsListCtrl.js
----------------------------------------------------------------------
diff --git 
a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/ViewsListCtrl.js
 
b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/ViewsListCtrl.js
index 91d48be..b85bcb4 100644
--- 
a/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/ViewsListCtrl.js
+++ 
b/ambari-admin/src/main/resources/ui/admin-web/app/scripts/controllers/ambariViews/ViewsListCtrl.js
@@ -73,7 +73,6 @@ angular.module('ambariAdminConsole')
         return !!view; // Remove 'undefined'
       });
     }
-
     $scope.filteredViews = result;
   };
 }]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/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 2ecf8e7..1cf734c 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
@@ -39,7 +39,8 @@ angular.module('ambariAdminConsole')
       usersPerPage: $scope.usersPerPage, 
       searchString: $scope.currentNameFilter,
       ldap_user: $scope.currentTypeFilter.value,
-      active: $scope.currentActiveFilter.value
+      active: $scope.currentActiveFilter.value,
+      admin: $scope.adminFilter
     }).then(function(data) {
       $scope.totalUsers = data.data.itemTotal;
       $scope.users = data.data.items;
@@ -66,6 +67,14 @@ angular.module('ambariAdminConsole')
   ];
   $scope.currentTypeFilter = $scope.typeFilterOptions[0];
 
+  $scope.adminFilter = false;
+  $scope.toggleAdminFilter = function() {
+    $scope.adminFilter = !$scope.adminFilter;
+    $scope.resetPagination();
+    $scope.loadUsers();
+  };
+
+
   $scope.loadUsers();
 
   $rootScope.$watch(function(scope) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/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 fa1c484..f5fa89f 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
@@ -57,7 +57,6 @@ angular.module('ambariAdminConsole')
     $q.all(promises).then(function() {
       loadUserInfo();
     });
-    // $scope.user.user_groups = $scope.editingGroupsList.split(',');
     $scope.isGroupEditing = false;
   };
 
@@ -69,13 +68,19 @@ angular.module('ambariAdminConsole')
   $scope.openChangePwdDialog = function() {
     var modalInstance = $modal.open({
       templateUrl: 'views/users/modals/changePassword.html',
-      controller: ['$scope', function($scope) {
+      resolve: {
+        userName: function() {
+          return $scope.user.user_name;
+        }
+      },
+      controller: ['$scope', 'userName', function($scope, userName) {
         $scope.passwordData = {
           password: '',
           currentUserPassword: ''
         };
 
         $scope.form = {};
+        $scope.userName = userName;
 
         $scope.ok = function() {
           $scope.form.passwordChangeForm.submitted = true;

http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/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 17583f6..b49a2ce 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
@@ -43,6 +43,7 @@ angular.module('ambariAdminConsole')
         + '&page_size=' + params.usersPerPage
         + (params.ldap_user === '*' ? '' : '&Users/ldap_user=' + 
params.ldap_user)
         + (params.active === '*' ? '' : '&Users/active=' + params.active)
+        + (params.admin ? '&Users/admin=true' : '')
       );
     },
     get: function(userId) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/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 5c39537..0634a25 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
@@ -72,7 +72,7 @@ angular.module('ambariAdminConsole')
       }
     }
 
-    self.isOpened = !self.instances.length;
+    // self.isOpened = !self.instances.length;
     self.versionsList = item.versions;
   }
 
@@ -177,7 +177,8 @@ angular.module('ambariAdminConsole')
           visible: instanceInfo.visible,
           icon_path: instanceInfo.icon_path,
           icon64_path: instanceInfo.icon64_path,
-          properties: properties
+          properties: properties,
+          description: instanceInfo.description
         }
       }
     })
@@ -239,7 +240,7 @@ angular.module('ambariAdminConsole')
     var fields = [
       'versions/ViewVersionInfo/version',
       'versions/instances/ViewInstanceInfo',
-      'versions/ViewVersionInfo'
+      'versions/*'
     ];
 
     $http({

http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/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 f6db020..fd85def 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
@@ -16,6 +16,17 @@
  * limitations under the License.
  */
 
+ .instances-table{
+  table-layout: fixed;
+ }
+ .description-column{
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  max-width: 100%;
+  display: inline-block;
+ }
+
 .paginator{
   margin: 0;
 }
@@ -106,6 +117,11 @@
   width: 14px;
 }
 
+.settings-edit-toggle.disabled, .properties-toggle.disabled{
+  color: #999;
+  cursor: not-allowed;
+}
+
 .pulldown2{
   -webkit-transform: translateY(2px);
   -ms-transform: translateY(2px);
@@ -268,6 +284,14 @@ ul.nav li > a{
   cursor: pointer;
 }
 
+.admin-filter{
+  cursor: pointer;
+}
+
+.glyphicon-flash.no-filter{
+  color: #999;
+}
+
 .top-buffer{
   padding-top: 20px;
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/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 b7e3606..d63a267 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
@@ -73,6 +73,15 @@
           </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>
+        <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'>
+            This field is required.
+          </div>
+        </div>
+      </div>
       <div class="form-group">
         <div class="col-sm-10 col-sm-offset-2">
           <div class="checkbox">

http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/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 7296824..63bbcb2 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
@@ -28,12 +28,13 @@
 <div class="panel panel-default" ng-cloak ng-show="instance">
   <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-pencil"></span> Edit</a>
+    <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>
     </div>
   </div>
   <div class="panel-body">
-    <form class="form-horizontal">
+    <form class="form-horizontal" name="settingsForm" novalidate>
       <div class="form-group">
         <label for="" class="col-sm-2 control-label">View Name</label>
         <div class="col-sm-10"><input disabled="disabled" type="text" 
class="form-control instancename-input" placeholder="Display Name" 
value="{{instance.ViewInstanceInfo.view_name}}"></div>
@@ -47,9 +48,23 @@
           <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">
+        <div class="form-group" ng-class="{'has-error' : 
settingsForm.displayName.$error.required && !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" ng-model="settings.label"></div>
+          <div class="col-sm-10">
+            <input type="text" class="form-control instancename-input" 
placeholder="Display Name" name="displayName" required 
ng-model="settings.label">
+            <div class="alert alert-danger no-margin-bottom top-margin" 
ng-show='settingsForm.displayName.$error.required  && !editSettingsDisabled'>
+              This field is required.
+            </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>
+          <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'>
+              This field is required.
+            </div>
+          </div>
         </div>
         <div class="form-group">
           <div class="col-sm-offset-2 col-sm-10">
@@ -123,16 +138,22 @@
 <div class="panel panel-default">
   <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-pencil"></span> Edit</a>
+    <div class="pull-right" ng-switch="instance.ViewInstanceInfo.static">
+      <a href ng-switch-when="false" ng-hide="isConfigurationEmpty" 
ng-click="togglePropertiesEditing()" ng-show="editConfigurationDisabled" 
class="properties-toggle"> <span class="glyphicon glyphicon-pencil"></span> 
Edit</a>
+      <a href ng-switch-when="true" ng-hide="isConfigurationEmpty"  
class="properties-toggle disabled"> <span class="glyphicon 
glyphicon-pencil"></span> Edit</a>
     </div>
   </div>
   <div class="panel-body">
-    <form action="" class="form-horizontal" ng-hide="isConfigurationEmpty">
+    <form name="propertiesForm" class="form-horizontal" 
ng-hide="isConfigurationEmpty" novalidate>
       <fieldset ng-disabled="editConfigurationDisabled">
-        <div class="form-group" ng-repeat="(propertyName, propertyValue) in 
configurationMeta">
+        <div class="form-group" ng-repeat="(propertyName, propertyValue) in 
configurationMeta" ng-class="{'has-error' : propertyValue.required && 
propertiesForm[propertyName].$error.required && !editConfigurationDisabled}">
           <label for="" class="control-label col-sm-3" 
ng-class="{'not-required': !propertyValue.required}" 
tooltip="{{propertyValue.description}}">{{propertyName}}{{propertyValue.required
 ? '*' : ''}}</label>
-          <div class="col-sm-9"><input type="{{propertyValue.masked ? 
'password' : 'text'}}" class="form-control propertie-input" 
ng-model="configuration[propertyName]"></div>
+          <div class="col-sm-9">
+            <input type="{{propertyValue.masked ? 'password' : 'text'}}" 
class="form-control propertie-input" ng-required="propertyValue.required" 
name="{{propertyName}}" ng-model="configuration[propertyName]">
+            <div class="alert alert-danger no-margin-bottom top-margin" 
ng-show='propertyValue.required && propertiesForm[propertyName].$error.required 
&& !editConfigurationDisabled'>
+              This field is required.
+            </div>
+          </div>
         </div>
         <div class="form-group" ng-hide="editConfigurationDisabled">
           <div class="col-sm-offset-2 col-sm-10">

http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/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 9305e87..e5963ef 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
@@ -46,18 +46,18 @@
             {{view.view_name}}
           </div>
           <div class="col-sm-3">{{view.versions}}</div>
-          <div class="col-sm-6">This is a description</div>
+          <div class="col-sm-6">{{view.description}}</div>
         </div>
       </accordion-heading>
-      <table class="table">
+      <table class="table instances-table">
         <tbody>
           <tr ng-repeat="instance in view.instances">
             <td class="col-sm-3"></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">{{instance.ViewInstanceInfo.version}}</td>
-            <td class="col-sm-3">
+            <td class="col-sm-1">{{instance.ViewInstanceInfo.version}}</td>
+            <td class="col-sm-5 " ><div class="description-column" 
tooltip="{{instance.ViewInstanceInfo.description}}">{{instance.ViewInstanceInfo.description
 || 'No description'}}</div>
             </td>
           </tr>
         </tbody>

http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/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 f5fd1dd..ed8de4a 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
@@ -33,9 +33,8 @@
         </th>
         <th>
           <label for="">Type</label>
-          
         </th>
-        <th>Members</th>
+        <th><label for="">Members</label></th>
       </tr>
       <tr>
         <th class="col-sm-8">

http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/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 d30581b..189110c 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
@@ -29,6 +29,13 @@
   <table class="table table-striped table-hover">
     <thead>
       <tr>
+        <th width="30">
+          <span class="bottom-margin admin-filter glyphicon glyphicon-flash" 
+            ng-class="{'no-filter' : !adminFilter}" 
+            ng-click="toggleAdminFilter()"
+            tooltip="{{adminFilter ? 'Show all users' : 'Show only admin 
users'}}"
+          ></span>
+        </th>
         <th>
           <div class="search-container">
             <label for="">Username</label>
@@ -59,6 +66,8 @@
       <tr ng-repeat="user in users">
         <td>
           <span class="glyphicon" tooltip="{{user.Users.admin ? 'Ambari Admin' 
: ''}}" ng-class="{'glyphicon-flash' : user.Users.admin}"></span>
+        </td>
+        <td>
           <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/48b61d0c/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 c912d4c..9b3f50d 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
@@ -16,7 +16,7 @@
 * limitations under the License.
 -->
 <div class="modal-header">
-  <h3 class="modal-title">Change Password</h3>
+  <h3 class="modal-title">Change Password for {{userName}}</h3>
 </div>
 <div class="modal-body">
   <form class="form-horizontal" novalidate name="form.passwordChangeForm" 
role="form" >
@@ -30,10 +30,10 @@
       </div>
     </div>
     <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>
+      <label for="" class="col-sm-4 control-label">New User Password:</label>
       <div class="col-sm-8">
-        <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"
+        <input type="password" class="form-control bottom-margin" 
name="password" placeholder="New User Password" required 
ng-model="passwordData.password" autocomplete="off">
+        <input type="password" class="form-control bottom-margin" 
name="confirmPassword" placeholder="New User Password Confirmation" required 
ng-model="passwordData.passwordConfirmation"
           password-verify="passwordData.password" autocomplete="off">
         <div class="alert alert-danger no-margin-bottom" 
ng-show='form.passwordChangeForm.confirmPassword.$error.passwordVerify'>
           Password must match!

http://git-wip-us.apache.org/repos/asf/ambari/blob/48b61d0c/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 5530031..b87da82 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
@@ -52,7 +52,11 @@
     <div class="form-group">
       <label for="password" class="col-sm-2 control-label">Password</label>
       <div class="col-sm-10">
-        <a href ng-click="openChangePwdDialog()" ng-disabled="user.ldap_user" 
class="btn btn-default changepassword">Change Password</a>
+        <div ng-switch="user.ldap_user">
+          <button class="btn deleteuser-btn disabled btn-default" 
ng-switch-when="true" tooltip="Cannot Change Password">Change Password</button>
+          <a href ng-click="openChangePwdDialog()" ng-switch-when="false" 
class="btn btn-default changepassword">Change Password</a>
+        </div>
+          
       </div>
     </div>
     <div class="form-group">
@@ -82,7 +86,7 @@
       </div>
         
     </div>
-    <div class="form-group">
+    <div class="form-group" >
       <label for="" class="col-sm-2 control-label">Privileges</label>
       <div class="col-sm-10">
         <table class="table">
@@ -92,7 +96,7 @@
               <th>Permissions</th>
             </tr>
           </thead>
-          <tbody>
+          <tbody ng-hide="user.admin">
             <tr ng-repeat="(name, privilege) in privileges.clusters">
               <td>
                 <span class="glyphicon glyphicon-cloud"></span> 
@@ -114,6 +118,7 @@
           </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="user.admin">This user is an 
Ambari Admin and has all privileges.</div>
       </div>
     </div>
   </form>

Reply via email to