/*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.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,
'class': 'content-table',
name: pkey_name,
label: label,
entity_name: that.entity_name,
other_entity: that.other_entity,
page_length: that.page_length,
scrollable: true,
selectable: !that.read_only
});
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 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