// 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 // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. (function($, cloudStack) { var getMultiData = function($multi) { return cloudStack.serializeForm($multi.find('form')); }; var _medit = cloudStack.ui.widgets.multiEdit = { /** * Append item to list */ addItem: function(data, fields, $multi, itemData, actions, options) { if (!options) options = {}; var $tr; var $item = $('
| ').addClass('actions reorder').appendTo($tr).append(function() {
var $td = $(this);
$.each(reorder, function(actionName, action) {
var fnLabel = {
moveTop: _l('label.move.to.top'),
moveBottom: _l('label.move.to.bottom'),
moveUp: _l('label.move.up.row'),
moveDown: _l('label.move.down.row'),
moveDrag: _l('label.drag.new.position')
};
$(' ')
.addClass('action reorder')
.addClass(actionName)
.append(
$('').addClass('icon').html(' ')
)
.attr({
title: _l(fnLabel[actionName])
})
.appendTo($td)
.click(function() {
if (actionName == 'moveDrag') return false;
rowActions[actionName]($tr);
$tr.closest('.data-body').find('.data-item').each(function() {
sort($(this), action);
});
return false;
});
});
});
}
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])) {
return true;
}
var isHidden = $multi.find('th.' + fieldName).hasClass('always-hide');
if (isHidden) {
return true;
}
var $td = $(' | ').addClass(fieldName).appendTo($tr);
var $input, val;
var $addButton = $multi.find('form .button.add-vm:not(.custom-action)').clone();
var newItemRows = [];
var addItemAction = function(data) {
var $loading = $(' | ').addClass('loading-overlay');
var complete = function(args) {
var $tbody = $item.find('.expandable-listing tbody');
$loading.remove();
$(data).each(function() {
var item = this;
var $itemRow = _medit.multiItem.itemRow(item, options.itemActions, multiRule, $tbody);
$itemRow.data('json-obj', item);
$itemRow.appendTo($tbody);
newItemRows.push($itemRow);
cloudStack.evenOdd($tbody, 'tr:visible', {
even: function($elem) {
$elem.removeClass('odd');
$elem.addClass('even');
},
odd: function($elem) {
$elem.removeClass('even');
$elem.addClass('odd');
}
});
});
};
var error = function() {
$(newItemRows).each(function() {
var $itemRow = this;
$itemRow.remove();
});
$loading.remove();
};
$loading.prependTo($item);
options.itemActions.add.action({
context: options.context,
data: data,
multiRule: multiRule,
response: {
success: function(args) {
var notificationError = function(args) {
error();
};
cloudStack.ui.notifications.add(args.notification,
complete, {},
notificationError, {});
},
error: error
}
});
};
if (!itemData) itemData = [{}];
if (!options.noSelect &&
$multi.find('th,td').filter(function() {
return $(this).attr('rel') == fieldName;
}).is(':hidden')) {
return true;
}
if (!field.isPassword) {
$td.attr('title', data[fieldName]);
if (field.edit) {
// Edit fields append value of data
if (field.range) {
var start = _s(data[field.range[0]]);
var end = _s(data[field.range[1]]);
$td.append($('').html(start + ' - ' + end));
} else {
var maxLengths = data['_maxLength'];
if (maxLengths &&
maxLengths[fieldName] &&
data[fieldName].length >= maxLengths[fieldName]) {
$td.append($('').html(_s(data[fieldName].toString().substr(0, maxLengths[fieldName] - 3).concat('...'))));
} else {
$td.append($('').html(_s(data[fieldName])));
}
}
} else if (field.isBoolean) {
var $checkbox = $('');
$checkbox.attr({
disabled: true,
name: fieldName,
type: 'checkbox'
});
if (_s(data[fieldName])) {
$checkbox.attr({
checked: true
});
}
$checkbox.appendTo($td);
} else if (field.select) {
// Get matching option text
var $matchingSelect = $multi.find('select')
.filter(function() {
return $(this).attr('name') == fieldName;
});
var $matchingOption = $matchingSelect.find('option')
.filter(function() {
return $(this).val() == data[fieldName];
});
if (selectPermission) {
// Wrap div to get its html code
selectedOptionHtml = $matchingOption.clone().wrap(' ').parent().html();
// Get html code from not matching option
$matchingSelect.find('option').each(
function() {
if ($(this).val() != data[fieldName]){
selectedOptionHtml += $(this).clone().wrap(' ').parent().html();
}
}
);
$select = $(' |