diff options
author | Endi S. Dewata <edewata@redhat.com> | 2011-05-27 16:30:41 -0500 |
---|---|---|
committer | Adam Young <ayoung@redhat.com> | 2011-05-31 17:24:08 -0400 |
commit | b01220cc38b2bcaeb35931bda1dc9a258ff3850b (patch) | |
tree | 241e93cdcf757cab151cb2b70159811adaa685ab | |
parent | fd639bc88c2b811fda538988593dc8898ea5ab6d (diff) | |
download | freeipa-b01220cc38b2bcaeb35931bda1dc9a258ff3850b.tar.gz freeipa-b01220cc38b2bcaeb35931bda1dc9a258ff3850b.tar.xz freeipa-b01220cc38b2bcaeb35931bda1dc9a258ff3850b.zip |
Added pagination for associations.
The association facet has been modified to support pagination. The
UI will show 20 members per page. There are buttons to go to a
previous or next page. There is also an input text to jump directly
to a certain page.
Ticket #1011
-rw-r--r-- | install/ui/associate.js | 146 | ||||
-rw-r--r-- | install/ui/ipa.css | 19 | ||||
-rw-r--r-- | install/ui/sudo.js | 9 | ||||
-rw-r--r-- | install/ui/widget.js | 131 |
4 files changed, 210 insertions, 95 deletions
diff --git a/install/ui/associate.js b/install/ui/associate.js index 5eb84260e..ad2da5216 100644 --- a/install/ui/associate.js +++ b/install/ui/associate.js @@ -468,19 +468,20 @@ IPA.association_table_widget = function (spec) { that.get_records = function(on_success, on_error) { - if (!that.values.length) return; + 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 }); - var length = that.values.length; - if (length > 100){ - length = 100; - } - for (var i=0; i< length; i++) { + for (var i=0; i<length; i++) { var value = that.values[i]; var command = IPA.command({ @@ -706,6 +707,8 @@ IPA.association_facet = function (spec) { that.columns = $.ordered_map(); that.adder_columns = $.ordered_map(); + that.page_length = 20; + that.get_column = function(name) { return that.columns.get(name); }; @@ -765,7 +768,8 @@ IPA.association_facet = function (spec) { name: pkey_name, label: label, entity_name: that.entity_name, - other_entity: that.other_entity + other_entity: that.other_entity, + page_length: that.page_length }); var columns = that.columns.values; @@ -810,6 +814,10 @@ IPA.association_facet = function (spec) { column.entity_name = that.other_entity; } + that.table.refresh = function() { + that.refresh_table(); + }; + that.table.init(); }; @@ -978,66 +986,103 @@ IPA.association_facet = function (spec) { dialog.open(that.container); }; - that.get_records = function(pkeys, on_success, on_error) { + that.refresh_table = function() { - if (!pkeys.length) return; + that.table.current_page_input.val(that.table.current_page); + that.table.total_pages_span.text(that.table.total_pages); + var pkeys = that.record[that.name]; + if (!pkeys || !pkeys.length) { + that.table.summary.text('No entries.'); + return; + } - var options = { - 'all': true, - 'rights': true - }; + pkeys.sort(); + var total = pkeys.length; - var pkey = $.bbq.getState(that.entity_name+'-pkey'); - var args =[]; - /* TODO: make a general solution to generate this value */ - var relationship_filter = 'in_' + that.entity_name; - options[relationship_filter] = pkey; + var start = (that.table.current_page - 1) * that.table.page_length + 1; + var end = that.table.current_page * that.table.page_length; + end = end > total ? total : end; - var command = IPA.command({ - entity: that.other_entity, - method: 'find', - args: args, - options: options, - on_success: on_success, - on_error: on_error + 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<list.length; i++) { + var entry = {}; + entry[name] = list[i]; + that.table.add_record(entry); + } + + } else { // get and show additional fields + that.get_records( + list, + function(data, text_status, xhr) { + var results = data.result.results; + that.table.empty(); + for (var i=0; i<results.length; i++) { + var record = results[i].result; + that.table.add_record(record); + } + }, + function(xhr, text_status, error_thrown) { + that.table.empty(); + var summary = that.table.summary.empty(); + summary.append('<p>Error: '+error_thrown.name+'</p>'); + summary.append('<p>'+error_thrown.message+'</p>'); + } + ); + } + }; + + that.get_records = function(pkeys, on_success, on_error) { + + var length = pkeys.length; + if (!length) return; + + var batch = IPA.batch_command({ + 'name': that.entity_name+'_'+that.name, + 'on_success': on_success, + 'on_error': on_error }); - command.execute(); + for (var i=0; i<length; i++) { + var pkey = pkeys[i]; + + var command = IPA.command({ + entity: that.other_entity, + method: 'show', + args: [pkey], + options: { all: true } + }); + batch.add_command(command); + } + batch.execute(); }; that.refresh = function() { function on_success(data, text_status, xhr) { + that.record = data.result.result; - that.table.empty(); - - var pkeys = data.result.result[that.name]; - if (!pkeys) return; - - var columns = that.table.columns.values; - if (columns.length == 1) { // show pkey only - var name = columns[0].name; - for (var i=0; i<pkeys.length; i++) { - var record = {}; - record[name] = pkeys[i]; - that.table.add_record(record); - } + that.table.current_page = 1; - } else { // get and show additional fields - that.get_records( - pkeys, - function(data, text_status, xhr) { - var results = data.result.result; - for (var i=0; i<results.length; i++) { - var record = results[i]; - that.table.add_record(record); - } - } - ); + var pkeys = that.record[that.name]; + if (pkeys) { + that.table.total_pages = + Math.ceil(pkeys.length / that.table.page_length); + } else { + that.table.total_pages = 1; } + + that.refresh_table(); } function on_error(xhr, text_status, error_thrown) { @@ -1052,7 +1097,6 @@ IPA.association_facet = function (spec) { entity: that.entity_name, method: 'show', args: pkey, - options: {'all': true, 'rights': true}, on_success: on_success, on_error: on_error }).execute(); diff --git a/install/ui/ipa.css b/install/ui/ipa.css index 826bd180b..cc96cb801 100644 --- a/install/ui/ipa.css +++ b/install/ui/ipa.css @@ -642,11 +642,26 @@ a.action-button-disabled { border: 1px solid #dfdfdf; } -.search-table tfoot tr td span{ +.search-table tfoot tr td { border-top: 1px solid #dfdfdf; margin-top: 1em; padding: 0.9em 0 0 1em; - display: block; +} + +.search-table span[name=summary] { + float: left; +} + +.search-table span[name=pagination] { + float: right; +} + +.search-table span[name=pagination] a { + cursor:pointer; +} + +.search-table span[name=pagination] input[name=current_page] { + width: 22px; } .aci-attribute-table tbody{ diff --git a/install/ui/sudo.js b/install/ui/sudo.js index 38075f9b0..f7ccd3cfd 100644 --- a/install/ui/sudo.js +++ b/install/ui/sudo.js @@ -160,6 +160,13 @@ IPA.sudocmd_member_sudocmdgroup_table_widget = function (spec) { that.get_records = function(on_success, on_error) { + var length = that.values.length; + if (!length) return; + + if (length > 100) { + length = 100; + } + if (!that.values.length) return; var batch = IPA.batch_command({ @@ -168,7 +175,7 @@ IPA.sudocmd_member_sudocmdgroup_table_widget = function (spec) { 'on_error': on_error }); - for (var i=0; i<that.values.length; i++) { + for (var i=0; i<length; i++) { var value = that.values[i]; var command = IPA.command({ diff --git a/install/ui/widget.js b/install/ui/widget.js index 66dedbdfe..ac78de259 100644 --- a/install/ui/widget.js +++ b/install/ui/widget.js @@ -1055,6 +1055,10 @@ IPA.table_widget = function (spec) { that.scrollable = spec.scrollable; that.save_values = typeof spec.save_values == 'undefined' ? true : spec.save_values; + that.current_page = 1; + that.total_pages = 1; + that.page_length = spec.page_length; + that.columns = $.ordered_map(); that.get_columns = function() { @@ -1098,29 +1102,39 @@ IPA.table_widget = function (spec) { that.create = function(container) { - var table = $('<table/>', { + that.table = $('<table/>', { 'class': 'search-table' }).appendTo(container); - that.table = table; if (that.scrollable) { - table.addClass('scrollable'); + that.table.addClass('scrollable'); } - var thead = $('<thead/>').appendTo(table); - that.thead = thead; + that.thead = $('<thead/>').appendTo(that.table); - var tr = $('<tr/>').appendTo(thead); + var tr = $('<tr/>').appendTo(that.thead); var th = $('<th/>', { 'style': 'width: 22px;' }).appendTo(tr); - $('<input/>', { - 'type': 'checkbox', - 'name': 'select' + var select_all_checkbox = $('<input/>', { + type: 'checkbox', + name: 'select', + title: IPA.messages.search.select_all }).appendTo(th); + select_all_checkbox.change(function() { + var checked = select_all_checkbox.is(':checked'); + select_all_checkbox.attr('title', checked ? IPA.messages.search.unselect_all : IPA.messages.search.select_all); + var checkboxes = $('input[name=select]', that.tbody).get(); + for (var i=0; i<checkboxes.length; i++) { + checkboxes[i].checked = checked; + } + that.select_changed(); + return false; + }); + var columns = that.columns.values; for (var i=0; i<columns.length; i++) { var column = columns[i]; @@ -1154,18 +1168,17 @@ IPA.table_widget = function (spec) { } } - var tbody = $('<tbody/>').appendTo(table); - that.tbody = tbody; + that.tbody = $('<tbody/>').appendTo(that.table); if (that.height) { - tbody.css('height', that.height); + that.tbody.css('height', that.height); } - tr = $('<tr/>').appendTo(tbody); + that.row = $('<tr/>'); var td = $('<td/>', { 'style': 'width: 22px;' - }).appendTo(tr); + }).appendTo(that.row); $('<input/>', { 'type': 'checkbox', @@ -1176,7 +1189,7 @@ IPA.table_widget = function (spec) { for (/* var */ i=0; i<columns.length; i++) { /* var */ column = columns[i]; - td = $('<td/>').appendTo(tr); + td = $('<td/>').appendTo(that.row); if (column.width) { td.css('width', column.width); } @@ -1186,16 +1199,74 @@ IPA.table_widget = function (spec) { }).appendTo(td); } - var tfoot = $('<tfoot/>').appendTo(table); - that.tfoot = tfoot; + that.tfoot = $('<tfoot/>').appendTo(that.table); - tr = $('<tr/>').appendTo(tfoot); + tr = $('<tr/>').appendTo(that.tfoot); td = $('<td/>', { colspan: columns.length+1 }).appendTo(tr); - $('<span/>', { + that.summary = $('<span/>', { 'name': 'summary' }).appendTo(td); + + that.pagination = $('<span/>', { + 'name': 'pagination' + }).appendTo(td); + + if (that.page_length) { + + $('<a/>', { + text: 'Prev', + name: 'prev_page', + click: function() { + if (that.current_page > 1) { + that.current_page--; + that.refresh(); + } + return false; + } + }).appendTo(that.pagination); + + that.pagination.append(' '); + + $('<a/>', { + text: 'Next', + name: 'next_page', + click: function() { + if (that.current_page < that.total_pages) { + that.current_page++; + that.refresh(); + } + return false; + } + }).appendTo(that.pagination); + + that.pagination.append(' Page: '); + + that.current_page_input = $('<input/>', { + type: 'text', + name: 'current_page', + keypress: function(e) { + if (e.which == 13) { + var page = parseInt($(this).val(), 10); + if (page < 1) { + page = 1; + } else if (page > that.total_pages) { + page = that.total_pages; + } + that.current_page = page; + $(this).val(page); + that.refresh(); + } + } + }).appendTo(that.pagination); + + that.pagination.append(' / '); + + that.total_pages_span = $('<span/>', { + name: 'total_pages' + }).appendTo(that.pagination); + } }; that.select_changed = function(){ @@ -1204,28 +1275,6 @@ IPA.table_widget = function (spec) { that.setup = function(container) { that.widget_setup(container); - -// that.table = $('table', that.container); -// that.thead = $('thead', that.table); -// that.tbody = $('tbody', that.table); -// that.tfoot = $('tfoot', that.table); - - var select_all_checkbox = $('input[name=select]', that.thead); - select_all_checkbox.attr('title', IPA.messages.search.select_all); - - select_all_checkbox.change(function() { - var checked = select_all_checkbox.is(':checked'); - select_all_checkbox.attr('title', checked ? IPA.messages.search.unselect_all : IPA.messages.search.select_all); - var checkboxes = $('input[name=select]', that.tbody).get(); - for (var i=0; i<checkboxes.length; i++) { - checkboxes[i].checked = checked; - } - that.select_changed(); - return false; - }); - - that.row = that.tbody.children().first(); - that.row.detach(); }; that.empty = function() { |