(function($, cloudStack) { var _medit = cloudStack.ui.widgets.multiEdit = { /** * Append item to list */ addItem: function(data, fields, $multi, itemData, actions, options) { if (!options) options = {}; var $item = $('
| ').addClass(fieldName).appendTo($tr); var $input, val; if ($multi.find('th,td').filter(function() { return $(this).attr('rel') == fieldName; }).is(':hidden')) return true; if (!field.isPassword) { if (field.edit) { // Edit fields append value of data if (field.range) { var start = data[field.range[0]]; var end = data[field.range[1]]; $td.append( $('').html(start + ' - ' + end) ); } else { $td.append( $('').html(data[fieldName]) ); } } else if (field.select) { $td.append( $('').html( // Get matching option text $multi.find('select').filter(function() { return $(this).attr('name') == fieldName; }).find('option').filter(function() { return $(this).val() == data[fieldName]; }).html() ) ); } else if (field.addButton && $.isArray(itemData) && !options.noSelect) { // Show VM data $td .html( options.multipleAdd ? itemData.length + ' VMs' : itemData[0].name ) .click(function() { var $browser = $(this).closest('.detail-view').data('view-args').$browser; if (options.multipleAdd) { _medit.multiItem.details(itemData, $browser); } else { _medit.details(itemData[0], $browser, { context: options.context }); } }); } }; // Add blank styling for empty fields if ($td.html() == '') { $td.addClass('blank'); } // Align width to main header var targetWidth = $multi.find('th.' + fieldName).width() + 5; $td.width(targetWidth); return true; }); // Actions column var $actions = $(' | ').addClass('multi-actions').appendTo(
$item.find('tr')
);
// Align action column width
$actions.width(
$multi.find('th.multi-actions').width() + 4
);
// Action filter
var allowedActions = options.preFilter ? options.preFilter({
context: $.extend(true, {}, options.context, {
multiRule: [data],
actions: $.map(actions, function(value, key) { return key; })
})
}) : null;
// Append actions
$.each(actions, function(actionID, action) {
if (allowedActions && $.inArray(actionID, allowedActions) == -1) return true;
$actions.append(
$(' ')
.addClass('action')
.addClass(actionID)
.append($('').addClass('icon'))
.attr({ title: action.label })
.click(function() {
var $target = $(this);
var $dataItem = $target.closest('.data-item');
var $expandable = $dataItem.find('.expandable-listing');
var isDestroy = $target.hasClass('destroy');
if (isDestroy) {
var $loading = _medit.loadingItem($multi, 'Removing...');
if ($expandable.is(':visible')) {
$expandable.slideToggle(function() {
$dataItem.hide();
$dataItem.after($loading);
});
} else {
// Loading appearance
$dataItem.hide();
$dataItem.after($loading);
}
}
action.action({
context: $.extend(true, {}, options.context, {
multiRule: [data]
}),
response: {
success: function(args) {
var notification = args.notification;
var _custom = args._custom;
if (notification) {
$('.notifications').notifications('add', {
section: 'network',
desc: notification.label,
interval: 500,
_custom: _custom,
poll: function(args) {
var complete = args.complete;
var error = args.error;
notification.poll({
_custom: args._custom,
complete: function(args) {
if (isDestroy) {
$loading.remove();
$dataItem.remove();
} else {
$multi.trigger('refresh');
}
complete();
},
error: function(args) {
error(args);
$loading.remove();
$dataItem.show();
return cloudStack.dialog.error;
}
});
}
});
}
},
error: cloudStack.dialog.error
}
});
})
);
});
// Add expandable listing, for multiple-item
if (options.multipleAdd) {
// Create expandable box
_medit.multiItem.expandable(
$item.find('tr').data('multi-edit-data')
).appendTo($item);
// Expandable icon/action
$item.find('td:first').prepend(
$(' ')
.addClass('expand')
.click(function() {
$item.closest('.data-item').find('.expandable-listing').slideToggle();
})
);
}
return $item;
},
/**
* Align width of each data row to main header
*/
refreshItemWidths: function($multi) {
$multi.find('.data tr').filter(function() {
return !$(this).closest('.expandable-listing').size();
}).each(function() {
var $tr = $(this);
$tr.find('td').each(function() {
var $td = $(this);
$td.width(
$(
$multi.find('th:visible')[
$td.index()
]
).width() + 5
);
});
});
},
/**
* Create a fake 'loading' item box
*/
loadingItem: function($multi, label) {
var $loading = $(' ').addClass('data-item loading');
// Align height with existing items
var $row = $multi.find('.data-item:first');
// Set label
if (label) {
$loading.append(
$(' ').addClass('label').append(
$('').html(label)
)
);
}
return $loading;
},
details: function(data, $browser, options) {
if (!options) options = {};
var detailViewArgs, $detailView;
detailViewArgs = $.extend(true, {}, cloudStack.sections.instances.listView.detailView);
detailViewArgs.actions = null;
detailViewArgs.$browser = $browser;
detailViewArgs.id = data.id;
detailViewArgs.jsonObj = data[0];
detailViewArgs.context = options.context;
$browser.cloudBrowser('addPanel', {
title: data.name,
complete: function($newPanel) {
$newPanel.detailView(detailViewArgs);
}
});
},
multiItem: {
/**
* Show listing of load balanced VMs
*/
details: function(data, $browser) {
var listViewArgs, $listView;
// Setup list view
listViewArgs = $.extend(true, {}, cloudStack.sections.instances);
listViewArgs.listView.actions = null;
listViewArgs.listView.filters = null;
listViewArgs.$browser = $browser;
listViewArgs.listView.detailView.actions = null;
listViewArgs.listView.dataProvider = function(args) {
setTimeout(function() {
args.response.success({
data: data
});
}, 50);
};
$listView = $(' ').listView(listViewArgs);
// Show list view of selected VMs
$browser.cloudBrowser('addPanel', {
title: 'Load Balanced VMs',
data: '',
noSelectPanel: true,
maximizeIfSelected: true,
complete: function($newPanel) {
return $newPanel.listView(listViewArgs);
}
});
},
expandable: function(data) {
var $expandable = $(' ').addClass('expandable-listing');
var $tbody = $('').appendTo(
$('
|