diff options
Diffstat (limited to 'install/static/search.js')
-rw-r--r-- | install/static/search.js | 433 |
1 files changed, 195 insertions, 238 deletions
diff --git a/install/static/search.js b/install/static/search.js index 1dfeda41..ecdf56d2 100644 --- a/install/static/search.js +++ b/install/static/search.js @@ -1,6 +1,7 @@ /* Authors: * Pavel Zuna <pzuna@redhat.com> * Adam Young <ayoung@redhat.com> + * Endi S. Dewata <edewata@redhat.com> * * Copyright (C) 2010 Red Hat * see file 'COPYING' for use and warranty information @@ -21,299 +22,279 @@ /* REQUIRES: ipa.js */ -function ipa_search_column(spec) { +function ipa_search_widget(spec) { spec = spec || {}; - spec.init = spec.init || init; - spec.setup = spec.setup || setup; + var that = ipa_table_widget(spec); - var that = ipa_column_widget(spec); + that.super_create = that.super('create'); + that.super_setup = that.super('setup'); - function init() { - } + that.create = function(container) { - function setup(tr, attr, value, entry_attrs) { - search_generate_td(tr, attr, value, entry_attrs); - } + var div = $('#'+that.id); - return that; -} + var search_controls = $('<div/>', { + 'class': 'search-controls' + }).appendTo(div); -function ipa_search_facet(spec) { + var search_filter = $('<span/>', { + 'class': 'search-filter' + }).appendTo(search_controls); - spec = spec || {}; - - var that = ipa_facet(spec); + this.filter = $('<input/>', { + 'type': 'text', + 'name': 'search-' + that.entity_name + '-filter' + }).appendTo(search_filter); - that.init = spec.init || init; - that.setup = spec.setup || setup; + ipa_button({ + 'label': IPA.messages.button.find, + 'icon': 'ui-icon-search', + 'click': function() { that.find(container); } + }).appendTo(search_filter); - that.columns = []; - that.columns_by_name = {}; + ipa_button({ + 'label': IPA.messages.button.remove, + 'icon': 'ui-icon-trash', + 'click': function() { that.remove(container); } + }).appendTo(search_filter); - that.__defineGetter__("entity_name", function(){ - return that._entity_name; - }); + ipa_button({ + 'label': IPA.messages.button.add, + 'icon': 'ui-icon-plus', + 'click': function() { that.add(container); } + }).appendTo(search_filter); - that.__defineSetter__("entity_name", function(entity_name){ - that._entity_name = entity_name; + search_controls.append('<span class="search-buttons"></span>'); - for (var i=0; i<that.columns.length; i++) { - that.columns[i].entity_name = entity_name; - } - }); + var search_results = $('<div/>', { + 'class': 'search-results' + }).appendTo(div); - that.get_columns = function() { - return that.columns; + that.super_create(container); }; - that.get_column = function(name) { - return that.columns_by_name[name]; - }; + that.setup = function(container) { - that.add_column = function(column) { - column.entity_name = that.entity_name; - that.columns.push(column); - that.columns_by_name[column.name] = column; + that.super_setup(container); + + var filter = $.bbq.getState(that.entity_name + '-filter', true) || ''; + this.filter.val(filter); }; - that.create_column = function(spec) { - var column = ipa_search_column(spec); - that.add_column(column); - return column; + that.find = function(container) { + var filter = this.filter.val(); + var state = {}; + state[that.entity_name + '-filter'] = filter; + $.bbq.pushState(state); }; - function init() { - } + that.add = function(container) { - that.is_dirty = function() { - var filter = $.bbq.getState(that.entity_name + '-filter', true) || ''; - return filter != that.filter; + var entity = IPA.get_entity(that.entity_name); + + var dialog = entity.get_dialog('add'); + dialog.open(container); + + return false; }; - function setup(container, unspecified) { + that.remove = function(container) { - that.filter = $.bbq.getState(that.entity_name + '-filter', true) || ''; + var values = that.get_selected_values(); - search_create(that.entity_name, that.columns, container); + if (!values.length) { + alert('Select '+that.label+' to be removed.'); + return; + } - ipa_button({ - 'label': IPA.messages.button.add, - 'icon': 'ui-icon-plus', - 'click': function() { - var entity = IPA.get_entity(that.entity_name); - if (entity) { - entity.add_dialog.open(); - return false; - } + var title = 'Remove '+that.label; - var dialog = ipa_entity_get_add_dialog(that.entity_name); - dialog.open(); + var dialog = ipa_deleter_dialog({ + 'title': title, + 'parent': container, + 'values': values + }); - return false; - } - }).appendTo($('.search-controls', container)); + dialog.remove = function() { + var batch = ipa_batch_command(); - search_load(container, that.filter); - } + for (var i=0; i<values.length; i++) { + var command = ipa_command({ + 'method': that.entity_name+'_del' + }); + command.add_arg(values[i]); + batch.add_command(command); + } - if (spec.columns) { - for (var i=0; i<spec.columns.length; i++) { - var column = spec.columns[i]; - column.facet = that; - that.add_column(column); - } - } + batch.execute( + function() { + that.refresh(container); + dialog.close(); + }, + function() { + that.refresh(container); + dialog.close(); + } + ); + }; - that.init(); + dialog.init(); - return that; -} + dialog.open(container); + }; + that.refresh = function(container) { -function search_create(entity_name, columns, container) { + function on_success(data, text_status, xhr) { - function find_on_click() { - var filter = $(this).prev('input[type=text]').val(); - var state = {}; - state[entity_name + '-filter'] = filter; - $.bbq.pushState(state); - } + that.tbody.empty(); - function delete_on_click_outer() { - var delete_list = []; - var delete_dialog = $('<div></div>', { - title: IPA.messages.button.remove - }); + var result = data.result.result; + for (var i = 0; i<result.length; i++) { + var record = that.get_record(result[i], 0); + that.add_row(container, record); + } - function delete_on_click() { - ipa_cmd('del', delete_list, {}, delete_on_win, null, entity_name); - delete_dialog.dialog('close'); - } + var summary = $('span[name=summary]', that.tfoot); - function delete_on_win() { - for (var i = 0; i < delete_list.length; ++i) { - var chk = container.find( - '.search-selector[title=' + delete_list[i] + ']' + if (data.result.truncated) { + summary.text( + 'Query returned results than configured size limit will show.' + + 'First ' + data.result.count + ' results shown.' ); - if (chk) - chk.closest('tr').remove(); + } else { + summary.text(data.result.summary); } } - function cancel_on_click() { - delete_dialog.dialog('close'); + function on_error(xhr, text_status, error_thrown) { + var search_results = $('.search-results', container); + 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>'); } - container.find('.search-selector').each(function () { - var jobj = $(this); - if (jobj.attr('checked')) - delete_list.push(jobj.attr('title')); - }); + var filter = $.bbq.getState(that.entity_name + '-filter', true) || ''; + ipa_cmd( + 'find', [filter], {all: true}, on_success, on_error, that.entity_name + ); + }; - if (delete_list.length == 0) - return; + return that; +} - delete_dialog.text(IPA.messages.search.delete_confirm); +function ipa_search_column(spec) { - delete_dialog.dialog({ - modal: true, - buttons: { - 'Delete': delete_on_click, - 'Cancel': cancel_on_click - } - }); - } + spec = spec || {}; - if (!container) { - alert('ERROR: search_create: Second argument "container" missing!'); - return null; - } + var that = ipa_column_widget(spec); - container.attr('title', entity_name); + return that; +} - var search_controls = $('<div/>', { - 'class': 'search-controls' - }).appendTo(container); +function ipa_search_facet(spec) { - var search_filter = $('<span/>', { - 'class': 'search-filter' - }).appendTo(search_controls); + spec = spec || {}; - var filter = $('<input/>', { - 'type': 'text', - 'name': 'search-' + entity_name + '-filter' - }).appendTo(search_filter); + var that = ipa_facet(spec); - ipa_button({ - 'label': IPA.messages.button.find, - 'icon': 'ui-icon-search', - 'click': find_on_click - }).appendTo(search_filter); + that.init = spec.init || init; + that.create = spec.create || ipa_search_facet_create; + that.setup = spec.setup || setup; + that.load = spec.load || load; - ipa_button({ - 'label': IPA.messages.button.remove, - 'icon': 'ui-icon-trash', - 'click': delete_on_click_outer - }).appendTo(search_filter); + that.columns = []; + that.columns_by_name = {}; - search_controls.append('<span class="search-buttons"></span>'); + that.__defineGetter__("entity_name", function(){ + return that._entity_name; + }); - var search_results = $('<div/>', { - 'class': 'search-results' - }).appendTo(container); + that.__defineSetter__("entity_name", function(entity_name){ + that._entity_name = entity_name; - var search_table = $('<table/>', { - 'class': 'search-table' - }).appendTo(search_results); + for (var i=0; i<that.columns.length; i++) { + that.columns[i].entity_name = entity_name; + } + }); - search_table.append('<thead><tr></tr></thead>'); - search_table.append('<tbody></tbody>'); - search_table.append('<tfoot></tfoot>'); + that.get_columns = function() { + return that.columns; + }; - var tr = search_table.find('tr'); - search_insert_checkbox_th(tr); - for (var i = 0; i < columns.length; ++i) { - var c = columns[i]; - search_insert_th(tr, entity_name, c.name, c.label, c.setup); - } -} + that.get_column = function(name) { + return that.columns_by_name[name]; + }; -function search_insert_checkbox_th(jobj) -{ - function select_all_on_click() { - var jobj = $(this); + that.add_column = function(column) { + column.entity_name = that.entity_name; + that.columns.push(column); + that.columns_by_name[column.name] = column; + }; - var checked = jobj.is(':checked'); - if (checked) { - jobj.attr('title', 'Unselect All'); - } else { - jobj.attr('title', 'Select All'); - } + that.create_column = function(spec) { + var column = ipa_search_column(spec); + that.add_column(column); + return column; + }; - var chks = jobj.closest('.entity-container').find('.search-selector').get(); - for (var i = 0; i < chks.length; ++i) - chks[i].checked = checked; - } + function init() { - var checkbox = $('<input />', { - type: 'checkbox', - title: 'Select All' - }); - checkbox.click(select_all_on_click); + that.table = ipa_search_widget({ + 'id': that.entity_name+'-search', + 'name': that.entity_name, 'label': IPA.metadata[that.entity_name].label, + 'entity_name': that.entity_name + }); - var th = $('<th></th>'); - th.append(checkbox); + for (var i=0; i<that.columns.length; i++) { + var column = that.columns[i]; - jobj.append(th); -} + var param_info = ipa_get_param_info(that.entity_name, column.name); + var primary_key = param_info && param_info['primary_key']; -var _search_th_template = '<th abbr="A" title="C">N</th>'; + column.primary_key = primary_key; + column.link = primary_key; -function search_insert_th(jobj, obj_name, attr, name, render_call) -{ - var th = _search_th_template.replace('A', attr); + that.table.add_column(column); + } + } - var param_info = ipa_get_param_info(obj_name, attr); - if (param_info && param_info['label']) - th = th.replace('N', param_info['label']); - else - th = th.replace('N', name); + that.is_dirty = function() { + var filter = $.bbq.getState(that.entity_name + '-filter', true) || ''; + return filter != that.filter; + }; - if (typeof render_call == 'function') - th = th.replace('C', render_call.name); - else - th = th.replace('C', '-'); + function ipa_search_facet_create(container) { - jobj.append(th); -} + container.attr('title', that.entity_name); -function search_load(container, criteria, on_win, on_fail) -{ - var entity_name = container.attr('id'); + $('<div/>', { + 'id': that.entity_name+'-search' + }).appendTo(container); - function search_on_success(data, text_status, xhr) { - if (on_win) - on_win(data, text_status, xhr); - if (data.error) - return; - search_display(entity_name, data); + that.table.create(container); } - function search_on_error(xhr, text_status, error_thrown) { - if (on_fail) - on_fail(xhr, text_status, error_thrown); + function setup(container, unspecified) { + that.table.setup(container); + } + + function load(container, unspecified) { + that.filter = $.bbq.getState(that.entity_name + '-filter', true) || ''; + that.table.refresh(container); + } - var search_results = $('.search-results', container); - 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>'); + if (spec.columns) { + for (var i=0; i<spec.columns.length; i++) { + var column = spec.columns[i]; + column.facet = that; + that.add_column(column); + } } - ipa_cmd( - 'find', [criteria], {all: true}, search_on_success, search_on_error, entity_name - ); + return that; } function search_generate_tr(thead, tbody, entry_attrs) @@ -387,27 +368,3 @@ function search_generate_td(tr, attr, value, entry_attrs) tr.append(_search_td_template.replace('A', attr).replace('V', value)); } - -function search_display(obj_name, data) -{ - var selector = '.entity-container[title=' + obj_name + ']'; - var thead = $(selector + ' thead'); - var tbody = $(selector + ' tbody'); - var tfoot = $(selector + ' tfoot'); - - tbody.find('tr').remove(); - - var result = data.result.result; - for (var i = 0; i < result.length; ++i) - search_generate_tr(thead, tbody, result[i]); - - if (data.result.truncated) { - tfoot.text( - 'Query returned results than configured size limit will show.' + - 'First ' + data.result.count + ' results shown.' - ); - } else { - tfoot.text(data.result.summary); - } -} - |