diff options
Diffstat (limited to 'install/ui/search.js')
-rw-r--r-- | install/ui/search.js | 462 |
1 files changed, 462 insertions, 0 deletions
diff --git a/install/ui/search.js b/install/ui/search.js new file mode 100644 index 000000000..934000b9f --- /dev/null +++ b/install/ui/search.js @@ -0,0 +1,462 @@ +/*jsl:import ipa.js */ + +/* 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 + * + * 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 <http://www.gnu.org/licenses/>. + */ + +/* REQUIRES: ipa.js */ + +IPA.search_widget = function (spec) { + + spec = spec || {}; + + var that = IPA.table_widget(spec); + + that.facet = spec.facet; + + that.create = function(container) { + + var search_controls = $('<div/>', { + 'class': 'search-controls' + }).appendTo(container); + + var search_filter = $('<span/>', { + 'class': 'search-filter', + 'name': 'search-filter' + }).appendTo(search_controls); + + search_controls.append(IPA.create_network_spinner()); + + this.filter = $('<input/>', { + 'type': 'text', + 'name': 'search-' + that.entity_name + '-filter' + }).appendTo(search_filter); + + $('<input/>', { + 'type': 'button', + 'name': 'find', + 'value': 'Find' + }).appendTo(search_filter); + + var action_panel = that.facet.get_action_panel(); + var li = $('.action-controls', action_panel); + + var search_buttons = $('<span/>', { + 'class': 'search-buttons' + }).appendTo(li); + + $('<input/>', { + 'type': 'button', + 'name': 'remove', + 'value': 'Remove' + }).appendTo(search_buttons); + + $('<input/>', { + 'type': 'button', + 'name': 'add', + 'value': 'Add' + }).appendTo(search_buttons); + + $('<div/>', { + 'class': 'search-results' + }).appendTo(container); + + that.table_create(container); + }; + + that.setup = function(container) { + + that.table_setup(container); + + var search_filter = $('span[name=search-filter]', that.container); + + var button = $('input[name=find]', search_filter); + that.find_button = IPA.button({ + 'label': IPA.messages.button.find, + 'icon': 'ui-icon-search', + 'click': function() { that.find(that.container); } + }); + button.replaceWith(that.find_button); + + var action_panel = that.facet.get_action_panel(); + var search_buttons = $('.search-buttons', action_panel); + + button = $('input[name=remove]', search_buttons); + that.remove_button = IPA.action_button({ + 'label': IPA.messages.button.remove, + 'icon': 'ui-icon-trash', + 'click': function() { that.remove(that.container); } + }); + button.replaceWith(that.remove_button); + + button = $('input[name=add]', search_buttons); + that.add_button = IPA.action_button({ + 'label': IPA.messages.button.add, + 'icon': 'ui-icon-plus', + 'click': function() { that.add(that.container); } + }); + button.replaceWith(that.add_button); + + var filter = $.bbq.getState(that.entity_name + '-filter', true) || ''; + this.filter.val(filter); + }; + + that.find = function(container) { + var filter = this.filter.val(); + var state = {}; + state[that.entity_name + '-filter'] = filter; + $.bbq.pushState(state); + }; + + that.add = function(container) { + + var entity = IPA.get_entity(that.entity_name); + + var dialog = entity.get_dialog('add'); + dialog.open(that.container); + + return false; + }; + + that.select_changed = function(){ + var count = 0; + var pkey; + $('input[name=select]:checked', that.tbody).each(function(input){ + count += 1; + pkey = $(this).val(); + }); + + var action_panel = that.facet.get_action_panel(); + if(count == 1){ + $('li.entity-facet', action_panel). + removeClass('entity-facet-disabled'); + var state = {}; + $('input[id=pkey]', action_panel).val(pkey); + }else{ + $('li.entity-facet', action_panel). + addClass('entity-facet-disabled'); + $('input', action_panel).val(null); + + } + return false; + }; + + + that.remove = function(container) { + + var values = that.get_selected_values(); + + if (!values.length) { + alert('Select '+that.label+' to be removed.'); + return; + } + + var title = 'Remove '+that.label; + + var dialog = IPA.deleter_dialog({ + 'title': title, + 'parent': that.container, + 'values': values + }); + + dialog.remove = function() { + + var batch = IPA.batch_command({ + 'on_success': function() { + that.refresh(); + dialog.close(); + }, + 'on_error': function() { + that.refresh(); + dialog.close(); + } + }); + + 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); + } + + batch.execute(); + }; + + dialog.init(); + + dialog.open(that.container); + }; + + that.refresh = function() { + + function on_success(data, text_status, xhr) { + + var action_panel = that.facet.get_action_panel(); + $('li.entity-facet', action_panel). + addClass('entity-facet-disabled'); + $('input', action_panel).val(null); + + that.tbody.empty(); + + var result = data.result.result; + for (var i = 0; i<result.length; i++) { + var record = that.get_record(result[i], 0); + that.add_record(record); + } + + var summary = $('span[name=summary]', that.tfoot); + if (data.result.truncated) { + summary.text( + 'Query returned more results than configured size limit '+ + 'will show. First ' + + data.result.count + ' results shown.'); + } else { + summary.text(data.result.summary); + } + } + + function on_error(xhr, text_status, error_thrown) { + var summary = $('span[name=summary]', that.tfoot).empty(); + summary.append('<p>Error: '+error_thrown.name+'</p>'); + summary.append('<p>'+error_thrown.title+'</p>'); + summary.append('<p>'+error_thrown.message+'</p>'); + } + + var filter = $.bbq.getState(that.entity_name + '-filter', true) || ''; + IPA.cmd( + 'find', [filter], {all: true}, on_success, on_error, + that.entity_name); + }; + + return that; +}; + +IPA.search_facet = function (spec) { + + spec = spec || {}; + + spec.display_class = 'search-facet'; + + var that = IPA.facet(spec); + + that.init = spec.init || init; + that.create = spec.create || create; + that.setup = spec.setup || setup; + that.refresh = spec.refresh || refresh; + + that.columns = []; + that.columns_by_name = {}; + + that.__defineGetter__("entity_name", function(){ + return that._entity_name; + }); + + that.__defineSetter__("entity_name", function(entity_name){ + that._entity_name = entity_name; + + for (var i=0; i<that.columns.length; i++) { + that.columns[i].entity_name = entity_name; + } + }); + + that.get_columns = function() { + return that.columns; + }; + + that.get_column = function(name) { + return that.columns_by_name[name]; + }; + + that.add_column = function(column) { + column.entity_name = that.entity_name; + that.columns.push(column); + that.columns_by_name[column.name] = column; + }; + + that.create_column = function(spec) { + var column = IPA.column(spec); + that.add_column(column); + return column; + }; + + that.setup_column = function(column) { + column.setup = function(container, record) { + container.empty(); + + var value = record[column.name]; + value = value ? value.toString() : ''; + + $('<a/>', { + 'href': '#'+value, + 'html': value, + 'click': function (value) { + return function() { + var state = IPA.tab_state(that.entity_name); + state[that.entity_name + '-facet'] = 'details'; + state[that.entity_name + '-pkey'] = value; + $.bbq.pushState(state); + return false; + }; + }(value) + }).appendTo(container); + }; + }; + + function init() { + + that.facet_init(); + + that.table = IPA.search_widget({ + 'id': that.entity_name+'-search', + 'name': 'search', 'label': IPA.metadata[that.entity_name].label, + 'entity_name': that.entity_name, + 'facet': that + }); + + for (var i=0; i<that.columns.length; i++) { + var column = that.columns[i]; + + var param_info = IPA.get_param_info(that.entity_name, column.name); + column.primary_key = param_info && param_info['primary_key']; + + if (column.primary_key) { + that.setup_column(column); + } + + that.table.add_column(column); + } + + that.table.init(); + } + + that.is_dirty = function() { + var filter = $.bbq.getState(that.entity_name + '-filter', true) || ''; + return filter != that.filter; + }; + + function create(container) { + + container.attr('title', that.entity_name); + + var span = $('<span/>', { 'name': 'search' }).appendTo(container); + + that.table.create(span); + + } + + function setup(container) { + that.facet_setup(container); + var span = $('span[name=search]', that.container); + that.table.setup(span); + } + + function refresh() { + that.filter = $.bbq.getState(that.entity_name + '-filter', true) || ''; + that.table.refresh(); + } + + if (spec.columns) { + for (var i=0; i<spec.columns.length; i++) { + var column = spec.columns[i]; + column.facet = that; + that.add_column(column); + } + } + + that.search_facet_init = that.init; + that.search_facet_create = that.create; + that.search_facet_setup = that.setup; + + return that; +}; + +function search_generate_tr(thead, tbody, entry_attrs) +{ + var obj_name = tbody.closest('.entity-container').attr('title'); + var pkey = IPA.metadata[obj_name].primary_key; + var pkey_value = entry_attrs[pkey]; + + var entity = IPA.get_entity(obj_name); + var facet = entity ? entity.get_facet('search') : null; + + tbody.append('<tr></tr>'); + var tr = tbody.children().last(); + search_generate_checkbox_td(tr, pkey_value); + + var ths = thead.find('th'); + for (var i = 1; i < ths.length; ++i) { + var jobj = $(ths[i]); + var attr = jobj.attr('abbr'); + var value = entry_attrs[attr]; + + var column = facet ? facet.get_column(attr) : null; + var render_call = window[jobj.attr('title')]; + + if (column && column.setup) { + column.setup(tr, attr, value, entry_attrs); + + } else if (typeof render_call == 'function') { + render_call(tr, attr, value, entry_attrs); + + } else + search_generate_td(tr, attr, value, entry_attrs); + } + + tbody.find('.search-a-pkey').click(function () { + var jobj = $(this); + + var state = {}; + state[obj_name + '-facet'] = 'details'; + state[obj_name + '-pkey'] = $(this).text(); + $.bbq.pushState(state); + + return (false); + }); +} + +function search_generate_checkbox_td(tr, pkey) +{ + var checkbox = $('<input />', { + name: pkey, + title: pkey, + type: 'checkbox', + 'class': 'search-selector' + }); + var td = $('<td></td>'); + + td.append(checkbox); + tr.append(td); +} + +var _search_td_template = '<td title="A">V</td>'; +var _search_a_pkey_template = '<a href="jslink" class="search-a-pkey">V</a>'; + +function search_generate_td(tr, attr, value, entry_attrs) +{ + var obj_name = tr.closest('.entity-container').attr('title'); + + var param_info = IPA.get_param_info(obj_name, attr); + if (param_info && param_info['primary_key']) + value = _search_a_pkey_template.replace('V', value); + + tr.append(_search_td_template.replace('A', attr).replace('V', value)); +} |