/*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; i', { '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; i