/*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({
method: that.other_entity+'_'+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({
method: that.entity_name+'_'+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() {
var state = IPA.tab_state(this.other_entity);
state[this.other_entity + '-facet'] = 'details';
state[this.other_entity + '-pkey'] = value;
$.bbq.pushState(state);
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 = [];
that.adder_columns_by_name = {};
that.get_adder_column = function(name) {
return that.adder_columns_by_name[name];
};
that.add_adder_column = function(column) {
that.adder_columns.push(column);
that.adder_columns_by_name[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 entity = IPA.get_entity(that.entity_name);
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
});
}
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 dialog = IPA.dialog({
title: IPA.messages.dialogs.dirty_title,
width: '20em'
});
dialog.create = function() {
dialog.container.append(IPA.messages.dialogs.dirty_message);
};
dialog.add_button(IPA.messages.buttons.ok, function() {
dialog.close();
});
dialog.init();
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()) {
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()) {
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) {
if (!that.values.length) return;
var batch = IPA.batch_command({
'name': that.entity_name+'_'+that.name,
'on_success': on_success,
'on_error': on_error
});
var length = that.values.length;
if (length > 100){
length = 100;
}
for (var i=0; i< length; i++) {
var value = that.values[i];
var command = IPA.command({
'method': that.other_entity+'_show',
'args': [value],
'options': {
'all': true,
'rights': true
}
});
batch.add_command(command);
}
batch.execute();
};
that.load = function(result) {
that.values = result[that.name] || [];
that.reset();
};
that.update = function() {
that.empty();
if (that.columns.length == 1) { // show pkey only
var name = that.columns[0].name;
for (var i=0; i', {
'href': '#'+value,
'html': value,
'click': function (value) {
return function() {
var state = IPA.tab_state(that.other_entity);
state[that.other_entity + '-facet'] = 'details';
state[that.other_entity + '-pkey'] = value;
$.bbq.pushState(state);
return false;
};
}(value)
}).appendTo(container);
};
}
for (i=0; i', {
'id': that.entity_name+'-'+that.other_entity,
html: $('',{ html: header_message })
}).appendTo(container);
var span = $('', { 'name': 'association' }).appendTo(container);
that.table.create(span);
var action_panel = that.get_action_panel();
var li = $('.action-controls', action_panel);
// creating generic buttons for layout
$('', {
'type': 'button',
'name': 'remove',
'value': IPA.messages.buttons.remove
}).appendTo(li);
$('', {
'type': 'button',
'name': 'add',
'value': IPA.messages.buttons.enroll
}).appendTo(li);
};
that.setup = function(container) {
that.facet_setup(container);
var span = $('span[name=association]', that.container);
that.table.setup(span);
// replacing generic buttons with IPA.button and setting click handler
var action_panel = that.get_action_panel();
var button = $('input[name=remove]', action_panel);
button.replaceWith(IPA.action_button({
'label': button.val(),
'icon': 'ui-icon-trash',
'click': function() { that.show_remove_dialog(); }
}));
button = $('input[name=add]', action_panel);
button.replaceWith(IPA.action_button({
'label': button.val(),
'icon': 'ui-icon-plus',
'click': function() { that.show_add_dialog(); }
}));
};
that.show_add_dialog = function() {
var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
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
});
if (that.adder_columns.length) {
dialog.set_columns(that.adder_columns);
}
dialog.execute = function() {
var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
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', true) || '';
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.get_records = function(pkeys, on_success, on_error) {
if (!pkeys.length) return;
var options = {
'all': true,
'rights': true
};
var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
var args =[];
/* TODO: make a general solution to generate this value */
var relationship_filter = 'in_' + that.entity_name;
options[relationship_filter] = pkey;
var command = IPA.command({
'on_success': on_success,
'on_error': on_error,
'method': that.other_entity+'_find',
'args': args,
options: options
});
command.execute();
};
that.refresh = function() {
function on_success(data, text_status, xhr) {
that.table.empty();
var pkeys = data.result.result[that.name];
if (!pkeys) return;
if (that.table.columns.length == 1) { // show pkey only
var name = that.table.columns[0].name;
for (var i=0; iError: '+error_thrown.name+'
');
summary.append(''+error_thrown.title+'
');
summary.append(''+error_thrown.message+'
');
}
var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || '';
IPA.cmd('show', [pkey], {'all': true, 'rights': true}, on_success, on_error, that.entity_name);
};
that.association_facet_init = that.init;
return that;
};
IPA.deleter_dialog_setup = function () {
var that = this;
var ul = $('');
ul.appendTo(that.dialog);
for (var i=0; i',{
'text': that.values[i]
}).appendTo(ul);
}
$('', {
'text': IPA.messages.search.delete_confirm
}).appendTo(that.dialog);
};