summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEndi S. Dewata <edewata@redhat.com>2011-05-27 16:30:41 -0500
committerAdam Young <ayoung@redhat.com>2011-05-31 17:24:08 -0400
commitb01220cc38b2bcaeb35931bda1dc9a258ff3850b (patch)
tree241e93cdcf757cab151cb2b70159811adaa685ab
parentfd639bc88c2b811fda538988593dc8898ea5ab6d (diff)
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.js146
-rw-r--r--install/ui/ipa.css19
-rw-r--r--install/ui/sudo.js9
-rw-r--r--install/ui/widget.js131
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() {