CLOUDSTACK-3170: Support editing ACL rule items

This commit is contained in:
Brian Federle 2013-06-26 12:07:52 -07:00
parent aeab881e00
commit 7e96bf5f19
3 changed files with 204 additions and 92 deletions

View File

@ -236,7 +236,7 @@
response: { response: {
success: function(args) { success: function(args) {
$(args.data).each(function() { $(args.data).each(function() {
var id = this.id; var id = this.id ? this.id : this.name;
var description = this.description; var description = this.description;
if (args.descriptionField) if (args.descriptionField)
@ -272,7 +272,7 @@
.appendTo($value); .appendTo($value);
// Pass form item to provider for additional manipulation // Pass form item to provider for additional manipulation
$.extend(selectArgs, { $select: $input }); $.extend(selectArgs, { $select: $input, $form: $form, type: 'createForm' });
if (dependsOn) { if (dependsOn) {
$dependsOn = $input.closest('form').find('input, select').filter(function() { $dependsOn = $input.closest('form').find('input, select').filter(function() {

View File

@ -336,8 +336,7 @@
}, },
error: function(args) { error: function(args) {
error(args); error(args);
$loading.remove(); $multi.trigger('refresh');
$dataItem.show();
return cloudStack.dialog.error; return cloudStack.dialog.error;
} }
@ -402,6 +401,8 @@
var editableFields = {}; var editableFields = {};
$.each(fields, function(key, field) { $.each(fields, function(key, field) {
field.isDisabled = false;
if (field && field.isEditable) editableFields[key] = $.extend(true, {}, field, { if (field && field.isEditable) editableFields[key] = $.extend(true, {}, field, {
defaultValue: data[key] defaultValue: data[key]
}); });

View File

@ -60,13 +60,15 @@
'number':{ 'number':{
label:'Rule Number', label:'Rule Number',
edit:true edit:true,
isEditable: true
}, },
'cidrlist': { edit: true, label: 'label.cidr' }, 'cidrlist': { edit: true, label: 'label.cidr', isEditable: true },
action: { action: {
label: 'Action', label: 'Action',
isEditable: true,
select: function(args) { select: function(args) {
args.response.success({ args.response.success({
data: [ data: [
@ -78,62 +80,124 @@
}, },
'protocol': { 'protocol': {
label: 'label.protocol', label: 'label.protocol',
isEditable: true,
select: function(args) { select: function(args) {
var isEditDialog = args.type === 'createForm';
args.$select.change(function() { args.$select.change(function() {
var $inputs = args.$form.find('input'); var $inputs, $icmpFields, $otherFields, $portFields, $protocolFields, $protocolinput;
var $icmpFields = $inputs.filter(function() {
var name = $(this).attr('name');
return $.inArray(name, [ //
'icmptype', // Editing existing rules in createForm dialog
'icmpcode' //
]) > -1; if (isEditDialog) {
}); $inputs = args.$form.find('.form-item');
var $otherFields = $inputs.filter(function() { $icmpFields = $inputs.filter(function() {
var name = $(this).attr('name'); var name = $(this).attr('rel');
return name != 'protocolnumber' && return $.inArray(name, [
name != 'icmptype' && 'icmptype',
name != 'icmpcode' && 'icmpcode'
name != 'cidrlist'; ]) > -1;
}); });
var $portFields = $inputs.filter(function() { $otherFields = $inputs.filter(function() {
var name = $(this).attr('name'); var name = $(this).attr('rel');
return $.inArray(name, [
'startport',
'endport'
]) > -1;
});
var $protocolinput = args.$form.find('td input'); return name != 'protocolnumber' &&
var $protocolFields = $protocolinput.filter(function(){ name != 'icmptype' &&
var name = $(this).attr('name'); name != 'icmpcode' &&
name != 'cidrlist';
});
$portFields = $inputs.filter(function() {
var name = $(this).attr('rel');
return $.inArray(name, [
'startport',
'endport'
]) > -1;
});
$protocolFields = $inputs.filter(function(){
var name = $(this).attr('rel');
return $.inArray(name,['protocolnumber']) > -1; return $.inArray(name,['protocolnumber']) > -1;
}); });
if ($(this).val() == 'protocolnumber' ){ if ($(this).val() == 'protocolnumber' ){
$icmpFields.hide(); $icmpFields.hide();
$otherFields.hide(); $portFields.show();
$protocolFields.show().addClass('required'); $protocolFields.show();
} else if ($(this).val() == 'icmp') { } else if ($(this).val() == 'icmp') {
$icmpFields.show(); $icmpFields.show();
$icmpFields.attr('disabled', false); $protocolFields.hide();
$protocolFields.hide().removeClass('required');
$otherFields.attr('disabled', 'disabled');
$otherFields.hide();
$otherFields.parent().find('label.error').hide();
} else {
$otherFields.show();
$otherFields.parent().find('label.error').hide();
$otherFields.attr('disabled', false);
$icmpFields.attr('disabled', 'disabled');
$icmpFields.hide();
$icmpFields.parent().find('label.error').hide();
$protocolFields.hide().removeClass('required');
if ($(this).val() == 'all'){
$portFields.attr('disabled', 'disabled');
$portFields.hide(); $portFields.hide();
} else {
$otherFields.show();
$icmpFields.hide();
$protocolFields.hide();
if ($(this).val() == 'all') {
$portFields.hide();
}
}
} else {
//
// Add new form
//
$inputs = args.$form.find('input');
$icmpFields = $inputs.filter(function() {
var name = $(this).attr('name');
return $.inArray(name, [
'icmptype',
'icmpcode'
]) > -1;
});
$otherFields = $inputs.filter(function() {
var name = $(this).attr('name');
return name != 'protocolnumber' &&
name != 'icmptype' &&
name != 'icmpcode' &&
name != 'cidrlist' &&
name != 'number';
});
$portFields = $inputs.filter(function() {
var name = $(this).attr('name');
return $.inArray(name, [
'startport',
'endport'
]) > -1;
});
$protocolinput = args.$form.find('td input');
$protocolFields = $protocolinput.filter(function(){
var name = $(this).attr('name');
return $.inArray(name,['protocolnumber']) > -1;
});
if ($(this).val() == 'protocolnumber' ){
$icmpFields.hide();
$otherFields.hide();
$protocolFields.show().addClass('required');
} else if ($(this).val() == 'icmp') {
$icmpFields.show();
$icmpFields.attr('disabled', false);
$protocolFields.hide().removeClass('required');
$otherFields.attr('disabled', 'disabled');
$otherFields.hide();
$otherFields.parent().find('label.error').hide();
} else {
$otherFields.show();
$otherFields.parent().find('label.error').hide();
$otherFields.attr('disabled', false);
$icmpFields.attr('disabled', 'disabled');
$icmpFields.hide();
$icmpFields.parent().find('label.error').hide();
$protocolFields.hide().removeClass('required');
if ($(this).val() == 'all'){
$portFields.attr('disabled', 'disabled');
$portFields.hide();
}
} }
} }
}); });
@ -153,9 +217,9 @@
} }
}, },
'protocolnumber': {label:'Protocol Number',edit:true}, 'protocolnumber': {label:'Protocol Number',edit:true, isEditable: true},
'startport': { edit: true, label: 'label.start.port', isOptional: true }, 'startport': { edit: true, label: 'label.start.port', isOptional: true, isEditable: true },
'endport': { edit: true, label: 'label.end.port', isOptional: true }, 'endport': { edit: true, label: 'label.end.port', isOptional: true, isEditable: true },
'networkid': { 'networkid': {
label: 'Select Tier', label: 'Select Tier',
select: function(args) { select: function(args) {
@ -192,10 +256,11 @@
}); });
} }
}, },
'icmptype': { edit: true, label: 'ICMP.type', isDisabled: true, desc:'Please specify -1 if you want to allow all ICMP types', defaultValue:'-1' }, 'icmptype': { edit: true, label: 'ICMP.type', isDisabled: true, desc:'Please specify -1 if you want to allow all ICMP types', defaultValue:'-1', isEditable: true },
'icmpcode': { edit: true, label: 'ICMP.code', isDisabled: true, desc:'Please specify -1 if you want to allow all ICMP codes', defaultValue:'-1' }, 'icmpcode': { edit: true, label: 'ICMP.code', isDisabled: true, desc:'Please specify -1 if you want to allow all ICMP codes', defaultValue:'-1', isEditable: true },
'traffictype' : { 'traffictype' : {
label: 'label.traffic.type', label: 'label.traffic.type',
isEditable: true,
select: function(args) { select: function(args) {
args.response.success({ args.response.success({
data: [ data: [
@ -219,8 +284,8 @@
var $multi = args.$multi; var $multi = args.$multi;
//Support for Protocol Number between 0 to 255 //Support for Protocol Number between 0 to 255
if(args.data.protocol == 'protocolnumber'){ if(args.data.protocol == 'protocolnumber'){
$.extend(args.data,{protocol:args.data.protocolnumber}); $.extend(args.data,{protocol:args.data.protocolnumber});
delete args.data.protocolnumber; delete args.data.protocolnumber;
} }
else else
delete args.data.protocolnumber; delete args.data.protocolnumber;
@ -228,45 +293,91 @@
if((args.data.protocol == 'tcp' || args.data.protocol == 'udp') && (args.data.startport=="" || args.data.startport == undefined)){ if((args.data.protocol == 'tcp' || args.data.protocol == 'udp') && (args.data.startport=="" || args.data.startport == undefined)){
cloudStack.dialog.notice({message:_l('Start Port or End Port value should not be blank')}); cloudStack.dialog.notice({message:_l('Start Port or End Port value should not be blank')});
$(window).trigger('cloudStack.fullRefresh'); $(window).trigger('cloudStack.fullRefresh');
} }
else if((args.data.protocol == 'tcp' || args.data.protocol == 'udp') && (args.data.endport=="" || args.data.endport == undefined)){ else if((args.data.protocol == 'tcp' || args.data.protocol == 'udp') && (args.data.endport=="" || args.data.endport == undefined)){
cloudStack.dialog.notice({message:_l('Start Port or End Port value should not be blank')}); cloudStack.dialog.notice({message:_l('Start Port or End Port value should not be blank')});
$(window).trigger('cloudStack.fullRefresh'); $(window).trigger('cloudStack.fullRefresh');
} }
else{ else{
$.ajax({ $.ajax({
url: createURL('createNetworkACL'), url: createURL('createNetworkACL'),
data: $.extend(args.data, { data: $.extend(args.data, {
aclid: args.context.aclLists[0].id aclid: args.context.aclLists[0].id
}), }),
dataType: 'json', dataType: 'json',
success: function(data) { success: function(data) {
args.response.success({ args.response.success({
_custom: { _custom: {
jobId: data.createnetworkaclresponse.jobid, jobId: data.createnetworkaclresponse.jobid,
getUpdatedItem: function(json) { getUpdatedItem: function(json) {
$(window).trigger('cloudStack.fullRefresh'); $(window).trigger('cloudStack.fullRefresh');
return data; return data;
}
},
notification: {
label: 'label.add.ACL',
poll: pollAsyncJobResult
} }
}, });
notification: { },
label: 'label.add.ACL', error: function(data) {
poll: pollAsyncJobResult args.response.error(parseXMLHttpResponse(data));
} }
}); });
}, }
error: function(data) {
args.response.error(parseXMLHttpResponse(data));
}
});
}
} }
}, },
actions: { actions: {
edit: {
label: 'label.edit',
action: function(args) {
var data = {
id: args.context.multiRule[0].id,
cidrlist: args.data.cidrlist,
number: args.data.number,
protocol: args.data.protocol,
traffictype: args.data.traffictype,
action: args.data.action
};
if (data.protocol === 'tcp' || data.protocol === 'udp') {
$.extend(data, {
startport: args.data.startport,
endport: args.data.endport
});
} else if (data.protocol === 'icmp') {
$.extend(data, {
icmptype: args.data.icmptype,
icmpcode: args.data.icmpcode
});
} else if (data.protocol === 'protocolnumber') {
$.extend(data, {
protocolnumber: args.data.protocolnumber
});
}
$.ajax({
url: createURL('updateNetworkACLItem'),
data: data,
success: function(json) {
args.response.success({
_custom: { jobId: json.createnetworkaclresponse.jobid }, // API response obj name needs to be fixed
notification: {
label: 'Edit ACL rule',
poll: pollAsyncJobResult
}
});
},
error: function(error) {
args.response.error(parseXMLHttpResponse(error));
}
});
}
},
destroy: { destroy: {
label: 'label.remove.ACL', label: 'label.remove.ACL',
action: function(args) { action: function(args) {