/* Authors: * Adam Young * Petr Vobornik * * 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 . */ /* CURRENTLY ALSO REQUIRES search.js, because it reuses it's code to create * the AssociationList elements; IT NEEDS IT'S OWN CODE! */ define(['./ipa', './jquery', './navigation', './text', './search', './dialog'], function(IPA, $, navigation, text) { IPA.associator = function (spec) { spec = spec || {}; var that = {}; that.entity = IPA.get_entity(spec.entity); that.pkey = spec.pkey; that.other_entity = IPA.get_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 batch = IPA.batch_command({ on_success: that.on_success, on_error: that.on_error }); var args, options, command; for(var i=0; i < that.values.length; i++) { args = [that.values[i]]; options = {}; options[that.entity.name] = that.pkey; command = IPA.command({ entity: that.other_entity.name, method: that.method, args: args, options: options }); batch.add_command(command); } //alert(JSON.stringify(command.to_json())); batch.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 command = IPA.command({ entity: that.entity.name, method: that.method, args: [that.pkey], options: { 'all': true }, on_success: that.on_success, on_error: that.on_error }); command.set_option(that.other_entity.name, that.values); //alert(JSON.stringify(command.to_json())); command.execute(); }; return that; }; /** * This dialog is for adding value of multivalued attribute which behaves like * association attribute. */ IPA.attribute_adder_dialog = function(spec) { spec = spec || {}; spec.name = spec.name || 'attr_adder_dialog'; spec.method = spec.method || 'add_member'; var metadata = IPA.get_command_option(spec.entity.name+'_'+spec.method, spec.attribute); spec.fields = spec.fields || [ { name: spec.attribute, metadata: metadata, required: true } ]; spec.title = spec.title || IPA.messages.dialogs.add_title.replace('${entity}', metadata.label); spec.subject = metadata.label; var that = IPA.entity_adder_dialog(spec); that.pkeys = spec.pkeys || []; that.create_add_command = function(record) { var command = that.entity_adder_dialog_create_add_command(record); command.add_args(that.pkeys); return command; }; that.create_buttons = function() { that.buttons.remove('add_and_edit'); }; that.on_add = function() { that.hide_message(); that.add( function(data, text_status, xhr) { if (data.result.completed > 0) { that.added.notify(); that.close(); that.notify_success(data); } }, that.on_error); }; that.create_buttons(); 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 = IPA.get_entity(spec.entity); that.pkey = spec.pkey; that.other_entity = IPA.get_entity(spec.other_entity); that.attribute_member = spec.attribute_member; that.exclude = spec.exclude || []; var init = function() { if (!that.get_columns().length) { var pkey_name = that.other_entity.metadata.primary_key; that.create_column({ entity: that.entity, name: pkey_name, label: that.other_entity.metadata.label, primary_key: true, width: '600px' }); } }; that.search = function() { function on_success(data, text_status, xhr) { that.clear_available_values(); var pkey_attr = that.other_entity.metadata.primary_key; var selected = that.get_selected_values(); var results = data.result; var same_entity = that.entity === that.other_entity; for (var i=0; i= 0) continue; if (selected.indexOf(pkey) >= 0) continue; that.add_available_value(result); } } var options = { all: true }; var relationships = that.other_entity.metadata.relationships; /* TODO: better generic handling of different relationships! */ var other_attribute_member = ''; if (that.attribute_member == 'member') other_attribute_member = 'memberof'; else if (that.attribute_member == 'memberuser') other_attribute_member = 'memberof'; else if (that.attribute_member == 'memberhost') other_attribute_member = 'memberof'; else if (that.attribute_member == 'memberof') other_attribute_member = 'member'; else if (that.attribute_member == 'managedby') other_attribute_member = 'managing'; var relationship = relationships[other_attribute_member]; if (relationship) { var param_name = relationship[2] + that.entity.name; var cmd_opt = IPA.get_command_option(that.other_entity.name + '_find', param_name); if (cmd_opt) { options[param_name] = that.pkey; } } IPA.command({ entity: that.other_entity.name, method: 'find', args: [that.get_filter()], options: options, on_success: on_success }).execute(); }; init(); return that; }; /** * This dialog is used for removing associations between two entities. */ IPA.association_deleter_dialog = function (spec) { spec = spec || {}; var that = IPA.deleter_dialog(spec); that.entity = IPA.get_entity(spec.entity); that.pkey = spec.pkey; that.other_entity = IPA.get_entity(spec.other_entity); that.values = spec.values; that.associator = spec.associator; that.method = spec.method || 'remove_member'; that.on_success = spec.on_success; that.on_error = spec.on_error; that.execute = function() { var associator = that.associator({ entity: that.entity, pkey: that.pkey, other_entity: that.other_entity, values: that.values, method: that.method, on_success: that.on_success, on_error: that.on_error }); associator.execute(); }; return that; }; IPA.association_config = function (spec) { spec = spec || {}; var that = {}; that.name = spec.name; that.associator = spec.associator; that.add_method = spec.add_method; that.remove_method = spec.remove_method; return that; }; IPA.association_table_widget = function (spec) { spec = spec || {}; var index = spec.name.indexOf('_'); spec.attribute_member = spec.attribute_member || spec.name.substring(0, index); spec.other_entity = spec.other_entity || spec.name.substring(index+1); spec.managed_entity = IPA.get_entity(spec.other_entity); var that = IPA.table_widget(spec); that.other_entity = IPA.get_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.add_title = text.get(spec.add_title || '@i18n:association.add.member'); that.remove_title = text.get(spec.remove_title || '@i18n:association.remove.member'); that.adder_columns = $.ordered_map(); that.needs_refresh = IPA.observer(); 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) { spec.entity = that.other_entity; var column = IPA.column(spec); that.add_adder_column(column); return column; }; that.create_columns = function() { // create a column if none defined if (!that.columns.length) { that.create_column({ name: that.name, label: that.label, entity: that.other_entity, primary_key: true, link: true }); } }; that.init_columns = function() { var column; var columns = that.columns.values; for (var i=0; i', { 'class': 'right-aligned-facet-controls' }).appendTo(that.controls); div.append(IPA.messages.association.show_results); div.append(' '); var name = that.entity.name+'-'+that.attribute_member+'-'+that.other_entity.name+'-type-radio'; var direct_id = name + '-direct'; that.direct_radio = $('', { id: direct_id, type: 'radio', name: name, value: 'direct', click: function() { that.association_type = $(this).val(); that.refresh(); return true; } }).appendTo(div); $('