From 6e519e9e01414bd73ece133742e9931d00c81b4e Mon Sep 17 00:00:00 2001 From: phasefx Date: Fri, 15 Jun 2007 10:15:21 +0000 Subject: [PATCH] refresh-row-in-place ability and updates for the two files that were affected by the change in return values from list.append git-svn-id: svn://svn.open-ils.org/ILS/branches/rel_1_0@7432 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- .../xul/staff_client/chrome/content/util/list.js | 183 ++++++++++++++++++++- .../xul/staff_client/server/cat/copy_browser.js | 9 +- Open-ILS/xul/staff_client/server/patron/bills.js | 3 +- 3 files changed, 183 insertions(+), 12 deletions(-) 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 acc40f9b90..4271a41bd3 100644 --- a/Open-ILS/xul/staff_client/chrome/content/util/list.js +++ b/Open-ILS/xul/staff_client/chrome/content/util/list.js @@ -297,13 +297,13 @@ util.list.prototype = { var rnode; var obj = this; switch (this.node.nodeName) { - case 'tree' : rnode = this._append_to_tree(params); break; - case 'listbox' : rnode = this._append_to_listbox(params); break; + case 'tree' : rparams = this._append_to_tree(params); break; + case 'listbox' : rparams = this._append_to_listbox(params); break; default: throw('NYI: Need .append() for ' + this.node.nodeName); break; } - if (rnode && params.attributes) { + if (rparams && params.attributes) { for (var i in params.attributes) { - rnode.setAttribute(i,params.attributes[i]); + rparams.my_node.setAttribute(i,params.attributes[i]); } } this.row_count.total++; @@ -312,8 +312,24 @@ util.list.prototype = { setTimeout( function() { obj.on_all_fleshed(); }, 0 ); } } - return rnode; + return rparams; }, + + 'refresh_row' : function (params) { + var rnode; + var obj = this; + switch (this.node.nodeName) { + case 'tree' : rparams = this._refresh_row_in_tree(params); break; + default: throw('NYI: Need .refresh_row() for ' + this.node.nodeName); break; + } + if (rparams && params.attributes) { + for (var i in params.attributes) { + rparams.my_node.setAttribute(i,params.attributes[i]); + } + } + return rparams; + }, + '_append_to_tree' : function (params) { @@ -474,7 +490,157 @@ util.list.prototype = { if (obj.trim_list && obj.row_count.total >= obj.trim_list) { // Remove oldest row - //if (typeof params.to_bottom != 'undefined') { + //if (typeof params.to_bottom != 'undefined') + if (typeof params.to_top == 'undefined') { + treechildren_node.removeChild( treechildren_node.firstChild ); + } else { + treechildren_node.removeChild( treechildren_node.lastChild ); + } + } + } catch(E) { + } + + setTimeout( function() { obj.auto_retrieve(); }, 0 ); + + params.my_node = treeitem; + return params; + }, + + '_refresh_row_in_tree' : function (params) { + + var obj = this; + + if (typeof params.row == 'undefined') throw('util.list.refresh_row: Object must contain a row'); + if (typeof params.my_node == 'undefined') throw('util.list.refresh_row: Object must contain a my_node'); + if (params.my_node.nodeName != 'treeitem') throw('util.list.refresh_rwo: my_node must be a treeitem'); + + var s = ('util.list.refresh_row: params = ' + (params) + '\n'); + + var treeitem = params.my_node; + treeitem.setAttribute('retrieve_id',params.retrieve_id); + if (typeof params.to_bottom != 'undefined') { + if (typeof params.no_auto_select == 'undefined') { + if (!obj.auto_select_pending) { + obj.auto_select_pending = true; + setTimeout(function() { + dump('auto-selecting\n'); + var idx = Number(obj.node.view.rowCount)-1; + try { obj.node.view.selection.select(idx); } catch(E) { obj.error.sdump('D_ALERT','tree auto select: ' + E + '\n'); } + try { if (typeof params.on_select == 'function') params.on_select(); } catch(E) { obj.error.sdump('D_ALERT','tree auto select, on_select: ' + E + '\n'); } + obj.auto_select_pending = false; + try { util.widgets.dispatch('flesh',obj.node.contentView.getItemAtIndex(idx).firstChild); } catch(E) { obj.error.sdump('D_ALERT','tree auto select, flesh: ' + E + '\n'); } + }, 1000); + } + } + } + var delete_me = []; + for (var i in treeitem.childNodes) if (treeitem.childNodes[i].nodeName == 'treerow') delete_me.push(treeitem.childNodes[i]); + for (var i = 0; i < delete_me.length; i++) treeitem.removeChild(delete_me[i]); + var treerow = document.createElement('treerow'); + treeitem.appendChild( treerow ); + treerow.setAttribute('retrieve_id',params.retrieve_id); + + s += ('tree = ' + this.node + '\n'); + s += ('treeitem = ' + treeitem + ' treerow = ' + treerow + '\n'); + + if (typeof params.retrieve_row == 'function' || typeof this.retrieve_row == 'function') { + + obj.put_retrieving_label(treerow); + treerow.addEventListener( + 'flesh', + function() { + + if (treerow.getAttribute('retrieved') == 'true') return; /* already running */ + + treerow.setAttribute('retrieved','true'); + + //dump('fleshing = ' + params.retrieve_id + '\n'); + + function inc_fleshed() { + if (treerow.getAttribute('fleshed') == 'true') return; /* already fleshed */ + treerow.setAttribute('fleshed','true'); + obj.row_count.fleshed++; + if (obj.row_count.fleshed == obj.row_count.total) { + if (typeof obj.on_all_fleshed == 'function') { + setTimeout( function() { obj.on_all_fleshed(); }, 0 ); + } + } + } + + params.row_node = treeitem; + params.on_retrieve = function(p) { + try { + p.row = params.row; + obj._map_row_to_treecell(p,treerow); + inc_fleshed(); + var idx = obj.node.contentView.getIndexOfItem( params.row_node ); + dump('idx = ' + idx + '\n'); + // if current row is selected, send another select event to re-sync data that the client code fetches on selects + if ( obj.node.view.selection.isSelected( idx ) ) { + dump('dispatching select event for on_retrieve for idx = ' + idx + '\n'); + util.widgets.dispatch('select',params.row_node); + } + } catch(E) { + alert('fixme2: ' + E); + } + } + + if (typeof params.retrieve_row == 'function') { + + params.retrieve_row( params ); + + } else if (typeof obj.retrieve_row == 'function') { + + obj.retrieve_row( params ); + + } else { + + inc_fleshed(); + } + }, + false + ); + /* + setTimeout( + function() { + util.widgets.dispatch('flesh',treerow); + }, 0 + ); + */ + } else { + obj.put_retrieving_label(treerow); + treerow.addEventListener( + 'flesh', + function() { + //dump('fleshing anon\n'); + if (treerow.getAttribute('fleshed') == 'true') return; /* already fleshed */ + obj._map_row_to_treecell(params,treerow); + treerow.setAttribute('retrieved','true'); + treerow.setAttribute('fleshed','true'); + obj.row_count.fleshed++; + if (obj.row_count.fleshed == obj.row_count.total) { + if (typeof obj.on_all_fleshed == 'function') { + setTimeout( function() { obj.on_all_fleshed(); }, 0 ); + } + } + }, + false + ); + /* + setTimeout( + function() { + util.widgets.dispatch('flesh',treerow); + }, 0 + ); + */ + } + this.error.sdump('D_LIST',s); + + try { + + if (obj.trim_list && obj.row_count.total >= obj.trim_list) { + // Remove oldest row + //if (typeof params.to_bottom != 'undefined') if (typeof params.to_top == 'undefined') { treechildren_node.removeChild( treechildren_node.firstChild ); } else { @@ -486,7 +652,7 @@ util.list.prototype = { setTimeout( function() { obj.auto_retrieve(); }, 0 ); - return treeitem; + return params; }, 'put_retrieving_label' : function(treerow) { @@ -667,7 +833,8 @@ util.list.prototype = { } this.error.sdump('D_LIST',s); - return listitem; + params.my_node = listitem; + return params; }, 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 8c31a51937..49dbda691c 100644 --- a/Open-ILS/xul/staff_client/server/cat/copy_browser.js +++ b/Open-ILS/xul/staff_client/server/cat/copy_browser.js @@ -1244,7 +1244,8 @@ cat.copy_browser.prototype = { if (parent_org) { data.node = obj.map_tree[ 'aou_' + parent_org.id() ]; } - var node = obj.list.append(data); + var nparams = obj.list.append(data); + var node = nparams.my_node; if (params) { for (var i in params) { node.setAttribute(i,params[i]); @@ -1311,7 +1312,8 @@ cat.copy_browser.prototype = { 'to_bottom' : true, 'no_auto_select' : true, }; - var node = obj.list.append(data); + var nparams = obj.list.append(data); + var node = nparams.my_node; obj.map_tree[ 'acn_' + acn_tree.id() ] = node; if (params) { for (var i in params) { @@ -1362,7 +1364,8 @@ cat.copy_browser.prototype = { 'to_bottom' : true, 'no_auto_select' : true, }; - var node = obj.list.append(data); + var nparams = obj.list.append(data); + var node = nparams.my_node; obj.map_tree[ 'acp_' + acp_item.id() ] = node; if (params) { for (var i in params) { diff --git a/Open-ILS/xul/staff_client/server/patron/bills.js b/Open-ILS/xul/staff_client/server/patron/bills.js index ded6603e7d..062527ab50 100644 --- a/Open-ILS/xul/staff_client/server/patron/bills.js +++ b/Open-ILS/xul/staff_client/server/patron/bills.js @@ -84,7 +84,7 @@ patron.bills.prototype = { obj.current_payments = []; obj.list.clear(); //FIXME//.bills virtual field for (var i = 0; i < obj.bills.length; i++) { - var rnode = obj.list.append( + var rparams = obj.list.append( { 'row' : { 'my' : { 'mobts' : obj.bills[i].transaction, 'circ' : obj.bills[i].circ, 'mvr' : obj.bills[i].record } @@ -92,6 +92,7 @@ patron.bills.prototype = { 'attributes' : { 'allowevents' : true } } ); + var rnode = rparams.my_node; obj.bill_map[ obj.bills[i].transaction.id() ] = obj.bills[i]; var cb = rnode.getElementsByTagName('checkbox')[0]; var tb = rnode.getElementsByTagName('textbox')[0]; -- 2.11.0