From 8eb53de49b7872f057cecb4ea607a1fc6e0947f3 Mon Sep 17 00:00:00 2001
From: Jason Etheridge <jason@esilibrary.com>
Date: Mon, 13 Jun 2011 15:51:18 -0400
Subject: [PATCH] add Print button and associated template for Holdings
 Maintenance wire up List Actions for Holdings Maintenance   * give List
 Actions support for nested rows in trees   * give util.list.print support for
 nested rows in trees   * we can leverage bib_brief_overlay to populate
 params.data for printing instead of fleshing out DOM

Signed-off-by: Jason Etheridge <jason@esilibrary.com>
Signed-off-by: Bill Erickson <berick@esilibrary.com>
---
 Open-ILS/web/opac/locale/en-US/lang.dtd            |  2 +
 .../staff_client/chrome/content/OpenILS/data.js    |  6 ++
 .../xul/staff_client/chrome/content/util/list.js   | 83 ++++++++++++++--------
 .../staff_client/server/cat/bib_brief_overlay.js   | 10 ++-
 .../xul/staff_client/server/cat/copy_browser.js    | 21 ++++++
 .../xul/staff_client/server/cat/copy_browser.xul   | 10 +++
 6 files changed, 103 insertions(+), 29 deletions(-)

diff --git a/Open-ILS/web/opac/locale/en-US/lang.dtd b/Open-ILS/web/opac/locale/en-US/lang.dtd
index 6b90ecd95c..404302432f 100644
--- a/Open-ILS/web/opac/locale/en-US/lang.dtd
+++ b/Open-ILS/web/opac/locale/en-US/lang.dtd
@@ -2618,6 +2618,8 @@
 <!ENTITY staff.cat.copy_browser.holdings_maintenance.save_columns.label "Save Columns">
 <!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_refresh_list.label "Refresh Listing">
 <!ENTITY staff.cat.copy_browser.holdings_maintenance.cmd_refresh_list.accesskey "R">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.print.label "Print">
+<!ENTITY staff.cat.copy_browser.holdings_maintenance.print.accesskey "P">
 <!ENTITY staff.cat.copy_buckets.window_title "Copy Buckets">
 <!ENTITY staff.cat.copy_buckets_overlay.pending_copies "Pending Copies">
 <!ENTITY staff.cat.copy_buckets_overlay.bucket_view "Bucket View">
diff --git a/Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js b/Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js
index 6b4894df4b..0d59bbc031 100644
--- a/Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js
+++ b/Open-ILS/xul/staff_client/chrome/content/OpenILS/data.js
@@ -438,6 +438,12 @@ OpenILS.data.prototype = {
                     'header' : 'This item needs to be routed to <b>%route_to%</b>:<br/>\r\n%route_to_org_fullname%<br/>\r\n%street1%<br/>\r\n%street2%<br/>\r\n%city_state_zip%<br/>\r\n<br/>\r\nBarcode: %item_barcode%<br/>\r\nTitle: %item_title%<br/>\r\nAuthor: %item_author%<br>\r\n<br/>\r\n%hold_for_msg%<br/>\r\nBarcode: %PATRON_BARCODE%<br/>\r\nNotify by phone: %notify_by_phone%<br/>\r\nNotify by email: %notify_by_email%<br/>\r\n',
                     'line_item' : '%formatted_note%<br/>\r\n',
                     'footer' : '<br/>\r\nRequest date: %request_date%<br/>\r\nSlip Date: %TODAY_TRIM%<br/>\r\nPrinted by %STAFF_FIRSTNAME% at %SHORTNAME%<br/>\r\n<br/>\r\n'
+                },
+                'holdings_maintenance' : {
+                    'type' : 'items',
+                    'header' : 'Title: %title%<br/>\r\nAuthor: %author%<br/>\r\nISBN: %isbn% Edition: %edition% PubDate: %pubdate%<br/>\r\nTCN: %tcn_value% Record ID: %mvr_doc_id%<br/>\r\nCreator: %creator% Create Date: %create_date%<br/>\r\nEditor: %editor% Edit Date: %edit_date%<hr/>\r\n',
+                    'line_item' : '%prefix% %tree_location% %suffix% %parts% %acp_status%<br/>\r\n',
+                    'footer' : '<hr />%SHORTNAME% %TODAY_TRIM%<br/>\r\n<br/>\r\n'
                 }
             }; 
 
diff --git a/Open-ILS/xul/staff_client/chrome/content/util/list.js b/Open-ILS/xul/staff_client/chrome/content/util/list.js
index a125c4d79c..d0b0f262fe 100644
--- a/Open-ILS/xul/staff_client/chrome/content/util/list.js
+++ b/Open-ILS/xul/staff_client/chrome/content/util/list.js
@@ -1165,22 +1165,31 @@ util.list.prototype = {
     '_dump_tree_with_keys' : function(params) {
         var obj = this;
         var dump = [];
-        for (var i = 0; i < this.treechildren.childNodes.length; i++) {
-            var row = {};
-            var treeitem = this.treechildren.childNodes[i];
-            var treerow = treeitem.firstChild;
-            for (var j = 0; j < treerow.childNodes.length; j++) {
-                if (typeof obj.columns[j] == 'undefined') {
-                    dump('=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n');
-                    dump('_dump_tree_with_keys @ ' + location.href + '\n');
-                    dump('\ttreerow.childNodes.length='+treerow.childNodes.length+' j='+j+' obj.columns.length='+obj.columns.length+'\n');
-                    debugger;
-                } else {
-                    row[ obj.columns[j].id ] = treerow.childNodes[j].getAttribute('label');
+
+        function process_tree(treechildren) {
+            for (var i = 0; i < treechildren.childNodes.length; i++) {
+                var row = {};
+                var treeitem = treechildren.childNodes[i];
+                var treerow = treeitem.firstChild;
+                for (var j = 0; j < treerow.childNodes.length; j++) {
+                    if (typeof obj.columns[j] == 'undefined') {
+                        dump('=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n');
+                        dump('_dump_tree_with_keys @ ' + location.href + '\n');
+                        dump('\ttreerow.childNodes.length='+treerow.childNodes.length+' j='+j+' obj.columns.length='+obj.columns.length+'\n');
+                        debugger;
+                    } else {
+                        row[ obj.columns[j].id ] = treerow.childNodes[j].getAttribute('label');
+                    }
+                }
+                dump.push( row );
+                if (treeitem.childNodes.length > 1) {
+                    process_tree(treeitem.lastChild);
                 }
             }
-            dump.push( row );
         }
+
+        process_tree(this.treechildren);
+
         return dump;
     },
 
@@ -1214,16 +1223,25 @@ util.list.prototype = {
             _dump += '"' + obj.columns[ ord_cols[j][1] ].label.replace(/"/g, '""') + '"';
         }
         _dump += '\r\n';
-        for (var i = 0; i < this.treechildren.childNodes.length; i++) {
-            var row = '';
-            var treeitem = this.treechildren.childNodes[i];
-            var treerow = treeitem.firstChild;
-            for (var j = 0; j < ord_cols.length; j++) {
-                if (row) row += ',';
-                row += '"' + treerow.childNodes[ ord_cols[j][1] ].getAttribute('label').replace(/"/g, '""') + '"';
+
+        function process_tree(treechildren) {
+            for (var i = 0; i < treechildren.childNodes.length; i++) {
+                var row = '';
+                var treeitem = treechildren.childNodes[i];
+                var treerow = treeitem.firstChild;
+                for (var j = 0; j < ord_cols.length; j++) {
+                    if (row) row += ',';
+                    row += '"' + treerow.childNodes[ ord_cols[j][1] ].getAttribute('label').replace(/"/g, '""') + '"';
+                }
+                _dump +=  row + '\r\n';
+                if (treeitem.childNodes.length > 1) {
+                    process_tree(treeitem.lastChild);
+                }
             }
-            _dump +=  row + '\r\n';
         }
+
+        process_tree(this.treechildren);
+
         return _dump;
     },
 
@@ -1252,15 +1270,24 @@ util.list.prototype = {
             if ( Number( a[0] ) > Number( b[0] ) ) return 1; 
             return 0;
         } );
-        for (var i = 0; i < this.treechildren.childNodes.length; i++) {
-            var row = document.getElementById('offlineStrings').getString('list.dump_extended_format.record_separator') + '\r\n';
-            var treeitem = this.treechildren.childNodes[i];
-            var treerow = treeitem.firstChild;
-            for (var j = 0; j < ord_cols.length; j++) {
-                row += obj.columns[ ord_cols[j][1] ].label + ': ' + treerow.childNodes[ ord_cols[j][1] ].getAttribute('label') + '\r\n';
+
+        function process_tree(treechildren) {
+            for (var i = 0; i < treechildren.childNodes.length; i++) {
+                var row = document.getElementById('offlineStrings').getString('list.dump_extended_format.record_separator') + '\r\n';
+                var treeitem = treechildren.childNodes[i];
+                var treerow = treeitem.firstChild;
+                for (var j = 0; j < ord_cols.length; j++) {
+                    row += obj.columns[ ord_cols[j][1] ].label + ': ' + treerow.childNodes[ ord_cols[j][1] ].getAttribute('label') + '\r\n';
+                }
+                _dump +=  row + '\r\n';
+                if (treeitem.childNodes.length > 1) {
+                    process_tree(treeitem.lastChild);
+                }
             }
-            _dump +=  row + '\r\n';
         }
+
+        process_tree(this.treechildren);
+
         return _dump;
     },
 
diff --git a/Open-ILS/xul/staff_client/server/cat/bib_brief_overlay.js b/Open-ILS/xul/staff_client/server/cat/bib_brief_overlay.js
index d55ea1e08d..b7dc24a55b 100644
--- a/Open-ILS/xul/staff_client/server/cat/bib_brief_overlay.js
+++ b/Open-ILS/xul/staff_client/server/cat/bib_brief_overlay.js
@@ -35,7 +35,11 @@ function bib_brief_overlay(params) {
         }
 
         JSAN.use('util.widgets');
-        function set(name,value) { 
+        function set(name,value) {
+            if (params.print_data) {
+                params.print_data[name] = value;
+                return 1;
+            }
             var nodes = document.getElementsByAttribute('name',name); 
             for (var i = 0; i < nodes.length; i++) {
                 util.widgets.set_text( nodes[i], value ); 
@@ -43,6 +47,10 @@ function bib_brief_overlay(params) {
             return nodes.length;
         }
         function set_tooltip(name,value) { 
+            if (params.print_data) {
+                params.print_data[name] = value;
+                return 1;
+            }
             var nodes = document.getElementsByAttribute('name',name); 
             for (var i = 0; i < nodes.length; i++) {
                 nodes[i].setAttribute('tooltiptext',value);
diff --git a/Open-ILS/xul/staff_client/server/cat/copy_browser.js b/Open-ILS/xul/staff_client/server/cat/copy_browser.js
index 2269e30de1..8d29b70da4 100644
--- a/Open-ILS/xul/staff_client/server/cat/copy_browser.js
+++ b/Open-ILS/xul/staff_client/server/cat/copy_browser.js
@@ -998,6 +998,24 @@ cat.copy_browser.prototype = {
                                 }
                                 obj.refresh_list();
                             }
+                        ],
+
+                        'cmd_print_tree' : [
+                            ['command'],
+                            function() {
+                                try {
+                                    var p = {
+                                        'template' : 'holdings_maintenance',
+                                        'mvr_id' : obj.docid,
+                                        'print_data' : {}
+                                    };
+                                    bib_brief_overlay(p);
+                                    p.data = p.print_data;
+                                    obj.list.print(p);
+                                } catch(E) {
+                                    alert('Error in copy_browser.js, cmd_print_tree: ' + E);
+                                }
+                            }
                         ]
                     }
                 }
@@ -1770,6 +1788,9 @@ cat.copy_browser.prototype = {
                 }
             );
 
+            $('list_actions').appendChild( obj.list.render_list_actions() );
+            obj.list.set_list_actions();
+
         } catch(E) {
             this.error.sdump('D_ERROR','cat.copy_browser.list_init: ' + E + '\n');
             alert(E);
diff --git a/Open-ILS/xul/staff_client/server/cat/copy_browser.xul b/Open-ILS/xul/staff_client/server/cat/copy_browser.xul
index 79028aa95e..359dd1265f 100644
--- a/Open-ILS/xul/staff_client/server/cat/copy_browser.xul
+++ b/Open-ILS/xul/staff_client/server/cat/copy_browser.xul
@@ -34,6 +34,7 @@ vim:noet:sw=4:ts=4:
 
     <script type="text/javascript" src="/xul/server/main/JSAN.js"/>
     <script type="text/javascript" src="/xul/server/cat/copy_browser.js"/>
+    <script type="text/javascript" src="/xul/server/cat/bib_brief_overlay.js"/>
     <script>
     <![CDATA[
         function my_init() {
@@ -99,6 +100,7 @@ vim:noet:sw=4:ts=4:
         <command id="cmd_mark_library"/>
         <command id="cmd_transfer_volume"/>
         <command id="cmd_refresh_list"/>
+        <command id="cmd_print_tree"/>
     </commandset>
 
     <popupset>
@@ -196,6 +198,14 @@ vim:noet:sw=4:ts=4:
             </menubar>
         </hbox>
         <tree id="copy_tree" flex="1" enableColumnDrag="true" context="copy_browser_actions"/>
+        <hbox>
+            <hbox id="list_actions" />
+            <button
+                label="&staff.cat.copy_browser.holdings_maintenance.print.label;"
+                accesskey="&staff.cat.copy_browser.holdings_maintenance.print.accesskey;"
+                command="cmd_print_tree"
+            />
+        </hbox>
     </groupbox>
 
 </window>
-- 
2.11.0