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

--
Endi S. Dewata
From fb05d4c5f5bfbf082da8a104aa93bdbe08368577 Mon Sep 17 00:00:00 2001
From: Endi S. Dewata <edew...@redhat.com>
Date: Fri, 27 May 2011 16:30:41 -0500
Subject: [PATCH] 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
---
 install/ui/associate.js |  152 ++++++++++++++++++++++++++++++-----------------
 install/ui/ipa.css      |   19 +++++-
 install/ui/sudo.js      |    9 +++-
 install/ui/widget.js    |  131 ++++++++++++++++++++++++++++-------------
 4 files changed, 212 insertions(+), 99 deletions(-)

diff --git a/install/ui/associate.js b/install/ui/associate.js
index 5eb84260eee57ef556db13cf4e04eeb9c430f52a..cae242339d77cf8561aefaaf1af2ba52e9a26398 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 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){
+        if (!length) return;
+
+        if (length > 100) {
             length = 100;
         }
 
-        for (var i=0; i< length; i++) {
+        var batch = IPA.batch_command({
+            'name': that.entity_name+'_'+that.name,
+            'on_success': on_success,
+            'on_error': on_error
+        });
+
+        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,100 @@ IPA.association_facet = function (spec) {
         dialog.open(that.container);
     };
 
+    that.refresh_table = function() {
+
+        that.table.empty();
+
+        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;
+        }
+
+        pkeys.sort();
+        var total = pkeys.length;
+
+        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 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;
+            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;
+                    for (var i=0; i<results.length; i++) {
+                        var record = results[i].result;
+                        that.table.add_record(record);
+                    }
+                }
+            );
+        }
+    };
+
     that.get_records = function(pkeys, on_success, on_error) {
 
-        if (!pkeys.length) return;
+        var length = pkeys.length;
+        if (!length) return;
 
-
-        var options = {
-            'all': true,
-            'rights': true
-        };
-
-        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 command = IPA.command({
-            entity: that.other_entity,
-            method: 'find',
-            args: args,
-            options: options,
-            on_success: on_success,
-            on_error: on_error
+        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,
+                    rights: 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();
+            that.table.current_page = 1;
 
-            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);
-                }
-
-            } 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) {
diff --git a/install/ui/ipa.css b/install/ui/ipa.css
index 826bd180b77d6444e158475bac4565fdbe375505..cc96cb801d173efde2943277dfa3b04ca1284b3c 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 89b7101bd04d10ea837752946064edb94cee2647..f5914687c4946e3422a65ce4edc7205bb381bc36 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 66dedbdfe12ea223aa42f5db8e9b35a24b7752dc..ac78de2594f760265cb66cfc61f6f431d59a3883 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() {
-- 
1.7.4

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to