RANGER-2177: Handle validations for duplicate configuration item during service create/edit
Signed-off-by: zhangqiang2 <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/ranger/repo Commit: http://git-wip-us.apache.org/repos/asf/ranger/commit/a2de0ebf Tree: http://git-wip-us.apache.org/repos/asf/ranger/tree/a2de0ebf Diff: http://git-wip-us.apache.org/repos/asf/ranger/diff/a2de0ebf Branch: refs/heads/ranger-1.1 Commit: a2de0ebff8dfb7d36f9e50ef027b404100be1f67 Parents: 27f56df Author: xingpeng1 <[email protected]> Authored: Fri Aug 3 15:58:24 2018 +0800 Committer: Mehul Parikh <[email protected]> Committed: Tue Sep 4 11:38:54 2018 +0530 ---------------------------------------------------------------------- .../scripts/modules/globalize/message/en.js | 3 +- .../scripts/views/service/ServiceCreate.js | 22 ++++++------ .../webapp/scripts/views/service/ServiceForm.js | 36 ++++++++++++++------ 3 files changed, 39 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ranger/blob/a2de0ebf/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 f4c3c27..99cbf55 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 @@ -437,7 +437,8 @@ define(function(require) { noUserFoundText : 'No user associate with this group.', showInitialHundredUser : 'Initially search filter is applied for first hundred users. To get more users click on ', searchForUserSync :"Search for your user sync audits...", - policyExpired :'Policy Expired' + policyExpired :'Policy Expired', + duplicateNewConfigValidationMsg :'Please make sure the new configuration has no duplicate names' }, plcHldr : { http://git-wip-us.apache.org/repos/asf/ranger/blob/a2de0ebf/security-admin/src/main/webapp/scripts/views/service/ServiceCreate.js ---------------------------------------------------------------------- diff --git a/security-admin/src/main/webapp/scripts/views/service/ServiceCreate.js b/security-admin/src/main/webapp/scripts/views/service/ServiceCreate.js index c8ecdc3..7c2c778 100644 --- a/security-admin/src/main/webapp/scripts/views/service/ServiceCreate.js +++ b/security-admin/src/main/webapp/scripts/views/service/ServiceCreate.js @@ -17,7 +17,7 @@ * under the License. */ - + /* * Repository/Service create view */ @@ -31,7 +31,7 @@ define(function(require){ var XAEnums = require('utils/XAEnums'); var XALinks = require('modules/XALinks'); var localization = require('utils/XALangSupport'); - + var ServiceForm = require('views/service/ServiceForm'); var RangerServiceDef = require('models/RangerServiceDef'); var ServiceCreateTmpl = require('hbs!tmpl/service/ServiceCreate_tmpl'); @@ -42,19 +42,19 @@ define(function(require){ _viewName : 'ServiceCreate', template: ServiceCreateTmpl, - + templateHelpers : function(){ return { editService : this.editService}; }, - + breadCrumbs :function(){ - var name = this.rangerServiceDefModel.get('name') != XAEnums.ServiceType.SERVICE_TAG.label ? 'ServiceManager' : 'TagBasedServiceManager'; + var name = this.rangerServiceDefModel.get('name') != XAEnums.ServiceType.SERVICE_TAG.label ? 'ServiceManager' : 'TagBasedServiceManager'; if(this.model.isNew()){ return [XALinks.get(name), XALinks.get('ServiceCreate')]; } else { return [XALinks.get(name), XALinks.get('ServiceEdit')]; } - }, + }, /** Layout sub regions */ regions: { @@ -132,7 +132,9 @@ define(function(require){ if(! _.isEmpty(errors)){ return; } - this.form.formValidation(); + if (!this.form.formValidation()) { + return; + } this.saveService(); }, saveService : function(){ @@ -165,7 +167,7 @@ define(function(require){ msg :'Are you sure want to delete ?', callback : function(){ XAUtil.blockUI(); - + that.model.destroy({ success: function(model, response) { XAUtil.blockUI('unblock'); @@ -182,7 +184,7 @@ define(function(require){ } } }); - + } }); }, @@ -242,7 +244,7 @@ define(function(require){ XAUtil.defaultErrorHandler(options , msResponse); } bootbox.alert("Connection Failed."); - } + } }); }, gotoResourceOrTagTab : function(){ http://git-wip-us.apache.org/repos/asf/ranger/blob/a2de0ebf/security-admin/src/main/webapp/scripts/views/service/ServiceForm.js ---------------------------------------------------------------------- diff --git a/security-admin/src/main/webapp/scripts/views/service/ServiceForm.js b/security-admin/src/main/webapp/scripts/views/service/ServiceForm.js index 079ce00..726fb5f 100644 --- a/security-admin/src/main/webapp/scripts/views/service/ServiceForm.js +++ b/security-admin/src/main/webapp/scripts/views/service/ServiceForm.js @@ -1,4 +1,4 @@ - /* +/* * 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 @@ -17,14 +17,14 @@ * under the License. */ - + define(function(require){ 'use strict'; var Backbone = require('backbone'); var XAEnums = require('utils/XAEnums'); var XAUtil = require('utils/XAUtils'); - + var localization = require('utils/XALangSupport'); var BackboneFormDataType = require('models/BackboneFormDataType'); var ConfigurationList = require('views/service/ConfigurationList') @@ -52,7 +52,7 @@ define(function(require){ serviceDetail += name+","; } }); - + return { serviceDetail : serviceDetail.slice(0,-1), serviceConfig : serviceConfig.slice(0,-1) @@ -124,7 +124,7 @@ define(function(require){ } else { this.fields.isEnabled.editor.setValue(XAEnums.ActiveStatus.STATUS_DISABLED.value); } - } + } }, evIsEnabledChange : function(form, fieldEditor){ XAUtil.checkDirtyFieldForToggle(fieldEditor.$el); @@ -143,8 +143,22 @@ define(function(require){ }, formValidation : function(){ - //return false; - return true; + var valid = true; + var config = {}; + this.extraConfigColl.each(function(obj){ + if(!_.isEmpty(obj.attributes)) { + if (!_.isUndefined(config[obj.get('name')])) { + XAUtil.alertPopup({ + msg : localization.tt('msg.duplicateNewConfigValidationMsg') + }); + valid = false; + return; + } else { + config[obj.get('name')] = obj.get('value'); + } + } + }); + return valid; }, beforeSave : function(){ @@ -165,11 +179,11 @@ define(function(require){ } }); } - this.extraConfigColl.each(function(obj){ + this.extraConfigColl.each(function(obj){ if(!_.isEmpty(obj.attributes)) config[obj.get('name')] = obj.get('value'); }); - this.model.set('configs',config); - + this.model.set('configs',config); + //Set service type this.model.set('type',this.rangerServiceDefModel.get('name')) //Set isEnabled @@ -178,7 +192,7 @@ define(function(require){ } else { this.model.set('isEnabled',false); } - + //Remove unwanted attributes from model if(!this.model.isNew()){ _.each(this.model.attributes.configs, function(value, name){
