circ_tree
authorphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Tue, 12 Jul 2005 19:18:25 +0000 (19:18 +0000)
committerphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Tue, 12 Jul 2005 19:18:25 +0000 (19:18 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@1155 dcc99617-32d9-48b4-a31d-7c20da2025e4

Evergreen/staff_client/chrome/content/evergreen/Open-ILS/OpenILS.js
Evergreen/staff_client/chrome/content/evergreen/Open-ILS/OpenILS_scripts_overlay.xul
Evergreen/staff_client/chrome/content/evergreen/circ/circ_tree.js [new file with mode: 0644]
Evergreen/staff_client/chrome/content/evergreen/circ/circ_tree.xul [new file with mode: 0644]
Evergreen/staff_client/chrome/content/evergreen/circ/circ_tree_overlay.xul [new file with mode: 0644]
Evergreen/staff_client/chrome/content/evergreen/patron/patron_display.js
Evergreen/staff_client/chrome/content/evergreen/util/error.js
Evergreen/staff_client/chrome/content/evergreen/util/spawn_win.js

index 2de431c..2014eb1 100644 (file)
@@ -15,6 +15,7 @@ function OpenILS_init(params) {
                        case 'PatronDisplay' : patron_display_init(params); break;
                        case 'PatronDisplayStatus' : patron_display_status_init(params); break;
                        case 'PatronDisplayContact' : patron_display_contact_init(params); break;
+                       case 'CircTree' : circ_tree_init(params); break;
                }
 
        } catch(E) { sdump('D_ERROR',js2JSON(E)+'\n'); }
@@ -47,6 +48,7 @@ function OpenILS_exit(params) {
                        case 'PatronDisplay' : patron_display_exit(params); break;
                        case 'PatronDisplayStatus' : patron_display_status_exit(params); break;
                        case 'PatronDisplayContact' : patron_display_contact_exit(params); break;
+                       case 'CircTree' : circ_tree_exit(params); break;
                }
 
        } catch(E) { sdump('D_ERROR',js2JSON(E)+'\n'); }
index 5a5c35b..73ea079 100644 (file)
@@ -18,6 +18,7 @@
                <script src="chrome://evergreen/content/patron/patron_display.js" />
                <script src="chrome://evergreen/content/patron/patron_display_status.js" />
                <script src="chrome://evergreen/content/patron/patron_display_contact.js" />
+               <script src="chrome://evergreen/content/circ/circ_tree.js" />
        </apps>
 
 </overlay>
diff --git a/Evergreen/staff_client/chrome/content/evergreen/circ/circ_tree.js b/Evergreen/staff_client/chrome/content/evergreen/circ/circ_tree.js
new file mode 100644 (file)
index 0000000..ceaecca
--- /dev/null
@@ -0,0 +1,172 @@
+sdump('D_TRACE','Loading circ_tree.js\n');
+
+function circ_tree_init(p) {
+       sdump('D_CIRC_TREE',"TESTING: circ_tree.js: " + mw.G['main_test_variable'] + '\n');
+       sdump('D_TRACE_ENTER',arg_dump(arguments));
+
+       p.w.circ_cols = [
+               {
+                       'id' : 'barcode', 'label' : getString('acp_label_barcode'), 'flex' : 1,
+                       'primary' : true, 'hidden' : false, 'fm_class' : 'acp', 'fm_field_render' : '.barcode()'
+               },
+               {
+                       'id' : 'call_number', 'label' : getString('acp_label_call_number'), 'flex' : 1,
+                       'primary' : false, 'hidden' : true, 'fm_class' : 'acp', 'fm_field_render' : '.call_number()'
+               },
+               {
+                       'id' : 'copy_number', 'label' : getString('acp_label_copy_number'), 'flex' : 1,
+                       'primary' : false, 'hidden' : true, 'fm_class' : 'acp', 'fm_field_render' : '.copy_number()'
+               },
+               {
+                       'id' : 'status', 'label' : getString('acp_label_status'), 'flex' : 1,
+                       'primary' : false, 'hidden' : true, 'fm_class' : 'acp', 'fm_field_render' : '.status()'
+               },
+               {
+                       'id' : 'location', 'label' : getString('acp_label_location'), 'flex' : 1,
+                       'primary' : false, 'hidden' : true, 'fm_class' : 'acp', 'fm_field_render' : '.location()'
+               },
+               {
+                       'id' : 'loan_duration', 'label' : getString('acp_label_loan_duration'), 'flex' : 1,
+                       'primary' : false, 'hidden' : true, 'fm_class' : 'acp', 'fm_field_render' : '.loan_duration()'
+               },
+               {
+                       'id' : 'circ_lib', 'label' : getString('acp_label_circ_lib'), 'flex' : 1,
+                       'primary' : false, 'hidden' : true, 'fm_class' : 'acp', 'fm_field_render' : '.circ_lib()'
+               },
+               {
+                       'id' : 'fine_level', 'label' : getString('acp_label_fine_level'), 'flex' : 1,
+                       'primary' : false, 'hidden' : true, 'fm_class' : 'acp', 'fm_field_render' : '.fine_level()'
+               },
+               {
+                       'id' : 'deposit', 'label' : getString('acp_label_deposit'), 'flex' : 1,
+                       'primary' : false, 'hidden' : true, 'fm_class' : 'acp', 'fm_field_render' : '.deposit()'
+               },
+               {
+                       'id' : 'deposit_amount', 'label' : getString('acp_label_deposit_amount'), 'flex' : 1,
+                       'primary' : false, 'hidden' : true, 'fm_class' : 'acp', 'fm_field_render' : '.deposit_amount()'
+               },
+               {
+                       'id' : 'price', 'label' : getString('acp_label_price'), 'flex' : 1,
+                       'primary' : false, 'hidden' : true, 'fm_class' : 'acp', 'fm_field_render' : '.price()'
+               },
+               {
+                       'id' : 'circ_as_type', 'label' : getString('acp_label_circ_as_type'), 'flex' : 1,
+                       'primary' : false, 'hidden' : true, 'fm_class' : 'acp', 'fm_field_render' : '.circ_as_type()'
+               },
+               {
+                       'id' : 'circ_modifier', 'label' : getString('acp_label_circ_modifier'), 'flex' : 1,
+                       'primary' : false, 'hidden' : true, 'fm_class' : 'acp', 'fm_field_render' : '.circ_modifier()'
+               },
+               {
+                       'id' : 'xact_start', 'label' : getString('circ_label_xact_start'), 'flex' : 1,
+                       'primary' : false, 'hidden' : true, 'fm_class' : 'circ', 'fm_field_render' : '.xact_start()'
+               },
+               {
+                       'id' : 'xact_finish', 'label' : getString('circ_label_xact_finish'), 'flex' : 1,
+                       'primary' : false, 'hidden' : true, 'fm_class' : 'circ', 'fm_field_render' : '.xact_finish()'
+               },
+               {
+                       'id' : 'renewal_remaining', 'label' : getString('circ_label_renewal_remaining'), 'flex' : 1,
+                       'primary' : false, 'hidden' : false, 'fm_class' : 'circ', 'fm_field_render' : '.renewal_remaining()'
+               },
+               {
+                       'id' : 'due_date', 'label' : getString('circ_label_due_date'), 'flex' : 1,
+                       'primary' : false, 'hidden' : false, 'fm_class' : 'circ', 'fm_field_render' : '.due_date()'
+               },
+               {
+                       'id' : 'title', 'label' : getString('mvr_label_title'), 'flex' : 1,
+                       'primary' : false, 'hidden' : false, 'fm_class' : 'mvr', 'fm_field_render' : '.title()'
+               },
+               {
+                       'id' : 'author', 'label' : getString('mvr_label_author'), 'flex' : 1,
+                       'primary' : false, 'hidden' : false, 'fm_class' : 'mvr', 'fm_field_render' : '.author()'
+               }
+               
+       ];
+
+        p.w.tree_win = spawn_paged_tree(
+                p.w.document, 'new_iframe', p.paged_tree, { 
+                       'cols' : p.w.circ_cols,
+                       'onload' : circ_tree_init_after_paged_tree(p) 
+               }
+        );
+
+       p.w.register_circ_select_callback = function (f) {
+               p.w._circ_select_callback = f;
+       }
+
+       p.w.register_flesh_circ_function = function (f) {
+               p.w._flesh_circ_function = f;
+       }
+
+       p.w.register_context_builder = function (f) {
+               p.w._context_function = f;
+       }
+
+       p.w.map_circ_to_cols = function (circ, treeitem) {
+               circ_tree_map_circ_to_cols(p, circ, treeitem);  
+       }
+
+        if (p.onload) {
+                try {
+                       sdump('D_TRACE','trying psuedo-onload: ' + p.onload + '\n');
+                        p.onload(p.w);
+                } catch(E) {
+                        sdump('D_ERROR', js2JSON(E) + '\n' );
+                }
+        }
+       sdump('D_TRACE_EXIT',arg_dump(arguments));
+       return;
+}
+
+function circ_tree_init_after_paged_tree(p) {
+       sdump('D_CIRC_TREE',arg_dump(arguments));
+       sdump('D_TRACE_ENTER',arg_dump(arguments));
+       var result = function (tree_win) {
+               sdump('D_TRACE_ENTER',arg_dump(arguments));
+               sdump('D_CIRC_TREE',arg_dump(arguments));
+               tree_win.register_select_callback( p.w._circ_select_callback );
+               tree_win.register_flesh_row_function( p.w._flesh_circ_function );
+               tree_win.register_context_builder( p.w._context_function );
+               p.w.add_circs = tree_win.add_rows;
+               p.w.clear_circs = tree_win.clear_tree;
+               try {
+                       if (p.paged_tree_onload) p.paged_tree_onload(tree_win);
+               } catch(E) {
+                        sdump('D_ERROR', js2JSON(E) + '\n' );
+               }
+               sdump('D_TRACE_EXIT',arg_dump(arguments));
+               return;
+       };
+       sdump('D_TRACE_EXIT',arg_dump(arguments));
+       return result;
+}
+
+function circ_tree_map_circ_to_cols(p, circ, treeitem) {
+       sdump('D_CIRC_TREE',arg_dump(arguments,{1:true}));
+       sdump('D_TRACE_ENTER',arg_dump(arguments));
+       var cols = new Array();
+       for (var i = 0; i < p.w.circ_cols.length; i++) {
+               var hash = p.w.circ_cols[i];
+               sdump('D_CIRC_TREE','Considering ' + js2JSON(hash) + '\n');
+               var obj_string;
+               switch( hash.fm_class ) {
+                       case 'acp' : obj_string = 'circ.copy'; break;
+                       case 'circ' : obj_string = 'circ.circ'; break;
+                       case 'mvr' : obj_string = 'circ.record'; break;
+               }
+               var cmd = parse_render_string( obj_string, hash.fm_field_render );
+               sdump('D_CIRC_TREE','cmd = ' + cmd + '\n');
+               var col = '';
+               try {
+                       col = eval( cmd );
+                       sdump('D_CIRC_TREE','eval = ' + col + '\n');
+               } catch(E) {
+                       sdump('D_ERROR',js2JSON(E) + '\n');
+               }
+               cols.push( col );
+       }
+       sdump('D_CIRC_TREE','cols = ' + js2JSON(cols) + '\n');
+       p.w.tree_win.map_cols_to_treeitem( cols, treeitem );
+       sdump('D_TRACE_EXIT',arg_dump(arguments));
+}
diff --git a/Evergreen/staff_client/chrome/content/evergreen/circ/circ_tree.xul b/Evergreen/staff_client/chrome/content/evergreen/circ/circ_tree.xul
new file mode 100644 (file)
index 0000000..3dd7dab
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!-- Clamlication: Evergreen Staff Client -->
+
+<!-- Localization -->
+<!DOCTYPE page SYSTEM "chrome://evergreen/locale/circ_tree.dtd">
+
+<page id="circ_tree_win"
+       orient="vertical" style="overflow: auto" width="800" height="500"
+       sizemode="maximized" persist="width height" 
+       onload="params.w = window; params.paged_tree = 'CircTree_pagedtree'; params.app = 'CircTree'; mw.OpenILS_init(params);"
+       onunload="mw.OpenILS_exit(params);"
+       xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+       <script>mw.sdump('D_TRACE','Loading circ_tree.xul\n');</script>
+
+       <!-- Stylesheets -->
+       <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+       <?xml-stylesheet href="chrome://evergreen/skin/evergreen.css" type="text/css"?>
+       <?xml-stylesheet href="chrome://evergreen/skin/circ_tree.css" type="text/css"?>
+       
+       <!-- Overlays for this XUL file -->
+       <?xul-overlay href="chrome://evergreen/content/circ/circ_tree_overlay.xul"?>
+
+       <!-- XUL'ified abstraction for logic to attach to widgets -->
+       <commandset id="CircTree_cmds" />
+
+       <!-- Accelerator Keys (Accessor Keys are in DTD's) -->
+       <keyset id="CircTree_keys" />
+
+       <!-- Layout to be filled in by overlays and javascript -->
+       <box id="CircTree_main" />
+
+</page>
+
diff --git a/Evergreen/staff_client/chrome/content/evergreen/circ/circ_tree_overlay.xul b/Evergreen/staff_client/chrome/content/evergreen/circ/circ_tree_overlay.xul
new file mode 100644 (file)
index 0000000..a2a70ee
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<!DOCTYPE overlay SYSTEM "chrome://evergreen/locale/circ_tree.dtd">
+<overlay id="circ_tree_overlay" 
+       xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+       <script>mw.sdump('D_TRACE','Loading circ_tree_overlay.xul\n');</script>
+
+<commandset id="CircTree_cmds">
+
+       <command id="cmd_broken" oncommand="
+               alert('Not Yet Implemented'); "/>
+
+</commandset>
+
+<!-- main widget for circ_tree -->
+<box id="CircTree_main" flex="1" orient="horizontal">
+       <box id="CircTree_pagedtree" flex="1" orient="horizontal"/>
+</box>
+
+<!-- Accelerator Keys (Accessor Keys are in DTD's) -->
+<keyset id="CircTree_keys">
+</keyset>
+
+</overlay>
index 7eeb44d..f7d5fb9 100755 (executable)
@@ -43,7 +43,6 @@ function patron_display_init(p) {
                }
        );
 
-
        sdump('D_TRACE_EXIT',arg_dump(arguments));
        return;
 }
@@ -59,12 +58,35 @@ function patron_display_init_after_clamshell(p) {
                                'onload' : patron_display_init_after_inner_clamshell(p)
                        }
                );
+               p.w.item_tree = spawn_circ_tree( 
+                       clamshell_w.document, 
+                       'new_iframe', 
+                       clamshell_w.second_deck, {
+                               'paged_tree_onload' : patron_display_init_after_item_tree_paged_tree(p),
+                               'onload' : patron_display_init_after_item_tree(p)
+                       }
+               );
+
 
                return;
        };
 
 }
 
+function patron_display_init_after_item_tree_paged_tree(p) {
+       sdump('D_PATRON_DISPLAY',arg_dump(arguments));
+       return function (tree_win) {
+               sdump('D_TRACE','<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n');
+               if (p.w._patron) {
+                       sdump('D_TRACE','>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n');
+                       if (!p.w._patron.checkouts()) patron_get_checkouts( p.w._patron );
+                       for (var i = 0; i < p.w._patron.checkouts().length; i++) {
+                               p.w.item_tree.add_circs( [ i ] );
+                       }
+               }
+       };
+};
+
 function patron_display_init_after_inner_clamshell(p) {
        sdump('D_PATRON_DISPLAY',arg_dump(arguments));
        return function (clamshell_w) {
@@ -87,3 +109,51 @@ function patron_display_init_after_inner_clamshell(p) {
        };
 }
 
+function patron_display_init_after_item_tree(p) {
+       sdump('D_PATRON_DISPLAY',arg_dump(arguments));
+       return function (item_tree_w) {
+               sdump('D_PATRON_DISPLAY',arg_dump(arguments));
+               item_tree_w.register_circ_select_callback(
+                       function (ev) {
+                               sdump('D_PATRON_DISPLAY','Firing circ_select_callback\n');
+                               var circs = get_list_from_tree_selection( item_tree_w.tree_win.tree );
+                               /* grab cover art for selected item? */
+                       }
+               );
+               item_tree_w.register_flesh_circ_function(
+                       function (treeitem) {
+                               sdump('D_PATRON_DISPLAY',arg_dump(arguments));
+                               /* A little kludgy if the patron's checkouts change while the list is being navigated, but since
+                               there is no network traffic, it may be worth clearing and rebuilding the tree when updating */
+                               var record_id = treeitem.getAttribute('record_id'); 
+                               item_tree_w.map_circ_to_cols( p.w._patron.checkouts()[ record_id ], treeitem );
+                       }
+               );
+               item_tree_w.register_context_builder(
+                       function (ev) {
+                               /* add check-in and renew options */
+                               empty_widget(item_tree_w.tree_win.popup);
+                               var circs = get_list_from_tree_selection( item_tree_w.tree_win.tree );
+                               var menuitem = item_tree_w.tree_win.document.createElement('menuitem');
+                               item_tree_w.tree_win.popup.appendChild( menuitem );
+                               menuitem.setAttribute('label','Open in OPAC');
+                               menuitem.addEventListener(
+                                       'command',
+                                       function (ev) {
+                                               for (var i = 0; i < circs.length; i++) {
+                                                       spawn_circ_display(
+                                                               p.w.app_shell,'new_tab','main_tabbox', 
+                                                               { 
+                                                                       'circ' : retrieve_circ_by_id( 
+                                                                               circs[i].getAttribute('record_id') 
+                                                                       )
+                                                               }
+                                                       );
+                                               }
+                                       },
+                                       false
+                               );
+                       }
+               );
+       };
+}
index c3fd013..522f58d 100644 (file)
@@ -31,12 +31,14 @@ var sdump_levels = {
        'D_PATRON_DISPLAY_CONTACT' : true,
 
        'D_PATRON_UTILS' : true,
+       
+       'D_CIRC_TREE' : true,
 
        'D_EXPLODE' : false,
-       'D_FM_UTILS' : true,
+       'D_FM_UTILS' : false,
        'D_PRINT' : false,
        'D_SES' : true,
-       'D_SPAWN' : false,
+       'D_SPAWN' : true,
        'D_STRING' : false,
        'D_UTIL' : false,
        'D_WIN' : false,
index 7d4f8a2..a6416b4 100644 (file)
@@ -69,6 +69,11 @@ function spawn_circ_display(d,placement,place,passthru_params) {
        return spawn_interface(d,placement,place,chrome,getString('display_patron_interface_label'),passthru_params);
 }
 
+function spawn_circ_tree(d,placement,place,passthru_params) {
+       var chrome = 'chrome://evergreen/content/circ/circ_tree.xul';
+       return spawn_interface(d,placement,place,chrome,'circ_tree',passthru_params);
+}
+
 function spawn_circ_list(d,placement,place,passthru_params) {
        var chrome = 'chrome://evergreen/content/circ/circ_list.xul';
        return spawn_interface(d,placement,place,chrome,getString('items_out_interface_label'),passthru_params);