(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 });
}
});
} else if (field.custom) {
$td.data('multi-custom-data', data[fieldName]);
$(' ').addClass('button add-vm custom-action')
.html(data && data[fieldName] && data[fieldName]['_buttonLabel'] ?
data[fieldName]['_buttonLabel'] : field.custom.buttonLabel)
.click(function() {
var $button = $(this);
field.custom.action({
context: options.context ? options.context : cloudStack.context,
data: $td.data('multi-custom-data'),
$item: $td,
response: {
success: function(args) {
if (args.data['_buttonLabel']) {
$button.html(args.data['_buttonLabel']);
}
$td.data('multi-custom-data', args.data)
}
}
})
})
.appendTo($td);
}
};
// 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 ? args.notification : null;
var _custom = args ? args._custom : null;
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;
}
});
}
});
} else {
$loading.remove();
if (isDestroy) {
$dataItem.remove();
}
}
},
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(
$('
|