diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css
index 519778ba59b..9b4e7638001 100644
--- a/ui/css/cloudstack3.css
+++ b/ui/css/cloudstack3.css
@@ -8391,7 +8391,6 @@ div.container div.panel div#details-tab-addloadBalancer.detail-group div.loadBal
border-right: 1px solid #CFC9C9;
height: 15px;
overflow: auto;
- padding-right: 0;
}
.multi-edit .data .data-body .data-item > table tbody tr td span {
@@ -8426,8 +8425,44 @@ div.container div.panel div#details-tab-addloadBalancer.detail-group div.loadBal
color: #0000FF;
}
-.multi-edit .data .data-body .data-item table tbody tr td.multi-actions {
- border-right: none;
+div#details-tab-aclRules table.multi-edit tr th.number,
+div#details-tab-aclRules div.data-item table tr td.number {
+ width: 45px !important;
+ min-width: 45px !important;
+ max-width: 45px !important;
+}
+
+div#details-tab-aclRules div.multi-edit table tr th.action,
+div#details-tab-aclRules div.multi-edit table tr td.action {
+ width: 40px !important;
+ min-width: 40px !important;
+ max-width: 40px !important;
+}
+
+div#details-tab-aclRules div.multi-edit table tr th.protocol,
+div#details-tab-aclRules div.multi-edit table tr td.protocol {
+ width: 50px !important;
+ min-width: 50px !important;
+ max-width: 50px !important;
+}
+
+div#details-tab-aclRules div.multi-edit table tr th.protocolnumber,
+div#details-tab-aclRules div.multi-edit table tr td.protocolnumber {
+ width: 60px !important;
+ min-width: 60px !important;
+ max-width: 60px !important;
+}
+
+div#details-tab-aclRules div.multi-edit table tr th.startport, div#details-tab-aclRules div.multi-edit table tr td.startport,
+div#details-tab-aclRules div.multi-edit table tr th.endport, div#details-tab-aclRules div.multi-edit table tr td.endport {
+ width: 70px !important;
+ min-width: 70px !important;
+ max-width: 70px !important;
+}
+
+div#details-tab-aclRules td.cidrlist span {
+ text-align: center;
+ width: 100%;
}
.multi-edit .data .data-body .data-item table tbody tr td.multi-actions .action {
@@ -8548,17 +8583,18 @@ div.container div.panel div#details-tab-addloadBalancer.detail-group div.loadBal
.detail-view .multi-edit table tr th,
.detail-view .multi-edit table tr td {
- width: 87px !important;
- min-width: 87px !important;
- max-width: 87px !important;
+ width: 84px !important;
+ min-width: 84px !important;
+ max-width: 84px !important;
font-size: 10px;
}
/* special case for 'Source CIDR' column - make it wide enough to fit a CIDR without ellipsizing*/
.detail-view .multi-edit table tr th.cidrlist,
.detail-view .multi-edit table tr td.cidrlist {
- min-width: 112px !important;
- max-width: 112px !important;
+ min-width: 118px !important;
+ max-width: 118px !important;
+ padding: 0 0 0 0;
}
.detail-view .multi-edit td.cidrlist input {
width: 85%;
@@ -8615,9 +8651,9 @@ div.container div.panel div#details-tab-addloadBalancer.detail-group div.loadBal
/*Sortable*/
.multi-edit table tbody tr td.reorder,
.multi-edit table thead tr th.reorder {
- width: 30px !important;
- min-width: 30px !important;
- max-width: 30px !important;
+ width: 16px !important;
+ min-width: 16px !important;
+ max-width: 16px !important;
}
/*Security Rules*/
@@ -13037,7 +13073,7 @@ div.ui-dialog div.autoscaler div.field-group div.form-container form div.form-it
-khtml-border-radius: 10px;
border-radius: 10px;
border-radius: 10px 10px 10px 10px;
- background-position: -74px -162px;
+ background-position: -82px -162px;
}
.moveDrag:hover .icon {
@@ -13357,4 +13393,3 @@ div.panel.copy-template-destination-list div.list-view div.fixed-header{
.multi-edit-add-list .ui-button.copytemplatecancel {
left: 310px;
}
-
diff --git a/ui/l10n/ar.js b/ui/l10n/ar.js
index 3b560a86e72..8bd2d031215 100644
--- a/ui/l10n/ar.js
+++ b/ui/l10n/ar.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "المشاريع",
"label.protocol": "Protocol",
"label.protocol.number": "Protocol Number",
+ "label.protocol.number.short" : "#Protocol",
"label.provider": "Provider",
"label.providers": "Providers",
"label.public": "Public",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "Routing",
"label.routing.host": "Routing Host",
"label.rule": "Rule",
+ "label.rule.number.short": "#Rule",
"label.rule.number": "Rule Number",
"label.rules": "Rules",
"label.running.vms": "Running VMs",
diff --git a/ui/l10n/ca.js b/ui/l10n/ca.js
index f6ae80f81f3..3ee21729151 100644
--- a/ui/l10n/ca.js
+++ b/ui/l10n/ca.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "Projectes",
"label.protocol": "Protocol",
"label.protocol.number": "Protocol Number",
+ "label.protocol.number.short" : "#Protocol",
"label.provider": "Provider",
"label.providers": "Proveïdors",
"label.public": "Public",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "Routing",
"label.routing.host": "Routing Host",
"label.rule": "Rule",
+ "label.rule.number.short": "#Rule",
"label.rule.number": "Rule Number",
"label.rules": "Rules",
"label.running.vms": "Running VMs",
diff --git a/ui/l10n/de_DE.js b/ui/l10n/de_DE.js
index 934f8f98c09..7ae796fe499 100644
--- a/ui/l10n/de_DE.js
+++ b/ui/l10n/de_DE.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "Projekte",
"label.protocol": "Protokoll",
"label.protocol.number": "Protokollnummer",
+ "label.protocol.number.short" : "#Protokoll",
"label.provider": "Anbieter",
"label.providers": "Anbieter",
"label.public": "Öffentlich",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "Routing",
"label.routing.host": "Routing Host",
"label.rule": "Regel",
+ "label.rule.number.short": "#Regel",
"label.rule.number": "Regelnummer",
"label.rules": "Regeln",
"label.running.vms": "Laufende VMs",
diff --git a/ui/l10n/en.js b/ui/l10n/en.js
index 7b19946b1ed..02b8c79acbf 100644
--- a/ui/l10n/en.js
+++ b/ui/l10n/en.js
@@ -1316,6 +1316,7 @@ var dictionary = {"ICMP.code":"ICMP Code",
"label.promiscuous.mode":"Promiscuous Mode",
"label.protocol":"Protocol",
"label.protocol.number":"Protocol Number",
+"label.protocol.number.short" : "#Protocol",
"label.provider":"Provider",
"label.providers":"Providers",
"label.public":"Public",
@@ -1467,6 +1468,7 @@ var dictionary = {"ICMP.code":"ICMP Code",
"label.routing.host":"Routing Host",
"label.rule":"Rule",
"label.rule.number":"Rule Number",
+"label.rule.number.short": "#Rule",
"label.rules":"Rules",
"label.running.vms":"Running VMs",
"label.s3.access_key":"Access Key",
diff --git a/ui/l10n/es.js b/ui/l10n/es.js
index 35257d47989..d125ad2af48 100644
--- a/ui/l10n/es.js
+++ b/ui/l10n/es.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "Proyectos",
"label.protocol": "Protocolo",
"label.protocol.number": "Número de Protocolo",
+ "label.protocol.number.short" : "#Protocolo",
"label.provider": "Proveedor",
"label.providers": "Proveedores",
"label.public": "Pública",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "Enrutamiento",
"label.routing.host": "Servidor de Routeo",
"label.rule": "Regla",
+ "label.rule.number.short": "#Regla",
"label.rule.number": "Número de Regla",
"label.rules": "Reglas",
"label.running.vms": "MVs corriendo",
diff --git a/ui/l10n/fr_FR.js b/ui/l10n/fr_FR.js
index 9935a818021..99ec18bd795 100644
--- a/ui/l10n/fr_FR.js
+++ b/ui/l10n/fr_FR.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "Projets",
"label.protocol": "Protocole",
"label.protocol.number": "Numéro Protocole",
+ "label.protocol.number.short" : "#Protocole",
"label.provider": "Fournisseur",
"label.providers": "Fournisseurs",
"label.public": "Publique",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "Routage",
"label.routing.host": "Hôte de routage",
"label.rule": "Règle",
+ "label.rule.number.short": "#Règle",
"label.rule.number": "Numéro règle",
"label.rules": "Règles",
"label.running.vms": "VMs actives",
diff --git a/ui/l10n/hu.js b/ui/l10n/hu.js
index 912ecf9a49d..e84800da55c 100644
--- a/ui/l10n/hu.js
+++ b/ui/l10n/hu.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "Projektek",
"label.protocol": "Protokol",
"label.protocol.number": "Protokoll szám",
+ "label.protocol.number.short" : "#Protocol",
"label.provider": "Szolgáltató",
"label.providers": "Szolgáltatók",
"label.public": "Publikus",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "Útvonalválasztás",
"label.routing.host": "Routing kiszolgáló",
"label.rule": "Rule",
+ "label.rule.number.short": "#Rule",
"label.rule.number": "Szabály szám",
"label.rules": "Szabályok",
"label.running.vms": "Futó VM-ek",
diff --git a/ui/l10n/it_IT.js b/ui/l10n/it_IT.js
index f725584e08b..3dd7f35a5f5 100644
--- a/ui/l10n/it_IT.js
+++ b/ui/l10n/it_IT.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "Progetti",
"label.protocol": "Protocol",
"label.protocol.number": "Protocol Number",
+ "label.protocol.number.short" : "#Protocol",
"label.provider": "Provider",
"label.providers": "Fornitori",
"label.public": "Public",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "Routing",
"label.routing.host": "Routing Host",
"label.rule": "Rule",
+ "label.rule.number.short": "#Rule",
"label.rule.number": "Rule Number",
"label.rules": "Regole",
"label.running.vms": "Running VMs",
diff --git a/ui/l10n/ja_JP.js b/ui/l10n/ja_JP.js
index 40cf38fd857..ce8967298b6 100644
--- a/ui/l10n/ja_JP.js
+++ b/ui/l10n/ja_JP.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "プロジェクト",
"label.protocol": "プロトコル",
"label.protocol.number": "プロトコル番号",
+ "label.protocol.number.short" : "#Protocol",
"label.provider": "プロバイダー",
"label.providers": "プロバイダー",
"label.public": "パブリック",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "ルーティング",
"label.routing.host": "ルーティング ホスト",
"label.rule": "Rule",
+ "label.rule.number.short": "#Rule",
"label.rule.number": "規則番号",
"label.rules": "規則",
"label.running.vms": "実行中の VM",
diff --git a/ui/l10n/ko_KR.js b/ui/l10n/ko_KR.js
index f6980bc067e..e60e0a95b7f 100644
--- a/ui/l10n/ko_KR.js
+++ b/ui/l10n/ko_KR.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "프로젝트",
"label.protocol": "프로토콜",
"label.protocol.number": "Protocol Number",
+ "label.protocol.number.short" : "#Protocol",
"label.provider": "Provider",
"label.providers": "제공자",
"label.public": "공개",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "라우팅",
"label.routing.host": "Routing Host",
"label.rule": "Rule",
+ "label.rule.number.short": "#Rule",
"label.rule.number": "Rule Number",
"label.rules": "규칙",
"label.running.vms": "실행중 VM",
diff --git a/ui/l10n/nb_NO.js b/ui/l10n/nb_NO.js
index 28cd09c3b9a..08a077c8e99 100644
--- a/ui/l10n/nb_NO.js
+++ b/ui/l10n/nb_NO.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "Prosjekter",
"label.protocol": "Protokoll",
"label.protocol.number": "Protokollnummer",
+ "label.protocol.number.short" : "#Protocol",
"label.provider": "Tilbyder",
"label.providers": "Tilbydere",
"label.public": "Offentlig",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "Ruting",
"label.routing.host": "Ruter Vert",
"label.rule": "Rule",
+ "label.rule.number.short": "#Regel",
"label.rule.number": "Regelnummer",
"label.rules": "Regler",
"label.running.vms": "Kjørende VMer",
diff --git a/ui/l10n/nl_NL.js b/ui/l10n/nl_NL.js
index 4508241ad30..0481297711d 100644
--- a/ui/l10n/nl_NL.js
+++ b/ui/l10n/nl_NL.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "Projecten",
"label.protocol": "Protocol",
"label.protocol.number": "protocol nummer",
+ "label.protocol.number.short" : "#Protocol",
"label.provider": "Provider",
"label.providers": "Providers",
"label.public": "Publiek",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "Routing",
"label.routing.host": "routeer machine",
"label.rule": "Rule",
+ "label.rule.number.short": "#Rule",
"label.rule.number": "Regel Nummer",
"label.rules": "Regels",
"label.running.vms": "Draaiende VMs",
diff --git a/ui/l10n/pl.js b/ui/l10n/pl.js
index 30c04b9ff75..55b1b72b33d 100644
--- a/ui/l10n/pl.js
+++ b/ui/l10n/pl.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "Projekty",
"label.protocol": "Protokół",
"label.protocol.number": "Protocol Number",
+ "label.protocol.number.short" : "#Protocol",
"label.provider": "Provider",
"label.providers": "Dostawcy",
"label.public": "Pobliczny",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "Routing",
"label.routing.host": "Routing Host",
"label.rule": "Rule",
+ "label.rule.number.short": "#Rule",
"label.rule.number": "Rule Number",
"label.rules": "Zasady",
"label.running.vms": "Running VMs",
diff --git a/ui/l10n/pt_BR.js b/ui/l10n/pt_BR.js
index ccfa59ae7d3..42051e20755 100644
--- a/ui/l10n/pt_BR.js
+++ b/ui/l10n/pt_BR.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "Projetos",
"label.protocol": "Protocolo",
"label.protocol.number": "Número do Protocolo",
+ "label.protocol.number.short" : "#Protocolo",
"label.provider": "Provedor",
"label.providers": "Providers",
"label.public": "Público",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "Roteamento",
"label.routing.host": "Host de Roteamento",
"label.rule": "Regra",
+ "label.rule.number.short": "#Regra",
"label.rule.number": "Regra Número",
"label.rules": "Regras",
"label.running.vms": "VMs Rodando",
diff --git a/ui/l10n/ru_RU.js b/ui/l10n/ru_RU.js
index 6a11b38a0f7..8ced34c3e06 100644
--- a/ui/l10n/ru_RU.js
+++ b/ui/l10n/ru_RU.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "Проекты",
"label.protocol": "Протокол",
"label.protocol.number": "Protocol Number",
+ "label.protocol.number.short" : "#Protocol",
"label.provider": "Поставщики",
"label.providers": "Поставщики",
"label.public": "Публичный",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "Маршрутизация",
"label.routing.host": "Routing Host",
"label.rule": "Rule",
+ "label.rule.number.short": "#Rule",
"label.rule.number": "Номер правила",
"label.rules": "Правила",
"label.running.vms": "Запущенные ВМ",
diff --git a/ui/l10n/zh_CN.js b/ui/l10n/zh_CN.js
index dc44fdb9a96..b755356115e 100644
--- a/ui/l10n/zh_CN.js
+++ b/ui/l10n/zh_CN.js
@@ -1278,6 +1278,7 @@ var dictionary = {
"label.projects": "项目",
"label.protocol": "协议",
"label.protocol.number": "协议编号",
+ "label.protocol.number.short" : "#Protocol",
"label.provider": "提供程序",
"label.providers": "提供程序",
"label.public": "公用",
@@ -1427,6 +1428,7 @@ var dictionary = {
"label.routing": "正在路由",
"label.routing.host": "正在路由主机",
"label.rule": "规则",
+ "label.rule.number.short": "#Rule",
"label.rule.number": "规则编号",
"label.rules": "规则",
"label.running.vms": "正在运行的 VM",
diff --git a/ui/scripts/ui/widgets/multiEdit.js b/ui/scripts/ui/widgets/multiEdit.js
index c3fa97c8fc1..36e3ffb4c90 100755
--- a/ui/scripts/ui/widgets/multiEdit.js
+++ b/ui/scripts/ui/widgets/multiEdit.js
@@ -79,7 +79,10 @@
});
}
-
+ var $actions = undefined;
+ if(options.editOptionsFirst){
+ $actions = $('
').addClass('multi-actions').appendTo($item.find('tr'));
+ }
// Setup columns
$.each(fields, function(fieldName, field) {
if (!field || (options.ignoreEmptyFields && !data[fieldName])) {
@@ -160,8 +163,9 @@
}
if (!field.isPassword) {
+ $td.attr('title', data[fieldName]);
if (field.edit) {
- // Edit fields append value of data
+ // Edit fields append value of data
if (field.range) {
var start = _s(data[field.range[0]]);
var end = _s(data[field.range[1]]);
@@ -177,7 +181,6 @@
} else {
$td.append($('').html(_s(data[fieldName])));
}
- $td.attr('title', data[fieldName]);
}
} else if (field.isBoolean) {
var $checkbox = $('');
@@ -324,9 +327,9 @@
return true;
});
- // Actions column
- var $actions = $(' | ').addClass('multi-actions').appendTo($item.find('tr'));
-
+ if(!options.editOptionsFirst){
+ var $actions = $(' | ').addClass('multi-actions').appendTo($item.find('tr'));
+ }
// Align action column width
$actions.width($multi.find('th.multi-actions').width() + 4);
@@ -905,16 +908,20 @@
var $thead = $(' | ').appendTo(
$('').appendTo($inputTable)
);
- var $inputForm = $('').appendTo(
- $('
').appendTo($inputTable)
- );
+ if (!args.doNotShowInputTable){
+ var $inputForm = $('').appendTo(
+ $('
').appendTo($inputTable)
+ );
+ }
var $dataBody = $('').addClass('data-body').appendTo($dataTable);
// Setup input table headers
if (reorder) {
$('
').addClass('reorder').appendTo($thead);
- $(' | ').addClass('reorder').appendTo($inputForm);
+ if (!args.doNotShowInputTable){
+ $(' | ').addClass('reorder').appendTo($inputForm);
+ }
$multi.find('.data-body').sortable({
handle: '.action.moveDrag',
@@ -946,6 +953,13 @@
});
}
+ if (args.editOptionsFirst && args.actions && !args.noHeaderActionsColumn) {
+ $thead.append($(' | | ').html(_l('label.actions')).addClass('multi-actions'));
+ if (!args.doNotShowInputTable){
+ $inputForm.append($('
| ').addClass('multi-actions'));
+ }
+ }
+
$.each(args.fields, function(fieldName, field) {
if (!field) return true;
@@ -954,7 +968,10 @@
$th.appendTo($thead);
var $td = $('
').addClass(fieldName);
$td.attr('rel', fieldName);
- $td.appendTo($inputForm);
+
+ if (!args.doNotShowInputTable){
+ $td.appendTo($inputForm);
+ }
var isHidden = $.isFunction(field.isHidden) ?
field.isHidden({ context: context }) : field.isHidden;
@@ -1071,7 +1088,10 @@
).appendTo($td);
}
- if (field.desc) $input.attr('title', field.desc);
+ if (field.desc){
+ $input.attr('title', field.desc);
+ $th.attr('title', _l(field.desc));
+ }
});
// Setup header fields
@@ -1093,134 +1113,137 @@
.prependTo($multi);
}
- if (args.actions && !args.noHeaderActionsColumn) {
+ if (!args.editOptionsFirst && args.actions && !args.noHeaderActionsColumn) {
$thead.append($(' | | ').html(_l('label.actions')).addClass('multi-actions'));
- $inputForm.append($('
| ').addClass('multi-actions'));
+ if (!args.doNotShowInputTable){
+ $inputForm.append($('
| ').addClass('multi-actions'));
+ }
+ }
+ if($addVM){
+ $addVM.bind('click', function() {
+ // Validate form first
+ if (!$multiForm.valid()) {
+ if ($multiForm.find('input.error:visible').size()) {
+ return false;
+ }
+ }
+
+ var $dataList;
+ var addItem = function(itemData) {
+ var data = {};
+
+ $.each(getMultiData($multi), function(key, value) {
+ if (value != '') {
+ data[key] = value;
+ }
+ });
+
+ // Append custom data
+ var $customFields = $multi.find('tbody td').filter(function() {
+ return $(this).data('multi-custom-data');
+ });
+
+ $customFields.each(function() {
+ var $field = $(this);
+ var fieldID = $field.attr('rel');
+ var fieldData = $field.data('multi-custom-data');
+
+ data[fieldID] = fieldData;
+ });
+
+ // Loading appearance
+ var $loading = _medit.loadingItem($multi, _l('label.adding') + '...');
+ $dataBody.prepend($loading);
+
+ // Clear out fields
+ $multi.find('input').each(function() {
+ var $input = $(this);
+
+ if ($input.is(":checkbox")) {
+ $input.attr({
+ checked: false
+ });
+ } else if ($input.data('multi-default-value')) {
+ $input.val($input.data('multi-default-value'));
+ } else {
+ $input.val('');
+ }
+ });
+ $multi.find('tbody td').each(function() {
+ var $item = $(this);
+
+ if ($item.data('multi-custom-data')) {
+ $item.data('multi-custom-data', null);
+ }
+ });
+
+ // Apply action
+ args.add.action({
+ context: context,
+ data: data,
+ itemData: itemData,
+ $multi: $multi,
+ response: {
+ success: function(successArgs) {
+ var notification = successArgs ? successArgs.notification : null;
+ if (notification) {
+ $('.notifications').notifications('add', {
+ section: 'network',
+ desc: notification.label,
+ interval: 3000,
+ _custom: successArgs._custom,
+ poll: function(pollArgs) {
+ var complete = pollArgs.complete;
+ var error = pollArgs.error;
+
+ notification.poll({
+ _custom: pollArgs._custom,
+ complete: function(completeArgs) {
+ complete(args);
+ $loading.remove();
+ getData();
+ },
+
+ error: function(args) {
+ error(args);
+ $loading.remove();
+
+ return cloudStack.dialog.error(args);
+ }
+ });
+ }
+ });
+ } else {
+ $loading.remove();
+ getData();
+ }
+ },
+
+ error: cloudStack.dialog.error(function() {
+ $loading.remove();
+ })
+ }
+ });
+ };
+
+ if (args.noSelect) {
+ // Don't append instance data
+ addItem([]);
+
+ return true;
+ }
+
+ _medit.vmList($multi,
+ args.listView,
+ args.context,
+ multipleAdd, _l('label.add.vms'),
+ addItem);
+
+ return true;
+ });
}
-
- $addVM.bind('click', function() {
- // Validate form first
- if (!$multiForm.valid()) {
- if ($multiForm.find('input.error:visible').size()) {
- return false;
- }
- }
-
- var $dataList;
- var addItem = function(itemData) {
- var data = {};
-
- $.each(getMultiData($multi), function(key, value) {
- if (value != '') {
- data[key] = value;
- }
- });
-
- // Append custom data
- var $customFields = $multi.find('tbody td').filter(function() {
- return $(this).data('multi-custom-data');
- });
-
- $customFields.each(function() {
- var $field = $(this);
- var fieldID = $field.attr('rel');
- var fieldData = $field.data('multi-custom-data');
-
- data[fieldID] = fieldData;
- });
-
- // Loading appearance
- var $loading = _medit.loadingItem($multi, _l('label.adding') + '...');
- $dataBody.prepend($loading);
-
- // Clear out fields
- $multi.find('input').each(function() {
- var $input = $(this);
-
- if ($input.is(":checkbox")) {
- $input.attr({
- checked: false
- });
- } else if ($input.data('multi-default-value')) {
- $input.val($input.data('multi-default-value'));
- } else {
- $input.val('');
- }
- });
- $multi.find('tbody td').each(function() {
- var $item = $(this);
-
- if ($item.data('multi-custom-data')) {
- $item.data('multi-custom-data', null);
- }
- });
-
- // Apply action
- args.add.action({
- context: context,
- data: data,
- itemData: itemData,
- $multi: $multi,
- response: {
- success: function(successArgs) {
- var notification = successArgs ? successArgs.notification : null;
- if (notification) {
- $('.notifications').notifications('add', {
- section: 'network',
- desc: notification.label,
- interval: 3000,
- _custom: successArgs._custom,
- poll: function(pollArgs) {
- var complete = pollArgs.complete;
- var error = pollArgs.error;
-
- notification.poll({
- _custom: pollArgs._custom,
- complete: function(completeArgs) {
- complete(args);
- $loading.remove();
- getData();
- },
-
- error: function(args) {
- error(args);
- $loading.remove();
-
- return cloudStack.dialog.error(args);
- }
- });
- }
- });
- } else {
- $loading.remove();
- getData();
- }
- },
-
- error: cloudStack.dialog.error(function() {
- $loading.remove();
- })
- }
- });
- };
-
- if (args.noSelect) {
- // Don't append instance data
- addItem([]);
-
- return true;
- }
-
- _medit.vmList($multi,
- args.listView,
- args.context,
- multipleAdd, _l('label.add.vms'),
- addItem);
-
- return true;
- });
-
var listView = args.listView;
+ var editOptionsFirst = args.editOptionsFirst;
var getData = function() {
dataProvider({
context: context,
@@ -1247,7 +1270,8 @@
listView: listView,
tags: tags,
reorder: reorder,
- selectPermission: selectPermission
+ selectPermission: selectPermission,
+ editOptionsFirst: editOptionsFirst
}
).appendTo($dataBody);
});
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index 14e41af2b23..40c954f5d00 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -190,63 +190,14 @@
};
};
- var aclMultiEdit = {
- noSelect: true,
-
- reorder: {
- moveDrag: {
- action: function(args) {
- var rule = args.context.multiRule[0];
- var number = 0;
- var prevItem = args.prevItem ? args.prevItem.number : null;
- var nextItem = args.nextItem ? args.nextItem.number : null;
-
- if (!nextItem) { // Last item
- number = prevItem + 100;
- } else {
- if (nextItem - prevItem <= 10) {
- number = nextItem - parseInt(((nextItem - prevItem) / 2));
- } else {
- number = nextItem > 1 ? nextItem - 10 : 1;
- }
- }
-
- $.ajax({
- url: createURL('updateNetworkACLItem'),
- data: {
- id: rule.id,
- number: number
- },
- success: function(json) {
- var pollTimer = setInterval(function() {
- pollAsyncJobResult({
- _custom: {
- jobId: json.createnetworkaclresponse.jobid
- },
- complete: function() {
- clearInterval(pollTimer);
- args.response.success();
- },
- error: function(errorMsg) {
- clearInterval(pollTimer);
- args.response.error(errorMsg);
- }
- });
- }, 1000);
- }
- });
- }
- }
- },
- fields: {
-
+ var aclRuleFields = {
'number': {
- label: 'label.rule.number',
+ label: 'label.rule.number.short',
+ desc: 'label.rule.number',
edit: true,
isEditable: true
},
-
'cidrlist': {
edit: true,
label: 'label.cidr',
@@ -322,6 +273,13 @@
$portFields.hide();
} else if ($(this).val() == 'all') {
$portFields.hide();
+ $portFields.attr('disabled', 'disabled');
+
+ $icmpFields.hide();
+ $icmpFields.attr('disabled', 'disabled');
+
+ $protocolFields.attr('disabled', 'disabled');
+ $protocolFields.hide();
} else {
$otherFields.show();
$icmpFields.hide();
@@ -378,8 +336,14 @@
$otherFields.hide();
$otherFields.parent().find('label.error').hide();
} else if ($(this).val() == 'all') {
- $portFields.attr('disabled', 'disabled');
$portFields.hide();
+ $portFields.attr('disabled', 'disabled');
+
+ $icmpFields.hide();
+ $icmpFields.attr('disabled', 'disabled');
+
+ $protocolFields.hide();
+ $protocolFields.attr('disabled', 'disabled');
} else {
$otherFields.show();
$otherFields.parent().find('label.error').hide();
@@ -420,7 +384,8 @@
},
'protocolnumber': {
- label: 'label.protocol.number',
+ label: 'label.protocol.number.short',
+ desc: 'label.protocol.number',
edit: true,
isEditable: true
},
@@ -436,6 +401,38 @@
isOptional: true,
isEditable: true
},
+ 'icmptype': {
+ edit: true,
+ label: 'ICMP.type',
+ desc: 'Please specify -1 if you want to allow all ICMP types',
+ defaultValue: '-1',
+ isEditable: true
+ },
+ 'icmpcode': {
+ edit: true,
+ label: 'ICMP.code',
+ desc: 'Please specify -1 if you want to allow all ICMP codes',
+ defaultValue: '-1',
+ isEditable: true
+ },
+ 'traffictype': {
+ label: 'label.traffic.type',
+ isEditable: true,
+ select: function(args) {
+ args.response.success({
+ data: [{
+ name: 'Ingress',
+ description: 'Ingress'
+ }, {
+ name: 'Egress',
+ description: 'Egress'
+ }]
+ });
+ }
+ }
+ };
+
+ var aclRuleFieldsForMultiEdit = {
'networkid': {
label: 'label.select.tier',
select: function(args) {
@@ -472,43 +469,60 @@
});
}
},
- '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',
- isEditable: true
- },
- 'traffictype': {
- label: 'label.traffic.type',
- isEditable: true,
- select: function(args) {
- args.response.success({
- data: [{
- name: 'Ingress',
- description: 'Ingress'
- }, {
- name: 'Egress',
- description: 'Egress'
- }]
+ };
+
+ jQuery.extend(aclRuleFieldsForMultiEdit, aclRuleFields);
+
+ var aclMultiEdit = {
+ doNotShowInputTable: true,
+ editOptionsFirst: true,
+ noSelect: true,
+ reorder: {
+ moveDrag: {
+ action: function(args) {
+ var rule = args.context.multiRule[0];
+ var number = 0;
+ var prevItem = args.prevItem ? args.prevItem.number : null;
+ var nextItem = args.nextItem ? args.nextItem.number : null;
+
+ if (!nextItem) { // Last item
+ number = prevItem + 100;
+ } else {
+ if (nextItem - prevItem <= 10) {
+ number = nextItem - parseInt(((nextItem - prevItem) / 2));
+ } else {
+ number = nextItem > 1 ? nextItem - 10 : 1;
+ }
+ }
+
+ $.ajax({
+ url: createURL('updateNetworkACLItem'),
+ data: {
+ id: rule.id,
+ number: number
+ },
+ success: function(json) {
+ var pollTimer = setInterval(function() {
+ pollAsyncJobResult({
+ _custom: {
+ jobId: json.createnetworkaclresponse.jobid
+ },
+ complete: function() {
+ clearInterval(pollTimer);
+ args.response.success();
+ },
+ error: function(errorMsg) {
+ clearInterval(pollTimer);
+ args.response.error(errorMsg);
+ }
+ });
+ }, 1000);
+ }
});
}
- },
- 'add-rule': {
- label: 'label.add.rule',
- addButton: true
}
},
-
+ fields: aclRuleFieldsForMultiEdit,
tags: cloudStack.api.tags({
resourceType: 'NetworkACL',
contextId: 'multiRule'
@@ -983,32 +997,6 @@
});
}
},
-
- /*
- rules: {
- title: 'label.rules',
- multiple: true,
- fields: [
- {
- sourceport: { label: 'Source Port' },
- instanceport: { label: 'Instance Port' }
- }
- ],
- dataProvider: function(args) {
- $.ajax({
- url: createURL('listLoadBalancers'),
- data: {
- id: args.context.internalLoadBalancers[0].id
- },
- success: function(json) {
- var item = json.listloadbalancersresponse.loadbalancer[0];
- args.response.success({ data: item.loadbalancerrule });
- }
- });
- }
- },
- */
-
assignedVms: {
title: 'label.assigned.vms',
listView: {
@@ -1333,35 +1321,65 @@
$.ajax({
url: createURL('listNetworkACLs&aclid=' + args.context.aclLists[0].id),
success: function(json) {
- var items = json.listnetworkaclsresponse.networkacl.sort(function(a, b) {
- return a.number >= b.number;
- }).map(function(acl) {
- if (parseInt(acl.protocol)) { // protocol number
- acl.protocolnumber = acl.protocol;
- acl.protocol = "protocolnumber";
- }
+ var items = json.listnetworkaclsresponse.networkacl;
- return acl;
- });
+ if(items){
+ items.sort(function(a, b) {
+ return a.number >= b.number;
+ }).map(function(acl) {
+ if (parseInt(acl.protocol)) { // protocol number
+ acl.protocolnumber = acl.protocol;
+ acl.protocol = "protocolnumber";
+ }
+
+ return acl;
+ });
+ }
args.response.success({
data: items
- /* {
- cidrlist: '10.1.1.0/24',
- protocol: 'TCP',
- startport: 22, endport: 22,
- networkid: 0,
- traffictype: 'Egress'
- },
- {
- cidrlist: '10.2.1.0/24',
- protocol: 'UDP',
- startport: 56, endport: 72,
- networkid: 0,
- trafficType: 'Ingress'
- }
- ]*/
});
+ if(jQuery('#details-tab-aclRules').siblings('div.toolbar').children('div.add').size() === 0){
+ var $addAclRuleDivButton = jQuery('
').addClass('button add');
+ var $spanAddAclRuleButtonMessage = jQuery('').html(_l('label.add.ACL'));
+
+ $addAclRuleDivButton.html($spanAddAclRuleButtonMessage);
+ $addAclRuleDivButton.click(function(){
+ cloudStack.dialog.createForm({
+ form: {
+ title: 'label.add.rule',
+ desc: 'Create a new ACL rule',
+ fields: aclRuleFields
+ },
+ after: function(argsLocal) {
+ var data = argsLocal.data;
+ data.aclid = argsLocal.context.aclLists[0].id;
+ if(data.protocol != 'icmp'){
+ data.icmpcode = undefined;
+ data.icmptype = undefined;
+ }
+ if(data.protocol != 'protocolnumber'){
+ data.protocolnumber = undefined;
+ }
+ if(data.protocol === 'all'){
+ data.startport = undefined;
+ data.endport = undefined;
+ }
+ $.ajax({
+ url: createURL('createNetworkACL'),
+ data: argsLocal.data,
+ type: "POST",
+ success: function(json) {
+ jQuery('button.cancel:visible').click();
+ jQuery('div.toolbar:visible div.refresh').click();
+ }
+ });
+ },
+ context: args.context
+ });
+ });
+ jQuery('#details-tab-aclRules').siblings('div.toolbar').append($addAclRuleDivButton);
+ }
}
});
}