diff options
Diffstat (limited to 'install/static/associate.js')
-rw-r--r-- | install/static/associate.js | 717 |
1 files changed, 368 insertions, 349 deletions
diff --git a/install/static/associate.js b/install/static/associate.js index 2050e468..088d4079 100644 --- a/install/static/associate.js +++ b/install/static/associate.js @@ -22,227 +22,196 @@ /* CURRENTLY ALSO REQUIRES search.js, because it reuses it's code to create * the AssociationList elements; IT NEEDS IT'S OWN CODE! */ +function ipa_associator(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 */ -function serial_associate(form, manyObjPkeys, on_success) -{ - var associator = this; - this.form = form; - this.manyObjPkeys = manyObjPkeys; - this.on_success = on_success; - - this.associate_next = function(){ - var form = this.form; - //TODO assert pre-conditions - var manyObjPkey = manyObjPkeys.shift(); - if (manyObjPkey){ - var options = {}; - options[form.oneObj] = form.pkey; - var args = [manyObjPkey]; - - ipa_cmd( form.method,args, options , - function(data, text_status, xhr) { - if (data.error){ - alert('error adding member: '+data.error.message); - }else{ - associator.associate_next(); - } - }, - function(xhr, text_status, error_thrown) { - alert('associateFailure'); - }, - form.manyObj ); - }else{ - associator.on_success(); - } - } - this.associate_next(); -} +function serial_associator(spec) { + spec = spec || {}; -function serial_delete(delete_method, one_entity, one_entity_pkey, many_entity, - many_entity_pkeys, on_success){ - var that = {}; - that.one_entity = one_entity; - that.on_success = on_success; - that.many_entity_pkeys = many_entity_pkeys; - that.delete_next = function(){ - var many_entity_pkey = this.many_entity_pkeys.shift(); - if (many_entity_pkey){ - var options = {}; - options[one_entity] = one_entity_pkey; - var args = [many_entity_pkey]; - ipa_cmd( delete_method,args, options , - function(data, text_status, xhr) { - if (data.error){ - alert("error deleting member: " - +data.error.message); - }else{ - that.delete_next(); - } - }, - function(xhr, text_status, error_thrown) { - alert("associateFailure"); - }, - many_entity ); - }else{ - this.on_success(); + var that = ipa_associator(spec); + + that.execute = function() { + + if (!that.values || !that.values.length) { + that.on_success(); + return; } - } - that.delete_next(); -} + var value = that.values.shift(); + if (!value) { + that.on_success(); + return; + } -function bulk_delete(delete_method, one_entity, one_entity_pkey, many_entity, - many_entity_pkeys, on_success){ - if (many_entity_pkeys.length){ + var args = [value]; var options = {}; - options[one_entity] = one_entity_pkey; - var option = many_entity_pkeys.shift(); - while(many_entity_pkeys.length > 0) { - option += ',' + many_entity_pkeys.shift(); - } + options[that.entity_name] = that.pkey; + + ipa_cmd( + that.method, + args, + options, + that.execute, + that.on_error, + that.other_entity + ); + }; - var options = { - 'all':true - }; - options[many_entity] = option; - var args = [one_entity_pkey]; - ipa_cmd( delete_method,args, options , - function(data, text_status, xhr) { - if (data.error){ - alert("error deleting member: " - +data.error.message); - }else{ - on_success(); - } - }, - function(xhr, text_status, error_thrown) { - alert("associateFailure"); - }, - one_entity ); - }else{ - on_success(); - } + return that; } - /** *This associator is for the common case where all the asociations can be sent in a single rpc */ -function bulk_associate(form, manyObjPkeys, on_success) -{ - var associator = this; - this.form = form; - this.manyObjPkeys = manyObjPkeys; - this.on_success = on_success; - - var form = this.form; - var option = manyObjPkeys.shift(); - while(manyObjPkeys.length > 0) { - option += ',' + manyObjPkeys.shift(); - } - var options = { - 'all':true +function bulk_associator(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; + + ipa_cmd( + that.method, + args, + options, + that.on_success, + that.on_error, + that.entity_name + ); }; - options[form.manyObj] = option; - var args = [form.pkey]; - ipa_cmd( form.method,args, options , - function(data, text_status, xhr) { - if (data.error){ - alert('error adding member: '+data.error.message); - }else{ - associator.on_success(); - } - }, - function(xhr, text_status, error_thrown) { - alert('associateFailure'); - }, - form.oneObj ); + + return that; } /** * Create a form for a one to many association. * */ -function AssociationForm(oneObj, pkey, manyObj, on_success, associator, method) -{ - var form = this; +function ipa_adder_dialog(spec) { - this.oneObj = oneObj; - this.pkey = pkey; - this.manyObj = manyObj; - this.on_success = on_success; + spec = spec || {}; - this.dialog = $('<div></div>'); + var that = {}; - //An optional parameter to determine what ipa method to call to create - //the association - if (method) - this.method = method; - else - this.method = 'add_member'; + that.name = spec.name; + that.title = spec.title; + that.entity_name = spec.entity_name; - this.associator = associator; + that.pkey = spec.pkey; + that.other_entity = spec.other_entity; + that.setup = spec.setup || ipa_adder_dialog_setup; + that.execute = spec.execute || execute; + that.on_success = spec.on_success; + that.on_error = spec.on_error; + that.associator = spec.associator; + that.method = spec.method || 'add_member'; - this.setup = function() { - var label = IPA.metadata[form.manyObj].label; + that.dialog = $('<div/>', { + 'title': that.title + }); - form.dialog.attr('title', 'Enroll '+form.oneObj+' '+form.pkey+' in '+label); + that.open = function() { - association_form_create(form.dialog); + that.setup(); - var availableList = $('#availableList', form.dialog); + var availableList = $('#availableList', that.dialog); availableList.html(''); - var enrollments = $('#enrollments', form.dialog); + var enrollments = $('#enrollments', that.dialog); enrollments.html(''); - $('#addToList', form.dialog).click(function(){ - $('#availableList :selected', form.dialog).each(function(i, selected){ + $('#addToList', that.dialog).click(function(){ + $('#availableList :selected', that.dialog).each(function(i, selected){ enrollments.append(selected); }); - $('#availableList :selected', form.dialog).remove(); + $('#availableList :selected', that.dialog).remove(); }); - $('#removeFromList', form.dialog).click(function(){ - $('#enrollments :selected', form.dialog).each(function(i, selected){ + $('#removeFromList', that.dialog).click(function(){ + $('#enrollments :selected', that.dialog).each(function(i, selected){ availableList.append(selected); }); - $('#enrollments :selected', form.dialog).remove(); + $('#enrollments :selected', that.dialog).remove(); }); - $('#find', form.dialog).click(function(){ - form.search(); + $('#find', that.dialog).click(function(){ + that.search(); }); - form.dialog.dialog({ + that.dialog.dialog({ modal: true, width: 600, buttons: { - 'Enroll': function(evt) { - form.associate(form.on_success); + 'Enroll': function() { + var values = []; + $('#enrollments', that.dialog).children().each(function (i, selected) { + values.push(selected.value); + }); + that.execute(values); }, - 'Cancel': form.close + 'Cancel': that.close } }); }; - this.close = function() { - form.dialog.dialog('close'); + that.close = function() { + that.dialog.dialog('close'); }; - this.search = function() { + that.search = function() { function search_on_win(data, text_status, xhr) { var results = data.result; - var list = $('#availableList', form.dialog); + var list = $('#availableList', that.dialog); list.html(''); - var searchColumn = IPA.metadata[form.manyObj].primary_key; + var searchColumn = IPA.metadata[that.other_entity].primary_key; for (var i =0; i != results.count; i++){ var result = results.result[i]; @@ -257,246 +226,298 @@ function AssociationForm(oneObj, pkey, manyObj, on_success, associator, method) alert('associationSearchFailure'); } - var queryFilter = $('#associateFilter', form.dialog).val(); - ipa_cmd('find', [queryFilter], {}, search_on_win, null, form.manyObj); + var queryFilter = $('#associateFilter', that.dialog).val(); + ipa_cmd('find', [queryFilter], {}, search_on_win, null, that.other_entity); }; - this.associate = function (on_success) { - var manyObjPkeys = []; - $('#enrollments', form.dialog).children().each(function (i, selected) { - manyObjPkeys.push(selected.value); + that.get_values = function() { + var values = []; + $('#enrollments', that.dialog).children().each(function (i, selected) { + values.push(selected.value); }); - this.associator(form, manyObjPkeys, on_success); + return values; }; -} -function ipa_association_config(spec) { - spec = spec || {}; + function execute(values) { - var that = {}; + var associator = that.associator({ + 'entity_name': that.entity_name, + 'pkey': that.pkey, + 'other_entity': that.other_entity, + 'values': that.get_values(), + 'method': that.method, + 'on_success': that.on_success, + 'on_error': that.on_error + }); - that.name = spec.name; - that.associator = spec.associator; - that.method = spec.method; + associator.execute(); + } return that; } -function ipa_association_facet(spec) { +function ipa_deleter_dialog(spec) { spec = spec || {}; - var that = ipa_facet(spec); + var that = {}; - that.configs = []; - that.configs_by_name = {}; + that.name = spec.name; + that.title = spec.title || IPA.messages.button.deletes; + that.entity_name = spec.entity_name; - that.other_entity = null; + that.pkey = spec.pkey; + that.other_entity = spec.other_entity; + + that.setup = spec.setup || ipa_deleter_dialog_setup; + that.execute = spec.execute || execute; + that.on_success = spec.on_success; + that.on_error = spec.on_error; + + that.associator = spec.associator; + that.method = spec.method || 'remove_member'; + + that.values = spec.values || []; - that.get_configs = function() { - return that.configs; + that.dialog = $('<div/>', { + 'title': that.title, + 'class': 'search-dialog-delete' + }); + + that.add_value = function(value) { + that.values.push(value); }; - that.get_config = function(name) { - return that.configs_by_name[name]; + that.set_values = function(values) { + that.values = that.values.concat(values); }; - that.add_config = function(config) { - that.configs.push(config); - that.configs_by_name[config.name] = config; + that.get_values = function() { + return that.values; }; - that.create_config = function(spec) { - var config = ipa_association_config(spec); - that.add_config(config); - return config; + that.open = function() { + + that.setup(); + + that.dialog.dialog({ + modal: true, + width: 400, + buttons: { + 'Delete': that.execute, + 'Cancel': that.close + } + }); }; - that.is_dirty = function() { - var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || ''; - var other_entity = $.bbq.getState(that.entity_name + '-enroll', true) || ''; - return pkey != that.pkey || other_entity != that.other_entity; + function execute() { + + var associator = that.associator({ + 'entity_name': that.entity_name, + '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(); + } + + that.close = function() { + that.dialog.dialog('close'); }; - that.setup = function(container, unspecified) { + return that; +} - that.pkey = $.bbq.getState(that.entity_name + '-pkey', true) || ''; - that.other_entity = $.bbq.getState(that.entity_name + '-enroll', true) || ''; +function ipa_association_config(spec) { + spec = spec || {}; - that.member_attrribute = ipa_get_member_attribute(that.entity_name, that.other_entity); - that.columns = [ - { - 'title': IPA.metadata[that.other_entity].label, - 'column': that.member_attrribute + '_' + that.other_entity - } - ]; + var that = {}; - var config = that.get_config(that.other_entity); + that.name = spec.name; + that.associator = spec.associator; + that.add_method = spec.add_method; + that.delete_method = spec.delete_method; - if ( config && config.associator === 'serial' ){ - that.associator = serial_associate; - that.deleter = serial_delete; - }else{ - that.associator = bulk_associate; - that.deleter = bulk_delete; - } + return that; +} - that.method = config ? config.method : null; +function ipa_association_widget(spec) { - that.setup_views(container); + spec = spec || {}; - //TODO I18N - var header_message = that.other_entity + '(s) enrolled in ' + - that.entity_name + ' ' + that.pkey; - container.append($('<h2/>',{html: header_message }) ); - association_list_create(that.entity_name, container); - container.find('.search-filter').css('display', 'none'); - container.find('.search-buttons').html(''); + spec.add = spec.add || add; + spec.remove = spec.remove || remove; + + var that = ipa_table_widget(spec); + + that.other_entity = spec.other_entity; + + that.super_create = that.super('create'); + that.super_setup = that.super('setup'); + + that.create = function(container) { + + that.member_attribute = ipa_get_member_attribute(that.entity_name, that.other_entity); - var ctrls = container.find('.search-buttons'); + that.create_column({ + 'name': that.member_attribute + '_' + that.other_entity, + 'label': IPA.metadata[that.other_entity].label, + 'primary_key': true + }); + + that.super_create(container); + + var div = $('#'+that.id, container); + var buttons = $('span[name=buttons]', div); - ipa_make_button( 'ui-icon-plus',IPA.messages.button.enroll). - click(function() { - that.show_enrollment_dialog(container); - }).appendTo(ctrls); + $('<input/>', { + 'type': 'button', + 'name': 'remove', + 'value': IPA.messages.button.delete + }).appendTo(buttons); - ipa_make_button('ui-icon-trash',IPA.messages.button.delete). - click(function(){ - that.delete_on_click(container); - }).appendTo(ctrls); + $('<input/>', { + 'type': 'button', + 'name': 'add', + 'value': IPA.messages.button.enroll + }).appendTo(buttons); + } + + that.setup = function(container) { + that.super_setup(container); + var entity = IPA.get_entity(that.entity_name); + var association = entity.get_association(that.other_entity); - var header = container.find('.search-table thead:last').find("tr");; - for (var i =0 ; i != that.columns.length ;i++){ - $('<th></th>',{ - html: that.columns[i].title - }).appendTo(header); + if (association && association.associator == 'serial') { + that.associator = serial_associator; + } else { + that.associator = bulk_associator; } - that.refresh(container); + + that.add_method = association ? association.add_method : null; + that.delete_method = association ? association.delete_method : null; }; - that.delete_on_click = function(container) { - var delete_list = []; - var delete_dialog = $('<div></div>', { - title: IPA.messages.button.delete, - 'class': 'search-dialog-delete' - }); + function add(container) { - function delete_on_click() { - that.deleter('remove_member', that.entity_name, - that.pkey, that.other_entity, delete_list, - function(){ that.refresh(container)}); - delete_dialog.dialog('close'); - } - function delete_on_win() { - delete_dialog.dialog('close'); - } - function cancel_on_click() { - delete_dialog.dialog('close'); - } - var confirm_list = $('<ul/>'); - var delete_list = []; - container.find('.search-selector').each(function () { - if (this.checked){ - delete_list.push(this.title); - confirm_list.append($('<li/>',{text: this.title})); + var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || ''; + var label = IPA.metadata[that.other_entity].label; + var title = 'Enroll '+that.entity_name+' '+pkey+' in '+label; + + var dialog = ipa_adder_dialog({ + 'name': 'adder_dialog', + 'title': title, + 'entity_name': that.entity_name, + 'pkey': pkey, + 'other_entity': that.other_entity, + 'associator': that.associator, + 'method': that.add_method, + 'on_success': function() { + that.refresh(container); + dialog.close(); + }, + 'on_error': function() { + that.refresh(container); + dialog.close(); } }); - if (delete_list.length == 0){ + + dialog.open(); + } + + function remove(container) { + + var values = that.get_selected_values(); + + if (!values.length) { + alert('Select '+that.label+' to be removed.'); return; } - delete_dialog.append(confirm_list); - delete_dialog.append( - $('<p/>', - {text:IPA.messages.search.delete_confirm})); - - delete_dialog.dialog({ - modal: true, - buttons: { - 'Delete': delete_on_click, - 'Cancel': cancel_on_click + var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || ''; + var label = IPA.metadata[that.other_entity].label; + var title = 'Remove '+label+' from '+that.entity_name+' '+pkey; + + var dialog = ipa_deleter_dialog({ + 'name': 'deleter_dialog', + 'title': title, + 'entity_name': that.entity_name, + 'pkey': pkey, + 'other_entity': that.other_entity, + 'values': values, + 'associator': that.associator, + 'method': that.delete_method, + 'on_success': function() { + that.refresh(container); + dialog.close(); + }, + 'on_error': function() { + that.refresh(container); + dialog.close(); } }); + + dialog.open(); } - that.refresh = function(container) { + return that; +} - function refresh_on_success(data, text_status, xhr) { - var tbody = container.find('.search-table tbody'); - tbody.empty(); - var associationList = data.result.result[that.columns[0].column]; - //TODO, this is masking an error where the wrong - //direction association is presented upon page reload. - //if the associationList is unset, it is because - //form.associationColumns[0] doesn't exist in the results - if (!associationList) return; +function ipa_association_facet(spec) { + spec = spec || {}; - for (var j = 0; j < associationList.length; j++){ - var association = associationList[j]; - var row = $('<tr/>').appendTo(tbody); - search_generate_checkbox_td(row, association); + var that = ipa_facet(spec); + that.other_entity = null; - for (var k = 0; k < that.columns.length ;k++){ - var column = that.columns[k].column; - $('<td></td>',{ - html:data.result.result[column][j], - }).appendTo(row); - } - } + that.is_dirty = function() { + var pkey = $.bbq.getState(that.entity_name + '-pkey', true) || ''; + var other_entity = $.bbq.getState(that.entity_name + '-enroll', true) || ''; + return pkey != that.pkey || other_entity != that.other_entity; + }; - tbody.find('.search-a-pkey').click(function () { - var jobj = $(this); - var state = {}; - state[that.other_entity + '-facet'] = 'details'; - state[that.other_entity + '-pkey'] = $(this).text(); - //Before this will work, we need to set the tab one level up - //for example: - //state['identity'] = 0; - //but we have no way of getting the index. - - $.bbq.pushState(state); - return (false); - }); - } + that.setup = function(container, unspecified) { - function refresh_on_error(xhr, text_status, error_thrown) { - var search_results = $('.search-results', container).empty(); - search_results.append('<p>Error: '+error_thrown.name+'</p>'); - search_results.append('<p>'+error_thrown.title+'</p>'); - search_results.append('<p>'+error_thrown.message+'</p>'); - } + that.pkey = $.bbq.getState(that.entity_name + '-pkey', true) || ''; + that.other_entity = $.bbq.getState(that.entity_name + '-enroll', true) || ''; - ipa_cmd('show', [that.pkey], {}, refresh_on_success, refresh_on_error, that.entity_name); - }; + that.setup_views(container); - that.show_enrollment_dialog = function(container) { + //TODO I18N + var header_message = that.other_entity + '(s) enrolled in ' + + that.entity_name + ' ' + that.pkey; + container.append( $('<h2/>',{ html: header_message }) ); + $('<div/>', { + 'id': that.entity_name+'-'+that.other_entity + }).appendTo(container); + var table = ipa_association_widget({ + 'id': that.entity_name+'-'+that.other_entity, + 'name': that.other_entity, 'label': IPA.metadata[that.other_entity].label, + 'entity_name': that.entity_name, 'other_entity': that.other_entity + }); - var enrollment_dialog = new AssociationForm( - that.entity_name, - that.pkey, - that.other_entity, - function() { - that.refresh(container); - enrollment_dialog.close(); - }, - that.associator, - that.method - ); - enrollment_dialog.setup(); + table.create(container); + table.setup(container); + table.refresh(container); }; return that; } -function association_form_create(jobj) -{ +function ipa_adder_dialog_setup() { + + var that = this; + var div = $('<div id="associations"></div>'); var form = $('<form></form>'); @@ -561,27 +582,8 @@ function association_form_create(jobj) })); form_div.append(sub_div); form.append(form_div); - form.append($('<hr />')); - form.append($('<div></div>', { - text: 'Message Area' - })); - form.append($('<hr />')); - var form_div = $('<div></div>'); - var span = $('<span></span>'); - span.css('float', 'left'); - span.append($('<p></p>', { - text: '*Enter Group Names and Press Groups' - })); - span.append($('<p></p>', { - text: '*More stuff' - })); - span.append($('<p></p>', { - text: '*More stuff' - })); - form_div.append(span); - form.append(form_div); div.append(form); - jobj.append(div); + that.dialog.append(div); } function association_list_create(obj_name, jobj) @@ -589,3 +591,20 @@ function association_list_create(obj_name, jobj) search_create(obj_name, [], jobj); } +function ipa_deleter_dialog_setup() { + + var that = this; + + var ul = $('<ul/>'); + ul.appendTo(that.dialog); + + for (var i=0; i<that.values.length; i++) { + $('<li/>',{ + 'text': that.values[i] + }).appendTo(ul); + } + + $('<p/>', { + 'text': IPA.messages.search.delete_confirm + }).appendTo(that.dialog); +}
\ No newline at end of file |