You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by pr...@apache.org on 2021/06/07 15:14:09 UTC

[ranger] branch master updated (4738389 -> 617d8dd)

This is an automated email from the ASF dual-hosted git repository.

pradeep pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git.


    from 4738389  RANGER-3305: Service version update improvements
     new 0c7c12d  RANGER-3301: [UI] in admin audit log tables are not formatted correctly for long string value for resources.
     new 617d8dd  RANGER-3306: Allow comma in policy resource text field.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../src/main/webapp/libs/bower/tag-it/js/tag-it.js |  4 +-
 security-admin/src/main/webapp/scripts/Init.js     |  2 +-
 .../src/main/webapp/scripts/modules/XAOverrides.js | 48 ++++++++++-----
 .../src/main/webapp/scripts/utils/XAUtils.js       | 10 ++--
 .../scripts/views/policies/RangerPolicyForm.js     | 69 ++++++++++------------
 .../views/security_zone/ZoneResourceForm.js        | 41 +++++--------
 .../scripts/views/security_zone/zoneResource.js    |  8 ++-
 .../scripts/views/service/AuditFilterConfig.js     |  9 ++-
 .../views/service/ServiceAuditFilterResources.js   | 49 +++++----------
 security-admin/src/main/webapp/styles/xa.css       |  5 ++
 .../PlugableServicePolicyDeleteDiff_tmpl.html      |  2 +-
 .../reports/PlugableServicePolicyDiff_tmpl.html    |  2 +-
 12 files changed, 119 insertions(+), 130 deletions(-)

[ranger] 01/02: RANGER-3301: [UI] in admin audit log tables are not formatted correctly for long string value for resources.

Posted by pr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

pradeep pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git

commit 0c7c12d1da2162d8a605ad394359490d083c38bf
Author: Nitin Galave <ni...@apache.org>
AuthorDate: Thu Jun 3 18:10:33 2021 +0530

    RANGER-3301: [UI] in admin audit log tables are not formatted correctly for long string value for resources.
    
    Signed-off-by: pradeep <pr...@apache.org>
---
 security-admin/src/main/webapp/styles/xa.css                            | 1 +
 .../webapp/templates/reports/PlugableServicePolicyDeleteDiff_tmpl.html  | 2 +-
 .../main/webapp/templates/reports/PlugableServicePolicyDiff_tmpl.html   | 2 +-
 3 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/security-admin/src/main/webapp/styles/xa.css b/security-admin/src/main/webapp/styles/xa.css
index 9762a3b..0435174 100644
--- a/security-admin/src/main/webapp/styles/xa.css
+++ b/security-admin/src/main/webapp/styles/xa.css
@@ -1477,6 +1477,7 @@ ul.tabs > li > a {
 }
 .change-row {
   background-color: #fef7cd;
+  white-space: nowrap;
 }
 .add-text {
   background-color: #e1f2d3;
diff --git a/security-admin/src/main/webapp/templates/reports/PlugableServicePolicyDeleteDiff_tmpl.html b/security-admin/src/main/webapp/templates/reports/PlugableServicePolicyDeleteDiff_tmpl.html
index 3166402..e9131cd 100644
--- a/security-admin/src/main/webapp/templates/reports/PlugableServicePolicyDeleteDiff_tmpl.html
+++ b/security-admin/src/main/webapp/templates/reports/PlugableServicePolicyDeleteDiff_tmpl.html
@@ -26,7 +26,7 @@
 
     {{#if collection.length}}
         <h5 class="bold wrap-header m-t-sm">Policy Details:</h5>
-        <div class="diff">
+        <div class="diff table-responsive">
             <div class="diff-left">
                 <h3>Fields</h3>
                 <ol class="attr">
diff --git a/security-admin/src/main/webapp/templates/reports/PlugableServicePolicyDiff_tmpl.html b/security-admin/src/main/webapp/templates/reports/PlugableServicePolicyDiff_tmpl.html
index 5a54d62..2470059 100644
--- a/security-admin/src/main/webapp/templates/reports/PlugableServicePolicyDiff_tmpl.html
+++ b/security-admin/src/main/webapp/templates/reports/PlugableServicePolicyDiff_tmpl.html
@@ -28,7 +28,7 @@
         <div class="no-margin label-size13-weightbold">Created By: {{userName}}</div>
         {{#if collection.length}}
             <h5 class="bold wrap-header m-t-sm">Policy Details:</h5>
-            <div class="diff">
+            <div class="diff table-responsive">
                 <div class="diff-left">
                     <h3>Fields</h3>
                     <ol class="attr">

[ranger] 02/02: RANGER-3306: Allow comma in policy resource text field.

Posted by pr...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

pradeep pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git

commit 617d8dd74d1479829b7af9754b5b714059788d8e
Author: Nitin Galave <ni...@apache.org>
AuthorDate: Mon Jun 7 18:47:51 2021 +0530

    RANGER-3306: Allow comma in policy resource text field.
    
    Signed-off-by: pradeep <pr...@apache.org>
---
 .../src/main/webapp/libs/bower/tag-it/js/tag-it.js |  4 +-
 security-admin/src/main/webapp/scripts/Init.js     |  2 +-
 .../src/main/webapp/scripts/modules/XAOverrides.js | 48 ++++++++++-----
 .../src/main/webapp/scripts/utils/XAUtils.js       | 10 ++--
 .../scripts/views/policies/RangerPolicyForm.js     | 69 ++++++++++------------
 .../views/security_zone/ZoneResourceForm.js        | 41 +++++--------
 .../scripts/views/security_zone/zoneResource.js    |  8 ++-
 .../scripts/views/service/AuditFilterConfig.js     |  9 ++-
 .../views/service/ServiceAuditFilterResources.js   | 49 +++++----------
 security-admin/src/main/webapp/styles/xa.css       |  4 ++
 10 files changed, 116 insertions(+), 128 deletions(-)

diff --git a/security-admin/src/main/webapp/libs/bower/tag-it/js/tag-it.js b/security-admin/src/main/webapp/libs/bower/tag-it/js/tag-it.js
index 04e36b1..ab36e1a 100644
--- a/security-admin/src/main/webapp/libs/bower/tag-it/js/tag-it.js
+++ b/security-admin/src/main/webapp/libs/bower/tag-it/js/tag-it.js
@@ -241,7 +241,6 @@
                     // Tab will also create a tag, unless the tag input is empty,
                     // in which case it isn't caught.
                     if (
-                        (event.which === $.ui.keyCode.COMMA && event.shiftKey === false) ||
                         event.which === $.ui.keyCode.ENTER ||
                         (
                             event.which == $.ui.keyCode.TAB &&
@@ -297,7 +296,7 @@
                 this.tagInput.autocomplete(autocompleteOptions).bind('autocompleteopen.tagit', function(event, ui) {
                     that.tagInput.data('autocomplete-open', true);
                 }).bind('autocompleteclose.tagit', function(event, ui) {
-                    that.tagInput.data('autocomplete-open', false)
+                    that.tagInput.data('autocomplete-open', false);
                 });
 
                 this.tagInput.autocomplete('widget').addClass('tagit-autocomplete');
@@ -588,4 +587,3 @@
 
     });
 })(jQuery);
-
diff --git a/security-admin/src/main/webapp/scripts/Init.js b/security-admin/src/main/webapp/scripts/Init.js
index aa970be..e155fa3 100644
--- a/security-admin/src/main/webapp/scripts/Init.js
+++ b/security-admin/src/main/webapp/scripts/Init.js
@@ -132,7 +132,7 @@ require.config({
         'bootstrap-notify': '../libs/bower/bootstrap-notify/js/bootstrap-notify',
         'jquery.cookie': '../libs/other/jquery-cookie/js/jquery.cookie',
         'jquery-toggles': '../libs/bower/jquery-toggles/js/toggles.min',
-        'tag-it': '../libs/bower/tag-it/js/tag-it.min',
+        'tag-it': '../libs/bower/tag-it/js/tag-it',
         'select2': '../libs/bower/select2/select2',
         'bootbox': '../libs/bower/bootbox/js/bootbox',
         'visualsearch': '../libs/other/visualsearch/js/visualsearch',
diff --git a/security-admin/src/main/webapp/scripts/modules/XAOverrides.js b/security-admin/src/main/webapp/scripts/modules/XAOverrides.js
index 1c4e457..9237abd 100644
--- a/security-admin/src/main/webapp/scripts/modules/XAOverrides.js
+++ b/security-admin/src/main/webapp/scripts/modules/XAOverrides.js
@@ -528,25 +528,33 @@
 		  	this.renderSameLevelResource();
 		    return this;
 		  },
-                  renderResource : function(def) {
-			  var that = this;
-                          var Vent = require('modules/Vent');
-			  if(!_.isNull(this.value) && !_.isEmpty(this.value)){
-				this.value.values = _.map(this.value.values, function(val){ return _.escape(val); });
-					// Set initial value for resources.
-					if (_.isUndefined(def)) {
-						this.$resource.val(this.value.values.toString());
+			renderResource : function(def) {
+				var that = this;
+				var Vent = require('modules/Vent');
+				if(!_.isNull(this.value) && !_.isEmpty(this.value)){
+					if (!_.isUndefined(this.key) && (this.key == "path" || this.key == "relativepath")) {
+						this.value.values = this.value.values.join('||');
+						// Set initial value for resources.
+						if (_.isUndefined(def)) {
+							this.$resource.val((this.value.values));
+						}
+					} else {
+						this.value.values = _.map(this.value.values, function(val){ return  _.escape(val)});
+						// Set initial value for resources.
+						if (_.isUndefined(def)) {
+							this.$resource.val(JSON.stringify(this.value.values));
+						}
 					}
 			    	//to preserve resources values to text field
 			    	if(!_.isUndefined(this.value.resourceType)){
-			    		this.preserveResourceValues[this.value.resourceType] = this.value.values.toString();	
+			    		this.preserveResourceValues[this.value.resourceType] = this.value.values;
 			    	}else{
-			    		this.preserveResourceValues[this.name] = this.value.values.toString(); 
+			    		this.preserveResourceValues[this.name] = this.value.values;
 			    	}
 			    }
 			  	//check dirtyField for input
 			  	this.$resource.on('change', function(e) {
-			  		if(_.isUndefined(that.resourceOpts.select2Opts)){
+					if(_.isUndefined(that.resourceOpts.select2Opts)){
 //			  			that.checkDirtyFieldForSelect2($(e.currentTarget), that, this.value);
 			  		}
 			  	});
@@ -559,7 +567,11 @@
                         if(_.has(def, 'validationRegEx') && !_.isEmpty(def.validationRegEx)){
                             opts['regExpValidation'] = {'type': 'regexp', 'regexp':new RegExp(def.validationRegEx), 'message' : def.validationMessage};
                         }
-                        opts['lookupURL'] = "service/plugins/services/lookupResource/"+this.form.rangerService.get('name');
+                        if(!_.isUndefined(this.form.serviceName)) {
+                            opts['lookupURL'] = "service/plugins/services/lookupResource/"+this.form.serviceName;
+                        } else {
+                            opts['lookupURL'] = "service/plugins/services/lookupResource/"+this.form.rangerService.get('name');
+                        }
                         opts['type'] = def.name;
                         this.resourceOpts['select2Opts'] = that.form.getPlugginAttr(true, opts);
                     }else{
@@ -636,8 +648,8 @@
 			  		}
 			  		this.$resourceType.on('change', function(e,onChangeResources) {
 		  				if(!_.isUndefined(that.preserveResourceValues[e.currentTarget.value])){
-		  					var val = _.isEmpty(that.preserveResourceValues[e.currentTarget.value]) ? '' : that.preserveResourceValues[e.currentTarget.value].split(','); 
-		  					that.$resource.select2('val', val)
+							var val = _.isEmpty(that.preserveResourceValues[e.currentTarget.value]) ? '' : that.preserveResourceValues[e.currentTarget.value];
+							that.$resource.val(JSON.stringify(val))
 		  				}else{
 							that.$resource.select2('val', "");
 						}
@@ -683,13 +695,17 @@
 					});
 			  	}
 		  },
-		  getValue: function() {
+		  getValue: function(fieldName) {
 			  var that = this;
 			  //checkParent
 			  if(this.$el.parents('.form-group').hasClass('hideResource')){
 				  return null;
 			  }
-			  this.value['resource'] = this.$resource.val();
+			if (that.key == "path" || that.key == "relativepath") {
+				this.value['resource'] = this.$resource.tagit("assignedTags");
+			} else {
+				this.value['resource'] = this.$resource.select2('data');
+			}
 			  //validation
 			  
 			  
diff --git a/security-admin/src/main/webapp/scripts/utils/XAUtils.js b/security-admin/src/main/webapp/scripts/utils/XAUtils.js
index b90f885..4266876 100644
--- a/security-admin/src/main/webapp/scripts/utils/XAUtils.js
+++ b/security-admin/src/main/webapp/scripts/utils/XAUtils.js
@@ -1515,7 +1515,7 @@ define(function(require) {
                 closeOnSelect : true,
                 width :'220px',
                 allowClear: true,
-                tokenSeparators: ["," , " "],
+                tokenSeparators: [" "],
                 minimumInputLength: 1,
                 initSelection : function (element, callback) {
                     var data = [];
@@ -1525,9 +1525,11 @@ define(function(require) {
                         return;
                     }
                     //this is form multi-select value
-                    $(element.val().split(",")).each(function () {
-                        data.push({id: this, text: this});
-                    });
+                    if(_.isArray(JSON.parse(element.val()))) {
+                        $(JSON.parse(element.val())).each(function () {
+                            data.push({id: this, text: this});
+                        })
+                    }
                     callback(data);
                 },
                 createSearchChoice: function(term, data) {
diff --git a/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyForm.js b/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyForm.js
index b52579a..4f08c75 100644
--- a/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyForm.js
+++ b/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyForm.js
@@ -571,7 +571,13 @@ define(function(require){
 					//single value support
 //					if(! XAUtil.isSinglevValueInput(obj) ){
 					if(!_.isUndefined(tmpObj) && _.isObject(tmpObj) && !_.isEmpty(tmpObj.resource)){
-						rPolicyResource.set('values',tmpObj.resource.split(','));
+						rPolicyResource.set('values',_.map(tmpObj.resource, function(m) {
+							if(obj.type == "path") {
+								return m
+							} else {
+								return m.text
+							}
+						}));
 						if(!_.isUndefined(tmpObj.isRecursive)){
 							rPolicyResource.set('isRecursive', tmpObj.isRecursive)
 						}
@@ -681,25 +687,19 @@ define(function(require){
                         if(!this.model.isNew() && !_.isUndefined(this.model.get('path'))){
 				defaultValue = this.model.get('path').values;
 			}
-			function split( val ) {
-				return val.split( /,\s*/ );
-			}
-			function extractLast( term ) {
-				return split( term ).pop();
-			}
-                        var tagitOpts = {}
-                        if(!_.isUndefined(options.lookupURL) && options.lookupURL){
-                            tagitOpts["autocomplete"] = {
-                            cache: false,
+			var tagitOpts = {}
+            if(!_.isUndefined(options.lookupURL) && options.lookupURL){
+                tagitOpts["autocomplete"] = {
+                    cache: false,
                     source: function( request, response ) {
                         var url = "service/plugins/services/lookupResource/"+that.rangerService.get('name');
                         var context ={
-                            'userInput' : extractLast( request.term ),
+                            'userInput' : request.term,
                             'resourceName' : that.pathFieldName,
                             'resources' : {}
                         };
-                        var val = that.fields[that.pathFieldName].editor.getValue();
-                        context.resources[that.pathFieldName] = _.isNull(val) || _.isEmpty(val) ? [] : val.resource.split(",");
+                        var val = that.fields[that.pathFieldName].editor.getValue('pathField');
+                        context.resources[that.pathFieldName] = _.isNull(val) || _.isEmpty(val) ? [] : val.resource;
                         var p = $.ajax({
                             url : url,
                             type : "POST",
@@ -724,9 +724,9 @@ define(function(require){
                         $(this).removeClass('working');
                     },
                     search: function() {
-                        if(!_.isUndefined(this.value) && (/[ ,]+/).test(this.value)){
-                            var values = this.value.trim().split(/[ ,]+/);
-                            if (values.length > 1) {
+                     	if(!_.isUndefined(this.value) && this.value.includes('||')) {
+                     		var values = this.value.trim().split('||');
+                     		if (values.length > 1) {
                                 for (var i = 0; i < values.length; i++) {
                                     that.fields[that.pathFieldName].editor.$el.find('[data-js="resource"]').tagit("createTag", values[i]);
                                 }
@@ -734,28 +734,24 @@ define(function(require){
                             } else {
                                 return val
                             }
-                        }
-                        var term = extractLast( this.value );
-                        $(this).addClass('working');
-                        if ( term.length < 1 ) {
-                            return false;
-                        }
-                    },
-                            }
-                        }
-                        tagitOpts['beforeTagAdded'] = function(event, ui) {
+                     	}
+                    }
+                }
+            }
+            tagitOpts['beforeTagAdded'] = function(event, ui) {
                 // do something special
                 that.fields[that.pathFieldName].$el.removeClass('error');
                 that.fields[that.pathFieldName].$el.find('.help-inline').html('');
                 var tags =  [];
-                console.log(ui.tag);
                 if(!_.isUndefined(options.regExpValidation) && !options.regExpValidation.regexp.test(ui.tagLabel)){
                     that.fields[that.pathFieldName].$el.addClass('error');
                     that.fields[that.pathFieldName].$el.find('.help-inline').html(options.regExpValidation.message);
                     return false;
                 }
             }
-            this.fields[that.pathFieldName].editor.$el.find('[data-js="resource"]').tagit(tagitOpts).on('change', function(e){
+            tagitOpts['singleFieldDelimiter'] = '||';
+            tagitOpts['singleField'] = false;
+            this.fields[that.pathFieldName].editor.$el.find('input[data-js="resource"]').tagit(tagitOpts).on('change', function(e){
                 //check dirty field for tagit input type : `path`
                 XAUtil.checkDirtyField($(e.currentTarget).val(), defaultValue.toString(), $(e.currentTarget));
             });
@@ -772,18 +768,15 @@ define(function(require){
 					multiple: true,
 					minimumInputLength: 1,
 					width :'220px',
-					tokenSeparators: [",", " "],
+					tokenSeparators: [' '],
 					initSelection : function (element, callback) {
 						var data = [];
 						//to set single select value
-						if(!_.isUndefined(options.singleValueInput) && options.singleValueInput){
-							callback({ id : element.val(), text : element.val() });
-							return;
+						if(_.isArray(JSON.parse(element.val()))) {
+							$(JSON.parse(element.val())).each(function () {
+								data.push({id: this, text: this});
+							})
 						}
-						//this is form multi-select value
-						$(element.val().split(",")).each(function () {
-							data.push({id: this, text: this});
-						});
 						callback(data);
 					},
 					createSearchChoice: function(term, data) {
@@ -879,7 +872,7 @@ define(function(require){
 				}else{
 					val = this.fields[name].getValue();
 				}
-				resources[name] = _.isNull(val) ? [] : val.resource.split(','); 
+				resources[name] = _.isNull(val) ? [] : val.resource;
 				if(!_.isEmpty(currentResource.parent)){
 					name = currentResource.parent;
 				}else{
diff --git a/security-admin/src/main/webapp/scripts/views/security_zone/ZoneResourceForm.js b/security-admin/src/main/webapp/scripts/views/security_zone/ZoneResourceForm.js
index f87e7a0..1725670 100644
--- a/security-admin/src/main/webapp/scripts/views/security_zone/ZoneResourceForm.js
+++ b/security-admin/src/main/webapp/scripts/views/security_zone/ZoneResourceForm.js
@@ -240,14 +240,6 @@ define(function(require) {
                 if (!this.model.isNew() && !_.isUndefined(this.model.get('path'))) {
                     defaultValue = this.model.get('path').values;
                 }
-
-                function split(val) {
-                    return val.split(/,\s*/);
-                }
-
-                function extractLast(term) {
-                    return split(term).pop();
-                }
                 var tagitOpts = {}
                 if (!_.isUndefined(options.lookupURL) && options.lookupURL) {
                     tagitOpts["autocomplete"] = {
@@ -255,12 +247,12 @@ define(function(require) {
                         source: function(request, response) {
                             var url = "service/plugins/services/lookupResource/" + that.rangerService.get('name');
                             var context = {
-                                'userInput': extractLast(request.term),
+                                'userInput': request.term,
                                 'resourceName': that.pathFieldName,
                                 'resources': {}
                             };
-                            var val = that.fields[that.pathFieldName].editor.getValue();
-                            context.resources[that.pathFieldName] = _.isNull(val) || _.isEmpty(val) ? [] : val.resource.split(",");
+                            var val = that.fields[that.pathFieldName].editor.getValue('pathField');
+                            context.resources[that.pathFieldName] = _.isNull(val) || _.isEmpty(val) ? [] : val.resource;
                             var p = $.ajax({
                                 url: url,
                                 type: "POST",
@@ -286,8 +278,8 @@ define(function(require) {
                         },
                         search: function() {
                             $('.tagit-autocomplete').addClass('tagit-position');
-                            if (!_.isUndefined(this.value) && (/[ ,]+/).test(this.value)) {
-                                var values = this.value.trim().split(/[ ,]+/);
+                            if(!_.isUndefined(this.value) && this.value.includes('||')) {
+                                var values = this.value.trim().split('||');
                                 if (values.length > 1) {
                                     for (var i = 0; i < values.length; i++) {
                                         that.fields[that.pathFieldName].editor.$el.find('[data-js="resource"]').tagit("createTag", values[i]);
@@ -297,11 +289,6 @@ define(function(require) {
                                     return val
                                 }
                             }
-                            var term = extractLast(_.escape(this.value));
-                            $(this).addClass('working');
-                            if (term.length < 1) {
-                                return false;
-                            }
                         },
                     }
                 }
@@ -310,13 +297,14 @@ define(function(require) {
                     that.fields[that.pathFieldName].$el.removeClass('error');
                     that.fields[that.pathFieldName].$el.find('.help-inline').html('');
                     var tags = [];
-                    console.log(ui.tag);
                     if (!_.isUndefined(options.regExpValidation) && !options.regExpValidation.regexp.test(ui.tagLabel)) {
                         that.fields[that.pathFieldName].$el.addClass('error');
                         that.fields[that.pathFieldName].$el.find('.help-inline').html(options.regExpValidation.message);
                         return false;
                     }
                 }
+                tagitOpts['singleFieldDelimiter'] = '||';
+                tagitOpts['singleField'] = false;
                 this.fields[that.pathFieldName].editor.$el.find('[data-js="resource"]').tagit(tagitOpts).on('change', function(e) {
                     //check dirty field for tagit input type : `path`
                     XAUtil.checkDirtyField($(e.currentTarget).val(), defaultValue.toString(), $(e.currentTarget));
@@ -344,7 +332,7 @@ define(function(require) {
                         multiple: true,
                         minimumInputLength: 1,
                         width: '220px',
-                        tokenSeparators: [",", " "],
+                        tokenSeparators: [" "],
                         initSelection: function(element, callback) {
                             var data = [];
                             //to set single select value
@@ -356,12 +344,11 @@ define(function(require) {
                                 return;
                             }
                             //this is form multi-select value
-                            $(element.val().split(",")).each(function() {
-                                data.push({
-                                    id: this,
-                                    text: this
-                                });
-                            });
+                            if(_.isArray(JSON.parse(element.val()))) {
+                                $(JSON.parse(element.val())).each(function () {
+                                    data.push({id: this, text: this});
+                                })
+                            }
                             callback(data);
                         },
                         createSearchChoice: function(term, data) {
@@ -474,7 +461,7 @@ define(function(require) {
                     } else {
                         val = this.fields[name].getValue();
                     }
-                    resources[name] = _.isNull(val) ? [] : val.resource.split(',');
+                    resources[name] = _.isNull(val) ? [] : val.resource;
                     if (!_.isEmpty(currentResource.parent)) {
                         name = currentResource.parent;
                     } else {
diff --git a/security-admin/src/main/webapp/scripts/views/security_zone/zoneResource.js b/security-admin/src/main/webapp/scripts/views/security_zone/zoneResource.js
index 7634eab..8c19c0a 100644
--- a/security-admin/src/main/webapp/scripts/views/security_zone/zoneResource.js
+++ b/security-admin/src/main/webapp/scripts/views/security_zone/zoneResource.js
@@ -40,7 +40,7 @@ define(function(require) {
             var resources = _.map(this.model.get('resources'), function(val, key) {
                 return {
                     'key': key,
-                    'value': val
+                    'value': val.join(",  ")
                 }
             })
             return {
@@ -197,7 +197,11 @@ define(function(require) {
             _.each(that.rangerServiceDefModel.get('resources'), function(obj) {
                 var tmpObj = that.form.model.get(obj.name);
                 if (!_.isUndefined(tmpObj) && _.isObject(tmpObj) && !_.isEmpty(tmpObj.resource)) {
-                    tmpResource[obj.name] = tmpObj.resource.split(',');
+                    if (obj.type == "path") {
+                        tmpResource[obj.name] = tmpObj.resource;
+                    } else {
+                        tmpResource[obj.name] = _.map(tmpObj.resource, function(val){return val.text});
+                    }
                     that.form.model.unset(obj.name);
                 }
             });
diff --git a/security-admin/src/main/webapp/scripts/views/service/AuditFilterConfig.js b/security-admin/src/main/webapp/scripts/views/service/AuditFilterConfig.js
index 2032da1..27e2aae 100644
--- a/security-admin/src/main/webapp/scripts/views/service/AuditFilterConfig.js
+++ b/security-admin/src/main/webapp/scripts/views/service/AuditFilterConfig.js
@@ -358,8 +358,13 @@ define(function(require) {
                 var tmpObj = that.form.model.get(obj.name);
                 if (!_.isUndefined(tmpObj) && _.isObject(tmpObj) && !_.isEmpty(tmpObj.resource)) {
                     tmpResource[obj.name] ={}, resource[obj.name] ={};
-                    tmpResource[obj.name].values = tmpObj.resource.split(',');
-                    resource[obj.name].values = tmpObj.resource.split(',');
+                    if (obj.type == "path") {
+                        tmpResource[obj.name].values = tmpObj.resource;
+                        resource[obj.name].values = tmpObj.resource;
+                    } else {
+                        tmpResource[obj.name].values = _.map(tmpObj.resource, function(val){return val.text});
+                        resource[obj.name].values = _.map(tmpObj.resource, function(val){return val.text});
+                    }
                     if (obj.excludesSupported) {
                         resource[obj.name]['isExcludes'] = tmpObj.isExcludes;
                     }
diff --git a/security-admin/src/main/webapp/scripts/views/service/ServiceAuditFilterResources.js b/security-admin/src/main/webapp/scripts/views/service/ServiceAuditFilterResources.js
index c08f745..318cdcb 100644
--- a/security-admin/src/main/webapp/scripts/views/service/ServiceAuditFilterResources.js
+++ b/security-admin/src/main/webapp/scripts/views/service/ServiceAuditFilterResources.js
@@ -234,14 +234,6 @@ define(function(require) {
                 if (!this.model.isNew() && !_.isUndefined(this.model.get('path'))) {
                     defaultValue = this.model.get('path').values;
                 }
-
-                function split(val) {
-                    return val.split(/,\s*/);
-                }
-
-                function extractLast(term) {
-                    return split(term).pop();
-                }
                 var tagitOpts = {}
                 if (!_.isUndefined(options.lookupURL) && options.lookupURL) {
                     tagitOpts["autocomplete"] = {
@@ -249,12 +241,12 @@ define(function(require) {
                         source: function(request, response) {
                             var url = "service/plugins/services/lookupResource/" + that.serviceName;
                             var context = {
-                                'userInput': extractLast(request.term),
+                                'userInput': request.term,
                                 'resourceName': that.pathFieldName,
                                 'resources': {}
                             };
-                            var val = that.fields[that.pathFieldName].editor.getValue();
-                            context.resources[that.pathFieldName] = _.isNull(val) || _.isEmpty(val) ? [] : val.resource.split(",");
+                            var val = that.fields[that.pathFieldName].editor.getValue('pathField');
+                            context.resources[that.pathFieldName] = _.isNull(val) || _.isEmpty(val) ? [] : val.resource;
                             var p = $.ajax({
                                 url: url,
                                 type: "POST",
@@ -280,8 +272,8 @@ define(function(require) {
                         },
                         search: function() {
                             $('.tagit-autocomplete').addClass('tagit-position');
-                            if (!_.isUndefined(this.value) && (/[ ,]+/).test(this.value)) {
-                                var values = this.value.trim().split(/[ ,]+/);
+                            if(!_.isUndefined(this.value) && this.value.includes('||')) {
+                                var values = this.value.trim().split('||');
                                 if (values.length > 1) {
                                     for (var i = 0; i < values.length; i++) {
                                         that.fields[that.pathFieldName].editor.$el.find('[data-js="resource"]').tagit("createTag", values[i]);
@@ -291,11 +283,6 @@ define(function(require) {
                                     return val
                                 }
                             }
-                            var term = extractLast(_.escape(this.value));
-                            $(this).addClass('working');
-                            if (term.length < 1) {
-                                return false;
-                            }
                         },
                     }
                 }
@@ -304,13 +291,14 @@ define(function(require) {
                     that.fields[that.pathFieldName].$el.removeClass('error');
                     that.fields[that.pathFieldName].$el.find('.help-inline').html('');
                     var tags = [];
-                    console.log(ui.tag);
                     if (!_.isUndefined(options.regExpValidation) && !options.regExpValidation.regexp.test(ui.tagLabel)) {
                         that.fields[that.pathFieldName].$el.addClass('error');
                         that.fields[that.pathFieldName].$el.find('.help-inline').html(options.regExpValidation.message);
                         return false;
                     }
                 }
+                tagitOpts['singleFieldDelimiter'] = '||';
+                tagitOpts['singleField'] = false;
                 this.fields[that.pathFieldName].editor.$el.find('[data-js="resource"]').tagit(tagitOpts).on('change', function(e) {
                     //check dirty field for tagit input type : `path`
                     XAUtil.checkDirtyField($(e.currentTarget).val(), defaultValue.toString(), $(e.currentTarget));
@@ -338,24 +326,15 @@ define(function(require) {
                         multiple: true,
                         minimumInputLength: 1,
                         width: '220px',
-                        tokenSeparators: [",", " "],
+                        tokenSeparators: [" "],
                         initSelection: function(element, callback) {
                             var data = [];
-                            //to set single select value
-                            if (!_.isUndefined(options.singleValueInput) && options.singleValueInput) {
-                                callback({
-                                    id: element.val(),
-                                    text: element.val()
-                                });
-                                return;
-                            }
                             //this is form multi-select value
-                            $(element.val().split(",")).each(function() {
-                                data.push({
-                                    id: this,
-                                    text: this
-                                });
-                            });
+                            if(_.isArray(JSON.parse(element.val()))) {
+                                $(JSON.parse(element.val())).each(function () {
+                                    data.push({id: this, text: this});
+                                })
+                            }
                             callback(data);
                         },
                         createSearchChoice: function(term, data) {
@@ -468,7 +447,7 @@ define(function(require) {
                     } else {
                         val = this.fields[name].getValue();
                     }
-                    resources[name] = _.isNull(val) ? [] : val.resource.split(',');
+                    resources[name] = _.isNull(val) ? [] : val.resource;
                     if (!_.isEmpty(currentResource.parent)) {
                         name = currentResource.parent;
                     } else {
diff --git a/security-admin/src/main/webapp/styles/xa.css b/security-admin/src/main/webapp/styles/xa.css
index 0435174..f170d47 100644
--- a/security-admin/src/main/webapp/styles/xa.css
+++ b/security-admin/src/main/webapp/styles/xa.css
@@ -979,6 +979,10 @@ ul.tagit li.tagit-choice .tagit-close {
   border-radius: 0 !important;
 }
 
+.ui-menu.ui-widget.ui-widget-content.ui-autocomplete.ui-front.tagit-autocomplete {
+  width: 50% !important;
+}
+
 table.backgrid tr > td > .label {
   float: left;
   margin: 0 3px 2px 0;