ranger-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From v..@apache.org
Subject [2/3] incubator-ranger git commit: RANGER-1311 : Ranger UI changes to support non-US characters in username related fields
Date Sat, 21 Jan 2017 01:26:06 GMT
RANGER-1311 : Ranger UI changes to support non-US characters in username related fields

Signed-off-by: Velmurugan Periasamy <vel@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/823f51fe
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/823f51fe
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/823f51fe

Branch: refs/heads/master
Commit: 823f51fecd63c9d59690de225db224918a3d60d2
Parents: c19ec87
Author: Mehul Parikh <mehul.parikh@freestoneinfotech.com>
Authored: Fri Jan 20 19:40:34 2017 +0530
Committer: Velmurugan Periasamy <vel@apache.org>
Committed: Fri Jan 20 20:25:38 2017 -0500

----------------------------------------------------------------------
 .../ranger/server/tomcat/EmbeddedServer.java    |   1 +
 .../org/apache/ranger/common/StringUtil.java    |   4 +-
 .../src/main/webapp/scripts/models/VXGroup.js   |   7 +-
 .../main/webapp/scripts/models/VXPortalUser.js  |  29 ++---
 .../main/webapp/scripts/modules/XAOverrides.js  | 107 ++++++++++++++++++-
 .../scripts/modules/globalize/message/en.js     |  32 +++---
 .../main/webapp/scripts/prelogin/XAPrelogin.js  |   2 +-
 .../src/main/webapp/scripts/utils/XAUtils.js    |  14 +++
 .../scripts/views/policies/PermissionList.js    |   3 +-
 .../scripts/views/user/UserProfileForm.js       |   4 +-
 .../webapp/scripts/views/users/GroupCreate.js   |   1 +
 .../webapp/scripts/views/users/UserCreate.js    |   3 +-
 .../main/webapp/scripts/views/users/UserForm.js |  61 ++++++-----
 .../scripts/views/users/UserTableLayout.js      |   4 +-
 security-admin/src/main/webapp/styles/xa.css    |  14 ++-
 15 files changed, 220 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/EmbeddedServer.java
----------------------------------------------------------------------
diff --git a/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/EmbeddedServer.java
b/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/EmbeddedServer.java
index 7ebba8a..e334026 100644
--- a/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/EmbeddedServer.java
+++ b/embeddedwebserver/src/main/java/org/apache/ranger/server/tomcat/EmbeddedServer.java
@@ -440,6 +440,7 @@ public class EmbeddedServer {
 		server.getConnector().setMaxPostSize(getIntConfig("ranger.service.http.connector.attrib.maxPostSize",
2097152));
 		server.getConnector().setMaxSavePostSize(getIntConfig("ranger.service.http.connector.attrib.maxSavePostSize",
4096));
 		server.getConnector().setParseBodyMethods(getConfig("ranger.service.http.connector.attrib.methods",
"POST"));
+		server.getConnector().setURIEncoding(getConfig("ranger.service.http.connector.attrib.URIEncoding",
"UTF-8"));
 		Iterator<Object> iterator=serverConfigProperties.keySet().iterator();
 		String key=null;
 		String property=null;

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/security-admin/src/main/java/org/apache/ranger/common/StringUtil.java
----------------------------------------------------------------------
diff --git a/security-admin/src/main/java/org/apache/ranger/common/StringUtil.java b/security-admin/src/main/java/org/apache/ranger/common/StringUtil.java
index a46858d..cd99588 100644
--- a/security-admin/src/main/java/org/apache/ranger/common/StringUtil.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/StringUtil.java
@@ -34,9 +34,9 @@ public class StringUtil implements Serializable {
 
 	static final public int MIN_PASSWORD_LENGTH = 8;
 
-	static final public String VALIDATION_NAME = "[\\w\\ \\-\\'\\.]*";
+	static final public String VALIDATION_NAME = "^([A-Za-z0-9]|[\u00C0-\u017F])([a-zA-Z0-9\\s_.
-]|[\u00C0-\u017F])+$";
 	static final public String VALIDATION_TEXT = "[a-zA-Z0-9\\ \"!@#$%^&amp;*()-_=+;:'&quot;|~`&lt;&gt;?/{}\\.\\,\\-\\?<>]*";
-	static final public String VALIDATION_LOGINID = "[a-z,A-Z][\\w\\-\\_]*[a-z,A-Z,0-9]";
+	static final public String VALIDATION_LOGINID = "^([A-Za-z0-9]|[\u00C0-\u017F])([a-z0-9,._\\-+/@=
]|[\u00C0-\u017F])+$";
 
 	static final public String VALIDATION_ALPHA = "[a-z,A-Z]*";
 	static final public String VALIDATION_IP_ADDRESS = "[\\d\\.\\%\\:]*";

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/security-admin/src/main/webapp/scripts/models/VXGroup.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/models/VXGroup.js b/security-admin/src/main/webapp/scripts/models/VXGroup.js
index a399de2..d6725a1 100644
--- a/security-admin/src/main/webapp/scripts/models/VXGroup.js
+++ b/security-admin/src/main/webapp/scripts/models/VXGroup.js
@@ -67,10 +67,11 @@ define(function(require){
 			
 			return _.extend(attrs,{
 				name : {
-					type		: 'Text',
+					type		: 'TextFiledWithIcon',
 					title		: localization.tt("lbl.groupName") +' *',
-					validators  : ['required',{type:'regexp',regexp:/^[a-zA-Z][a-zA-Z0-9_'&-]*[A-Za-z0-9]$/i,message
:'Name must start with alphabet and must end with alphabet or number and must have atleast
two chars.Allowed special characters _ ,\' ,& ,-'}],
-                                        editorAttrs 	:{ 'maxlength': 255},
+					validators  : ['required',{type:'regexp',regexp:/^([A-Za-z0-9]|[\u00C0-\u017F])([a-z0-9,._\-+/@=
]|[\u00C0-\u017F])+$/i,message :' Invalid group name'}],
+                    editorAttrs : { 'maxlength': 255},
+                    errorMsg    : localization.tt('validationMessages.groupNameValidationMsg'),
 				},
 				description : {
 					type		: 'TextArea',

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/security-admin/src/main/webapp/scripts/models/VXPortalUser.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/models/VXPortalUser.js b/security-admin/src/main/webapp/scripts/models/VXPortalUser.js
index b031974..b0fe69f 100644
--- a/security-admin/src/main/webapp/scripts/models/VXPortalUser.js
+++ b/security-admin/src/main/webapp/scripts/models/VXPortalUser.js
@@ -47,17 +47,19 @@ define(function(require){
 			// Overwrite your schema definition here
 			return _.extend(attrs,{
 				firstName : {
-					type		: 'Text',
+					type		: 'TextFiledWithIcon',
 					title		: localization.tt("lbl.firstName")+' *',
-					validators  : ['required',{type:'regexp',regexp:/^[a-zA-Z][a-zA-Z0-9\s_.-]*[a-zA-Z0-9]+$/,message
:'First name should start with alphabets & can have number,underscore, hyphen, space,
dot.'}],
-					editorAttrs : { 'placeholder' : localization.tt("lbl.firstName")}
+					validators  : ['required',{type:'regexp',regexp:/^([a-zA-Z0-9]|[\u00C0-\u017F])([a-zA-Z0-9\s_.
-]|[\u00C0-\u017F])+$/i,message :'Invalid first name.'}],
+					editorAttrs : { 'placeholder' : localization.tt("lbl.firstName")},
+					errorMsg    :localization.tt('validationMessages.firstNameValidationMsg'),
 					
 				},
 				lastName : {
-					type		: 'Text',
+					type		: 'TextFiledWithIcon',
 					title		: localization.tt("lbl.lastName"),
-					validators  : ['required',{type:'regexp',regexp:/^[a-zA-Z][a-zA-Z0-9\s_.-]*[a-zA-Z0-9]+$/,message
:'Last name should start with alphabets & can have number,underscore, hyphen, space, dot.'}],
-					editorAttrs : { 'placeholder' : localization.tt("lbl.lastName")}
+					validators  : ['required',{type:'regexp',regexp:/^([a-zA-Z0-9]|[\u00C0-\u017F])([a-zA-Z0-9\s_.
-]|[\u00C0-\u017F])+$/i,message :'Invalid last name.'}],
+					editorAttrs : { 'placeholder' : localization.tt("lbl.lastName")},
+					errorMsg    :localization.tt('validationMessages.lastNameValidationMsg'),
 				},
 				emailAddress : {
 					type		: 'Text',
@@ -67,27 +69,30 @@ define(function(require){
 					
 				},
 				oldPassword : {
-					type		: 'Password',
+					type		: 'PasswordFiled',
 					title		: localization.tt("lbl.oldPassword")+' *',
 				//	validators  : ['required'],
 					fieldAttrs : {style : 'display:none;'},
-					editorAttrs : { 'placeholder' : localization.tt("lbl.oldPassword"),'oncopy':'return
false;','autocomplete':'off'}
+					editorAttrs : { 'placeholder' : localization.tt("lbl.oldPassword"),'oncopy':'return
false;','autocomplete':'off'},
+					errorMsg    : localization.tt('validationMessages.passwordError')
 					
 				},
 				newPassword : {
-					type		: 'Password',
+					type		: 'PasswordFiled',
 					title		: localization.tt("lbl.newPassword")+' *',
 				//	validators  : ['required'],
 					fieldAttrs : {style : 'display:none;'},
-					editorAttrs : { 'placeholder' : localization.tt("lbl.newPassword"),'oncopy':'return
false;','autocomplete':'off'}
+					editorAttrs : { 'placeholder' : localization.tt("lbl.newPassword"),'oncopy':'return
false;','autocomplete':'off'},
+					errorMsg    : localization.tt('validationMessages.passwordError')
 					
 				},
 				reEnterPassword : {
-					type		: 'Password',
+					type		: 'PasswordFiled',
 					title		: localization.tt("lbl.reEnterPassword")+' *',
 				//	validators  : ['required'],
 					fieldAttrs : {style : 'display:none;'},
-					editorAttrs : { 'placeholder' : localization.tt("lbl.reEnterPassword"),'oncopy':'return
false;','autocomplete':'off'}
+					editorAttrs : { 'placeholder' : localization.tt("lbl.reEnterPassword"),'oncopy':'return
false;','autocomplete':'off'},
+					errorMsg    : localization.tt('validationMessages.passwordError')
 					
 				},
 				userRoleList : {

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/security-admin/src/main/webapp/scripts/modules/XAOverrides.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/modules/XAOverrides.js b/security-admin/src/main/webapp/scripts/modules/XAOverrides.js
index b23318e..9774e3f 100644
--- a/security-admin/src/main/webapp/scripts/modules/XAOverrides.js
+++ b/security-admin/src/main/webapp/scripts/modules/XAOverrides.js
@@ -22,6 +22,7 @@
 	var App 			= require('App');
 	var vBreadCrumbs 	= require('views/common/BreadCrumbs');
 	var XAEnums			= require('utils/XAEnums');
+	var XAUtil			= require('utils/XAUtils');
 	
 	require('backgrid');
 	require('jquery-toggles');
@@ -283,7 +284,7 @@
 	   *
 	   */
 	  Form.editors.Switch = Form.editors.Base.extend({
-			ui : {
+	    	ui : {
 				
 			},
 			  events: {
@@ -353,7 +354,109 @@
 			    this.$el.blur();
 			  }
 			
-			});
+		});
+	  
+	  //costume text filed
+	  
+	    Form.editors.TextFiledWithIcon = Form.editors.Base.extend({
+
+	  	      tagName: 'span',
+	  
+	  		  defaultValue: '',
+	  
+	  		  previousValue: '',
+	  
+	  		  events: {
+	  			  'keyup':    'determineChanges',
+	  		      'keypress': function(event) {
+	  		    	  var self = this;
+	  		    	  setTimeout(function() {
+	  		    		  self.determineChanges();
+	  		    	  }, 0);
+	  		      },
+	  		      'select [data-id="textFiledInput"]': "select",
+	  		      'focus [data-id="textFiledInput"]': "focus",
+	  		      'blur [data-id="textFiledInput"]':   "blur"
+	  	        
+	  		  },
+	  
+	  	   
+	  		 
+	  		   
+	  		 initialize: function(options) {
+		  		  Form.editors.Base.prototype.initialize.call(this, options);
+		  	      this.template = _.template('<input type="text" class="textFiledInputPadding
" data-id="textFiledInput"><span><i class="icon-info-sign customTextFiledIcon"
data-id="infoTextFiled"></i></span>');
+		          var schema = this.schema;
+		  		//Allow customising text type (email, phone etc.) for HTML5 browsers
+		  		  var type = 'text';
+		          if (schema && schema.editorAttrs && schema.editorAttrs.type)
type = schema.editorAttrs.type;
+		  		  if (schema && schema.dataType) type = schema.dataType;
+		          this.$el.attr('type', type);
+		  		  this.$el.html( this.template );
+	  		  },
+
+	  		 /**
+	  		 * Adds the editor to the DOM
+	  	     */
+	  		  render: function() {
+	  			  if(this.schema.editorAttrs){
+	  				  this.$el.find('input').attr(this.schema.editorAttrs);
+	  		      }
+	  			  this.setValue(this.value);
+	  		      XAUtil.errorsInfoPopover(this.$el.find('[data-id="infoTextFiled"]'),this.schema.errorMsg);
+	  
+	  		      return this;
+	  		   },
+	  	  	  determineChanges: function(event) {
+	  		     var currentValue = this.$el.find('input').val();
+	  		     var changed = (currentValue !== this.previousValue);
+	  	  		 if (changed) {
+	  		         this.previousValue = currentValue;
+	  	  		     this.trigger('change', this);
+	  		      }
+	  	  	  },
+	  	  	  
+	  		   /**
+	  		   * Returns the current editor value
+	  		   * @return {String}
+	  		   */
+	  		  getValue: function() {
+	  		     return this.$el.find('input').val();
+	  	       },
+	  
+	  		   /**
+	  	       * Sets the value of the form element
+	  		   * @param {String}
+	  		   */
+	  		  setValue: function(value) {
+	  		    this.$el.find('input').val(value);
+	  		   },
+	          focus: function() {
+	        	  if (this.hasFocus) return;
+              },
+	          blur: function() {
+	        	  var trimmedVal = $.trim(this.$el.find('input').val());
+	        	  this.$el.find('input').val(trimmedVal);
+	  	      },
+	          select: function() {
+	  	         this.$el.find('input').select();
+	  		   }
+	  
+	  	});
+	  	 
+	  	 
+	  /**
+	    * Password editor
+	   	*/
+	  Form.editors.PasswordFiled = Form.editors.TextFiledWithIcon.extend({
+          initialize: function(options) {
+	  	        Form.editors.TextFiledWithIcon.prototype.initialize.call(this, options);
+	  	        this.$el.find('input').attr('type', 'password');
+		  	    
+	  	    },
+
+	  	});
+	  
 	  
 	  /**
 	   * #RANGER RESOURCE

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js b/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
index 3d2612b..55024d1 100644
--- a/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
+++ b/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
@@ -404,27 +404,31 @@ define(function(require) {
 				
 			},	
 			validationMessages : {
-				required 					: "* This field is required",
+				required 			   : "* This field is required",
 				onlyLetterNumberUnderscore :'* Only Alpha Numeric and underscore characters are allowed',
 				alphaNumericUnderscoreDotComma :'* Only Alpha Numeric,underscore,comma,hypen,dot and
space characters are allowed',
-				oldPasswordError :'Your password does not match. Please try again with proper password',
+				oldPasswordError       :'Your password does not match. Please try again with proper password',
 				oldPasswordRepeatError :'You can not use old password.',
-				newPasswordError :'Invalid Password.Minimum 8 characters with min one alphabet and one
numeric.',
-				emailIdError				: 'Please enter valid email address.',
-				enterValidName				: 'Please enter valid name.',
-				passwordError	            :'Invalid Password.Minimum 8 characters with min one alphabet
and one numeric.'
+				newPasswordError       :'Invalid Password. Minimum 8 characters with min one alphabet
and one numeric.',
+				emailIdError           : 'Please enter valid email address.',
+				enterValidName         : 'Please enter valid name.',
+				passwordError          :'Password should be minimum 8 characters with min one alphabet
and one numeric.',
+				userNameValidationMsg  :'1. User name should be start with alphabet/numeric/non-us characters.<br>
2. Allowed special character ._\-+/@= and space. <br>3. Name length should be greater
than one.',
+				groupNameValidationMsg :'1. Group name should be start with alphabet/numeric/non-us characters.<br>
2. Allowed special character ._\-+/@= and space. <br>3. Name length should be greater
than one.',
+				firstNameValidationMsg :'1. First name should be start with alphabet/numeric/non-us characters.<br>
2. Allowed special character ._- and space. <br>3. Name length should be greater than
one.',
+				lastNameValidationMsg  :'1. Last name should be start with alphabet/numeric/non-us characters.<br>
2. Allowed special character ._- and space. <br>3. Name length should be greater than
one.',
 			},
 			serverMsg : {
 				
 				// UserMgr
-				userMgrPassword : 'The password you\'ve provided is incorrect. Please try again with
correct password',
-				userMgrInvalidUser : 'Invalid user provided',
-				userMgrNewPassword : 'Invalid new password',
-				userMgrOldPassword : ' You can not use old password.',
-				userMgrEmailChange : 'Email address cannot be changed. Please send a request to change
using feedback',
-				userMgrInvalidEmail : 'Invalid email address',
-				userMgrWrongPassword : 'Password doesnot match. Please try again with proper password',
-				userMgrWrongUser : 'User access denied. User not found.',
+				userMgrPassword        : 'The password you\'ve provided is incorrect. Please try again
with correct password',
+				userMgrInvalidUser     : 'Invalid user provided',
+				userMgrNewPassword     : 'Invalid new password',
+				userMgrOldPassword     : ' You can not use old password.',
+				userMgrEmailChange     : 'Email address cannot be changed. Please send a request to change
using feedback',
+				userMgrInvalidEmail    : 'Invalid email address',
+				userMgrWrongPassword   : 'Password doesnot match. Please try again with proper password',
+				userMgrWrongUser       : 'User access denied. User not found.',
 				fsDefaultNameValidationError:"Please provide  fs.default.name in  format 'hdfs://hostname:portNumber'
.",
 				fsDefaultNameEmptyError:'Please provide  fs.default.name.',
 				userAlreadyExistsError : 'User already exists',

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/security-admin/src/main/webapp/scripts/prelogin/XAPrelogin.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/prelogin/XAPrelogin.js b/security-admin/src/main/webapp/scripts/prelogin/XAPrelogin.js
index c6851c2..967094c 100644
--- a/security-admin/src/main/webapp/scripts/prelogin/XAPrelogin.js
+++ b/security-admin/src/main/webapp/scripts/prelogin/XAPrelogin.js
@@ -45,7 +45,7 @@ function doLogin() {
 	}
 
 	var regexEmail = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
-	var regexPlain = /^[a-z0-9][a-z0-9,._\-'+/@= ]+$/i;
+	var regexPlain = /^([A-Za-z0-9]|[\u00C0-\u017F])([a-z0-9,._\-+/@= ]|[\u00C0-\u017F])+$/i;
 	
 	if(!regexPlain.test(userName)){
 		if(!regexEmail.test(userName)){

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/security-admin/src/main/webapp/scripts/utils/XAUtils.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/utils/XAUtils.js b/security-admin/src/main/webapp/scripts/utils/XAUtils.js
index ee401ee..c68c596 100644
--- a/security-admin/src/main/webapp/scripts/utils/XAUtils.js
+++ b/security-admin/src/main/webapp/scripts/utils/XAUtils.js
@@ -377,6 +377,20 @@ define(function(require) {
 		}
 	};
 
+	/*
+	 * icon Info
+	 */
+	XAUtils.errorsInfoPopover = function(filed, msg) {
+		filed.popover({
+			content : '<span class="popoverTextMsg" >'+msg+'</span>',
+			html    : true,
+			trigger : 'hover',
+			placement : 'right',
+			container : 'body'
+
+		 })
+	};
+	
 	/**
 	 * Bootbox wrapper for alert
 	 * 

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js b/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js
index b66b801..8b3582d 100644
--- a/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js
+++ b/security-admin/src/main/webapp/scripts/views/policies/PermissionList.js
@@ -269,7 +269,7 @@ define(function(require) {
 				source: this.perms,
 				value : this.permsIds,
 				display: function(values,srcData) {
-					if(_.isNull(values) || _.isEmpty(values)){
+					if(_.isNull(values) || _.isEmpty(values) || (_.contains(values,"-1")  &&  values.length
== 1)){
 						$(this).empty();
 						that.model.unset('accesses');
 						that.ui.addPermissionsSpan.find('i').attr('class', 'icon-plus');
@@ -278,6 +278,7 @@ define(function(require) {
 					}
 					if(_.contains(values,"-1")){
 						values = _.without(values,"-1")
+
 					}
 //			    	that.checkDirtyFieldForGroup(values);
 					

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/security-admin/src/main/webapp/scripts/views/user/UserProfileForm.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/views/user/UserProfileForm.js b/security-admin/src/main/webapp/scripts/views/user/UserProfileForm.js
index 38ee737..a385592 100644
--- a/security-admin/src/main/webapp/scripts/views/user/UserProfileForm.js
+++ b/security-admin/src/main/webapp/scripts/views/user/UserProfileForm.js
@@ -103,9 +103,9 @@ define(function(require){
 				this.fields.newPassword.$el.show();
 				this.fields.reEnterPassword.$el.show();
 				this.fields.oldPassword.editor.validators = ['required'];
-				this.fields.newPassword.editor.validators = ['required',{type : 'regexp' ,regexp :/^.*(?=.{8,256})(?=.*\d)(?=.*[a-zA-Z]).*$/,
message : localization.tt('validationMessages.newPasswordError')}];
+				this.fields.newPassword.editor.validators = ['required',{type : 'regexp' ,regexp :/^.*(?=.{8,256})(?=.*\d)(?=.*[a-zA-Z]).*$/,
message : ' Invalid password '}];
 				this.fields.reEnterPassword.editor.validators = ['required',
-				                                                 {type : 'regexp' ,regexp :/^.*(?=.{8,256})(?=.*\d)(?=.*[a-zA-Z]).*$/,
message : localization.tt('validationMessages.newPasswordError')},
+				                                                 {type : 'regexp' ,regexp :/^.*(?=.{8,256})(?=.*\d)(?=.*[a-zA-Z]).*$/,
message : ' Invalid password '},
 				                                                 { type: 'match', field: 'newPassword',
message: 'Passwords must match!' }];
 			}
 		},

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/security-admin/src/main/webapp/scripts/views/users/GroupCreate.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/views/users/GroupCreate.js b/security-admin/src/main/webapp/scripts/views/users/GroupCreate.js
index 41678ab..a11dc47 100644
--- a/security-admin/src/main/webapp/scripts/views/users/GroupCreate.js
+++ b/security-admin/src/main/webapp/scripts/views/users/GroupCreate.js
@@ -84,6 +84,7 @@ define(function(require){
 
 		/** on render callback */
 		onRender: function() {
+			var that = this
 			this.initializePlugins();
 			this.form = new GroupForm({
 				template : require('hbs!tmpl/users/GroupForm_tmpl'),

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/security-admin/src/main/webapp/scripts/views/users/UserCreate.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/views/users/UserCreate.js b/security-admin/src/main/webapp/scripts/views/users/UserCreate.js
index b0fc105..a0af92d 100644
--- a/security-admin/src/main/webapp/scripts/views/users/UserCreate.js
+++ b/security-admin/src/main/webapp/scripts/views/users/UserCreate.js
@@ -100,7 +100,7 @@ define(function(require){
 			this.renderForm();
 			this.rForm.$el.dirtyFields();
 			XAUtil.preventNavigation(localization.tt('dialogMsg.preventNavUserForm'),this.rForm.$el);
-		},
+			},
 		/** all post render plugin initialization */
 		initializePlugins: function(){
 		},
@@ -131,6 +131,7 @@ define(function(require){
 			this.form.fields.passwordConfirm.setValue('');
 		},
 		onSave: function(){
+			var self= this;
 			var errors = this.form.commit({validate : false});
 			if(! _.isEmpty(errors)){
 				if(this.showBasicFields)

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/security-admin/src/main/webapp/scripts/views/users/UserForm.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/views/users/UserForm.js b/security-admin/src/main/webapp/scripts/views/users/UserForm.js
index adf2f8b..9422c7e 100644
--- a/security-admin/src/main/webapp/scripts/views/users/UserForm.js
+++ b/security-admin/src/main/webapp/scripts/views/users/UserForm.js
@@ -32,12 +32,13 @@ define(function(require){
 	
 	require('backbone-forms');
 	require('backbone-forms.templates');
+	require('bootbox');
 	var UserForm = Backbone.Form.extend(
 	/** @lends UserForm */
 	{
 		_viewName : 'UserForm',
-
-    	/**
+         
+		/**
 		* intialize a new UserForm Form View 
 		* @constructs
 		*/
@@ -55,40 +56,49 @@ define(function(require){
 				//this.userRoleListChange(form, fieldEditor);
     		});
 		},
-		/** fields for the form
+		
+	    /** fields for the form
 		*/
 		fields: ['name', 'description'],
 		schema :function(){
 			return{
 				name : {
-					type		: 'Text',
+					type		: 'TextFiledWithIcon',
 					title		: localization.tt("lbl.userName") +' *',
-					validators  : ['required',{type:'regexp',regexp:/^[a-z0-9][a-z0-9,._\-'+/@= ]+$/i,message
:"Name should start with alpha/numeric letters and can have special characters ,.+_'-/@= and
space"}],
-					editorAttrs :{'maxlength': 255}
+					validators  : ['required',{type:'regexp',regexp:/^([A-Za-z0-9]|[\u00C0-\u017F])([a-z0-9,._\-+/@=
]|[\u00C0-\u017F])+$/i, 
+						            message :' Invalid user name'}],
+					editorAttrs : {'maxlength': 255},
+			        errorMsg    :localization.tt('validationMessages.userNameValidationMsg')
 				},
 				password : {
-					type		: 'Password',
+					type		: 'PasswordFiled',
 					title		: localization.tt("lbl.newPassword") +' *',
-					validators  : ['required', {type: 'match', field: 'passwordConfirm', message: 'Passwords
must match!'},
-					               {type:'regexp',regexp:/^.*(?=.{8,256})(?=.*\d)(?=.*[a-zA-Z]).*$/,message
:localization.tt('validationMessages.passwordError')}],
-					editorAttrs  : {'oncopy':'return false;','autocomplete':'off'}               
+					validators  : ['required',
+					               {type:'regexp',regexp:/^.*(?=.{8,256})(?=.*\d)(?=.*[a-zA-Z]).*$/,message
:' Invalid password'}],
+					editorAttrs : {'oncopy':'return false;','autocomplete':'off'},
+					errorMsg    : localization.tt('validationMessages.passwordError')
 				},
 				passwordConfirm : {
-					type		: 'Password',
+					type		: 'PasswordFiled',
 					title		: localization.tt("lbl.passwordConfirm") +' *',
-					validators  : ['required',
-					               {type:'regexp',regexp:/^.*(?=.{8,256})(?=.*\d)(?=.*[a-zA-Z]).*$/,message
:localization.tt('validationMessages.passwordError')}],
-					editorAttrs  : {'oncopy':'return false;','autocomplete':'off'}
+					validators  : ['required',{type: 'match', field: 'password', message: 'Passwords must
match !'},
+					               {type:'regexp',regexp:/^.*(?=.{8,256})(?=.*\d)(?=.*[a-zA-Z]).*$/,message
:' Invalid password'}],
+					editorAttrs : {'oncopy':'return false;','autocomplete':'off'},
+					errorMsg    : localization.tt('validationMessages.passwordError')
 				},
 				firstName : { 
-					type		: 'Text',
+					type		: 'TextFiledWithIcon',
 					title		: localization.tt("lbl.firstName")+' *',
-					validators  : ['required',{type:'regexp',regexp:/^[a-zA-Z][a-zA-Z0-9\s_.-]*[a-zA-Z0-9]+$/,message
:'First name should start with alphabets & can have number,underscore, hyphen, space,
dot.'}]
+					validators  : ['required',{type:'regexp',regexp:/^([A-Za-z0-9]|[\u00C0-\u017F])([a-zA-Z0-9\s_.
-]|[\u00C0-\u017F])+$/i, 
+						            message :' Invalid first name'}],
+					errorMsg    :localization.tt('validationMessages.firstNameValidationMsg'),
 				},
 				lastName : { 
-					type		: 'Text',
+					type		: 'TextFiledWithIcon',
 					title		: localization.tt("lbl.lastName"),
-					validators  : [{type:'regexp',regexp:/^[a-zA-Z][a-zA-Z0-9\s_.-]*[a-zA-Z0-9]+$/,message
:'Last name should start with alphabets & can have number,underscore, hyphen, space, dot.'}]
+					validators  : [{type:'regexp',regexp:/^([A-Za-z0-9]|[\u00C0-\u017F])([a-zA-Z0-9\s_.
-]|[\u00C0-\u017F])+$/i, 
+						            message :' Invalid last name'}],
+					errorMsg    :localization.tt('validationMessages.lastNameValidationMsg'),
 				},
 				emailAddress : {
 					type		: 'Text',
@@ -108,6 +118,7 @@ define(function(require){
 						});
 						var nvPairs = XAUtils.enumToSelectPairs(userTypes);
 						callback(nvPairs);
+						editor.$el.val("0");
 					},
 					title : localization.tt('lbl.selectRole')+' *'
 				}
@@ -121,7 +132,7 @@ define(function(require){
 			this.initializePlugins();
 			this.showCustomFields();
 			if(!that.model.isNew()){
-				this.fields.name.editor.$el.attr('disabled',true);
+				this.fields.name.editor.$el.find('input').attr('disabled',true);
 				if(this.model.has('userRoleList')){
 					var roleList = this.model.get('userRoleList');
 					if(!_.isUndefined(roleList) && roleList.length > 0){
@@ -135,13 +146,13 @@ define(function(require){
 					}
 				}
 				if(!_.isUndefined(this.model.get('userSource')) && this.model.get('userSource')
== XAEnums.UserSource.XA_USER.value){
-					this.fields.password.editor.$el.attr('disabled',true);
-					this.fields.passwordConfirm.editor.$el.attr('disabled',true);
-					this.fields.firstName.editor.$el.attr('disabled',true);
-					this.fields.lastName.editor.$el.attr('disabled',true);
+					this.fields.password.editor.$el.find('input').attr('disabled',true);
+					this.fields.passwordConfirm.editor.$el.find('input').attr('disabled',true);
+					this.fields.firstName.editor.$el.find('input').attr('disabled',true);
+					this.fields.lastName.editor.$el.find('input').attr('disabled',true);
 					this.fields.emailAddress.editor.$el.attr('disabled',true);
 					this.fields.userRoleList.editor.$el.attr('disabled',true);
-					
+					return
 				}
 				
 				if(SessionMgr.getUserProfile().get('loginId') != "admin"){
@@ -164,7 +175,7 @@ define(function(require){
 				if(this.model.get('name') == SessionMgr.getUserProfile().get('loginId')){
 					this.fields.userRoleList.editor.$el.attr('disabled',true);
 				}
-			}			
+			}	
 		},
 		renderCustomFields: function(){
 			var that = this;

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/security-admin/src/main/webapp/scripts/views/users/UserTableLayout.js
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/scripts/views/users/UserTableLayout.js b/security-admin/src/main/webapp/scripts/views/users/UserTableLayout.js
index 5b6faa7..da39d39 100644
--- a/security-admin/src/main/webapp/scripts/views/users/UserTableLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/users/UserTableLayout.js
@@ -456,8 +456,8 @@ define(function(require){
 			var selArr = [];
 			var message = '';
 			_.each(collection.selected,function(obj){
-				selArr.push(_.escape(obj.get('name')));
-			});
+				 selArr.push(_.escape(obj.get('name')));
+            });
 			var  vXStrings = [];
 			var jsonUsers  = {};
 			for(var i in selArr) {

http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/823f51fe/security-admin/src/main/webapp/styles/xa.css
----------------------------------------------------------------------
diff --git a/security-admin/src/main/webapp/styles/xa.css b/security-admin/src/main/webapp/styles/xa.css
index e2abab9..84a04d8 100644
--- a/security-admin/src/main/webapp/styles/xa.css
+++ b/security-admin/src/main/webapp/styles/xa.css
@@ -2088,7 +2088,19 @@ td.subgrid-custom-cell{
 .selected-widget .remove{
     cursor:pointer;
 }
-.uploadSet {
+.customTextFiledIcon{
+	color: #808080;
+    font-size: small;
+    margin-left: -17px;
+    margin-right:5px;
+}
+.textFiledInputPadding{
+	padding-right: 20px !important;
+    width: 192px !important;
+}
+.popoverTextMsg{
+	font-size:11px;
+}.uploadSet {
 	margin-top: 20px;
 }
 .margin-left130{


Mime
View raw message