/*jsl:import ipa.js */
/* Authors:
* Adam Young
*
* Copyright (C) 2010 Red Hat
* see file 'COPYING' for use and warranty information
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
/* REQUIRES: ipa.js */
/* CURRENTLY ALSO REQUIRES search.js, because it reuses it's code to create
* the AssociationList elements; IT NEEDS IT'S OWN CODE! */
IPA.associator = function (spec) {
spec = spec || {};
var that = {};
that.entity_name = spec.entity_name;
that.pkey = spec.pkey;
that.other_entity = spec.other_entity;
that.values = spec.values;
that.method = spec.method;
that.on_success = spec.on_success;
that.on_error = spec.on_error;
that.execute = function() {
};
return that;
};
/**
*This associator is built for the case where each association requires a separate rpc
*/
IPA.serial_associator = function(spec) {
spec = spec || {};
var that = IPA.associator(spec);
that.execute = function() {
if (!that.values || !that.values.length) {
that.on_success();
return;
}
var value = that.values.shift();
if (!value) {
that.on_success();
return;
}
var args = [value];
var options = {};
options[that.entity_name] = that.pkey;
var command = IPA.command({
entity: that.other_entity,
method: that.method,
args: args,
options: options,
on_success: that.execute,
on_error: that.on_error
});
//alert(JSON.stringify(command.to_json()));
command.execute();
};
return that;
};
/**
*This associator is for the common case where all the asociations can be sent
in a single rpc
*/
IPA.bulk_associator = function(spec) {
spec = spec || {};
var that = IPA.associator(spec);
that.execute = function() {
if (!that.values || !that.values.length) {
that.on_success();
return;
}
var value = that.values.shift();
if (!value) {
that.on_success();
return;
}
while (that.values.length > 0) {
value += ',' + that.values.shift();
}
var args = [that.pkey];
var options = { 'all': true };
options[that.other_entity] = value;
var command = IPA.command({
entity: that.entity_name,
method: that.method,
args: args,
options: options,
on_success: that.on_success,
on_error: that.on_error
});
//alert(JSON.stringify(command.to_json()));
command.execute();
};
return that;
};
/**
* This dialog is used for adding associations between two entities.
*/
IPA.association_adder_dialog = function (spec) {
spec = spec || {};
var that = IPA.adder_dialog(spec);
that.entity_name = spec.entity_name;
that.pkey = spec.pkey;
that.other_entity = spec.other_entity;
that.attribute_member = spec.attribute_member;
that.init = function() {
if (!that.columns.length) {
var pkey_name = IPA.metadata.objects[that.other_entity].primary_key;
that.create_column({
name: pkey_name,
label: IPA.metadata.objects[that.other_entity].label,
primary_key: true,
width: '200px'
});
}
/* FIXME: event not firing? */
$('input[name=hidememb]', that.container).click(that.search);
that.adder_dialog_init();
};
that.search = function() {
function on_success(data, text_status, xhr) {
var results = data.result;
that.clear_available_values();
var pkey_attr = IPA.metadata.objects[that.entity_name].primary_key;
for (var i=0; i', {
'href': '#'+value,
'html': value,
'click': function (value) {
return function() {
IPA.nav.show_page(other_entity, 'default', value);
return false;
};
}(value)
}).appendTo(container);
};
IPA.association_table_widget = function (spec) {
spec = spec || {};
var that = IPA.table_widget(spec);
that.other_entity = spec.other_entity;
that.attribute_member = spec.attribute_member;
that.associator = spec.associator || IPA.bulk_associator;
that.add_method = spec.add_method || 'add_member';
that.remove_method = spec.remove_method || 'remove_member';
that.adder_columns = $.ordered_map();
that.get_adder_column = function(name) {
return that.adder_columns.get(name);
};
that.add_adder_column = function(column) {
that.adder_columns.put(column.name, column);
};
that.create_adder_column = function(spec) {
var column = IPA.column(spec);
that.add_adder_column(column);
return column;
};
that.super_create_column = that.create_column;
that.create_column = function(spec){
if (spec.link_entity){
spec.setup = IPA.association_pkey_setup;
}
return that.super_create_column(spec);
};
/*this is duplicated in the facet... should be unified*/
var i;
if (spec.columns){
for (i = 0; i < spec.columns.length; i+= 1){
that.create_column(spec.columns[i]);
}
}
if (spec.adder_columns){
for (i = 0; i < spec.adder_columns.length; i+= 1){
that.create_adder_column(spec.adder_columns[i]);
}
}
that.create = function(container) {
var column;
// create a column if none defined
if (!that.columns.length) {
that.create_column({
'name': that.name,
'label': IPA.metadata.objects[that.other_entity].label,
'primary_key': true
});
}
var columns = that.columns.values;
for (var i=0; i', {
'type': 'button',
'name': 'remove',
'value': IPA.messages.buttons.remove
}).appendTo(buttons);
$('', {
'type': 'button',
'name': 'add',
'value': IPA.messages.buttons.add
}).appendTo(buttons);
};
that.setup = function(container) {
that.table_setup(container);
var entity = IPA.get_entity(that.entity_name);
var facet_name = IPA.current_facet(entity);
var facet = entity.get_facet(facet_name);
var button = $('input[name=remove]', container);
button.replaceWith(IPA.action_button({
'label': button.val(),
'icon': 'ui-icon-trash',
'click': function() {
if ($(this).hasClass('action-button-disabled')) {
return false;
}
if (facet.is_dirty()) {
var dialog = IPA.dirty_dialog({
facet: facet
});
dialog.callback = function() {
that.show_remove_dialog();
};
dialog.init();
dialog.open(that.container);
} else {
that.show_remove_dialog();
}
return false;
}
}));
button = $('input[name=add]', container);
button.replaceWith(IPA.action_button({
'label': button.val(),
'icon': 'ui-icon-plus',
'click': function() {
if ($(this).hasClass('action-button-disabled')) {
return false;
}
if (facet.is_dirty()) {
var dialog = IPA.dirty_dialog({
facet: facet
});
dialog.callback = function() {
that.show_add_dialog();
};
dialog.init();
dialog.open(that.container);
} else {
that.show_add_dialog();
}
return false;
}
}));
};
that.set_enabled = function(enabled) {
that.table_set_enabled(enabled);
if (enabled) {
$('.action-button', that.table).removeClass('action-button-disabled');
} else {
$('.action-button', that.table).addClass('action-button-disabled');
}
};
that.get_records = function(on_success, on_error) {
var length = that.values.length;
if (!length) return;
if (length > 100) {
length = 100;
}
var batch = IPA.batch_command({
'name': that.entity_name+'_'+that.name,
'on_success': on_success,
'on_error': on_error
});
for (var i=0; iError: '+error_thrown.name+'
');
summary.append('
'+error_thrown.message+'
');
}
var pkey = $.bbq.getState(that.entity_name+'-pkey');
IPA.command({
entity: that.entity_name,
method: 'show',
args: [pkey],
options: {'all': true, 'rights': true},
on_success: on_success,
on_error: on_error
}).execute();
};
// methods that should be invoked by subclasses
that.association_table_widget_init = that.init;
return that;
};
IPA.association_facet = function (spec) {
spec = spec || {};
var that = IPA.facet(spec);
that.attribute_member = spec.attribute_member;
that.other_entity = spec.other_entity;
that.facet_group = spec.facet_group;
that.read_only = spec.read_only;
that.associator = spec.associator || IPA.bulk_associator;
that.add_method = spec.add_method || 'add_member';
that.remove_method = spec.remove_method || 'remove_member';
that.columns = $.ordered_map();
that.adder_columns = $.ordered_map();
that.page_length = spec.page_length === undefined ? 20 : spec.page_length;
that.get_column = function(name) {
return that.columns.get(name);
};
that.add_column = function(column) {
that.columns.put(column.name, column);
};
that.resize = function(){
that.table.resize();
};
that.create_column = function(spec) {
var column = IPA.column(spec);
if (spec.link_entity){
column.setup = IPA.association_pkey_setup;
}
that.add_column(column);
return column;
};
that.get_adder_column = function(name) {
return that.adder_columns.get(name);
};
that.add_adder_column = function(column) {
that.adder_columns.put(column.name, column);
};
that.create_adder_column = function(spec) {
var column = IPA.column(spec);
that.add_adder_column(column);
return column;
};
var i;
if (spec.columns){
for (i = 0; i < spec.columns.length; i+= 1){
that.create_column(spec.columns[i]);
}
}
if (spec.adder_columns){
for (i = 0; i < spec.adder_columns.length; i+= 1){
that.create_adder_column(spec.adder_columns[i]);
}
}
that.init = function() {
that.facet_init();
var entity = IPA.get_entity(that.entity_name);
var column;
var i;
var label = IPA.metadata.objects[that.other_entity] ? IPA.metadata.objects[that.other_entity].label : that.other_entity;
var pkey_name = IPA.metadata.objects[that.other_entity].primary_key;
that.table = IPA.table_widget({
id: that.entity_name+'-'+that.other_entity,
name: pkey_name,
label: label,
entity_name: that.entity_name,
other_entity: that.other_entity,
page_length: that.page_length,
scrollable: true
});
var columns = that.columns.values;
if (columns.length) {
that.table.set_columns(columns);
} else {
column = that.table.create_column({
name: that.table.name,
label: IPA.metadata.objects[that.other_entity].label,
primary_key: true
});
column.setup = function(container, record) {
container.empty();
var value = record[column.name];
value = value ? value.toString() : '';
$('', {
'href': '#'+value,
'html': value,
'click': function (value) {
return function() {
IPA.nav.show_page(that.other_entity, 'default', value);
return false;
};
}(value)
}).appendTo(container);
};
}
for (i=0; i', { 'name': 'association' }).appendTo(container);
that.table.create(span);
};
that.setup = function(container) {
that.facet_setup(container);
var span = $('span[name=association]', that.container);
that.table.setup(span);
};
that.show = function() {
that.facet_show();
that.pkey = $.bbq.getState(that.entity_name+'-pkey');
that.entity.header.set_pkey(that.pkey);
that.entity.header.back_link.css('visibility', 'visible');
that.entity.header.facet_tabs.css('visibility', 'visible');
};
that.show_add_dialog = function() {
var pkey = $.bbq.getState(that.entity_name+'-pkey');
var label = IPA.metadata.objects[that.other_entity] ? IPA.metadata.objects[that.other_entity].label : that.other_entity;
var title = IPA.messages.association.add;
title = title.replace('${entity}', that.entity_name);
title = title.replace('${primary_key}', pkey);
title = title.replace('${other_entity}', label);
var dialog = IPA.association_adder_dialog({
'title': title,
'entity_name': that.entity_name,
'pkey': pkey,
'other_entity': that.other_entity,
'attribute_member': that.attribute_member
});
var adder_columns = that.adder_columns.values;
if (adder_columns.length) {
dialog.set_columns(adder_columns);
}
dialog.execute = function() {
var pkey = $.bbq.getState(that.entity_name+'-pkey');
var associator = that.associator({
'entity_name': that.entity_name,
'pkey': pkey,
'other_entity': that.other_entity,
'values': dialog.get_selected_values(),
'method': that.add_method,
'on_success': function() {
that.refresh();
dialog.close();
},
'on_error': function() {
that.refresh();
dialog.close();
}
});
associator.execute();
};
dialog.init();
dialog.open(that.container);
};
that.show_remove_dialog = function() {
var label = IPA.metadata.objects[that.other_entity] ? IPA.metadata.objects[that.other_entity].label : that.other_entity;
var values = that.table.get_selected_values();
if (!values.length) {
var message = IPA.messages.dialogs.remove_empty;
message = message.replace('${entity}', label);
alert(message);
return;
}
var pkey = $.bbq.getState(that.entity_name+'-pkey');
var title = IPA.messages.association.remove;
title = title.replace('${entity}', that.entity_name);
title = title.replace('${primary_key}', pkey);
title = title.replace('${other_entity}', label);
var dialog = IPA.association_deleter_dialog({
title: title,
entity_name: that.entity_name,
pkey: pkey,
other_entity: that.other_entity,
values: values
});
dialog.execute = function() {
var associator = that.associator({
entity_name: that.entity_name,
pkey: pkey,
other_entity: that.other_entity,
values: values,
method: that.remove_method,
on_success: function() {
that.refresh();
dialog.close();
},
on_error: function() {
that.refresh();
dialog.close();
}
});
associator.execute();
};
dialog.init();
dialog.open(that.container);
};
that.refresh_table = function() {
that.table.current_page_input.val(that.table.current_page);
that.table.total_pages_span.text(that.table.total_pages);
var pkeys = that.record[that.name];
if (!pkeys || !pkeys.length) {
that.table.empty();
that.table.summary.text('No entries.');
return;
}
pkeys.sort();
var total = pkeys.length;
var start = (that.table.current_page - 1) * that.table.page_length + 1;
var end = that.table.current_page * that.table.page_length;
end = end > total ? total : end;
var summary = 'Showing '+start+' to '+end+' of '+total+' entries.';
that.table.summary.text(summary);
var list = pkeys.slice(start-1, end);
var columns = that.table.columns.values;
if (columns.length == 1) { // show pkey only
var name = columns[0].name;
that.table.empty();
for (var i=0; iError: '+error_thrown.name+'');
summary.append('
'+error_thrown.message+'
');
}
);
}
};
that.get_records = function(pkeys, on_success, on_error) {
var length = pkeys.length;
if (!length) return;
var batch = IPA.batch_command({
'name': that.entity_name+'_'+that.name,
'on_success': on_success,
'on_error': on_error
});
for (var i=0; i