From 777ef49999d944cc2d90758fb604a6c75f8c0c0a Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Wed, 29 Oct 2014 17:09:36 -0400 Subject: [PATCH] KMAIN-879 - Patron Holds not Sorting Cross-port: 5818227 Conflicts: Open-ILS/xul/staff_client/server/cat/copy_browser.js --- .../xul/staff_client/chrome/content/util/list.js | 916 ++++++++++++++++----- 1 file changed, 690 insertions(+), 226 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 41f9a6d22c..e7666a96d8 100644 --- a/Open-ILS/xul/staff_client/chrome/content/util/list.js +++ b/Open-ILS/xul/staff_client/chrome/content/util/list.js @@ -135,18 +135,17 @@ util.list.prototype = { treecol, 'click', function(ev) { - //setTimeout( - //function() { - var toggle = ev.target.getAttribute('toggleAll') || 'on'; - if (toggle == 'off') toggle = 'on'; else toggle = 'off'; - ev.target.setAttribute('toggleAll',toggle); - obj._toggle_checkbox_column(ev.target,toggle); - //}, 0 - //); + + var toggle = ev.target.getAttribute('toggleAll') || 'on'; + if (toggle == 'off') toggle = 'on'; else toggle = 'off'; + ev.target.setAttribute('toggleAll',toggle); + obj._toggle_checkbox_column(ev.target,toggle); }, false ); - } else { + } + + else { obj.event_listeners.add( treecol, 'sort_first_asc', @@ -265,13 +264,15 @@ util.list.prototype = { ); if (r) { - //setTimeout( - do_it;//, 0 ); + + do_it(); } - } else { - //setTimeout( - do_it;//, 0 ); + } + + else { + + do_it(); } }, @@ -324,6 +325,15 @@ util.list.prototype = { false ); } + + /* + obj.event_listeners.add( + this.node, + 'mousemove', + function(ev) { obj.detect_visible(); }, + false + ); + */ obj.event_listeners.add( this.node, 'keypress', @@ -344,6 +354,17 @@ util.list.prototype = { ); /* FIXME -- find events on scrollbar to trigger this */ obj.detect_visible_polling(); + /* + var scrollbar = document.getAnonymousNodes( document.getAnonymousNodes(this.node)[1] )[1]; + var slider = document.getAnonymousNodes( scrollbar )[2]; + alert('scrollbar = ' + scrollbar.nodeName + ' grippy = ' + slider.nodeName); + scrollbar.addEventListener('click',function(){alert('sb click');},false); + scrollbar.addEventListener('command',function(){alert('sb command');},false); + scrollbar.addEventListener('scroll',function(){alert('sb scroll');},false); + slider.addEventListener('click',function(){alert('slider click');},false); + slider.addEventListener('command',function(){alert('slider command');},false); + slider.addEventListener('scroll',function(){alert('slider scroll');},false); + */ obj.event_listeners.add(this.node, 'scroll',function(){ obj.auto_retrieve(); },false); this.restores_columns(params); @@ -498,71 +519,99 @@ util.list.prototype = { this.error.sdump('D_LIST','Clearing list ' + this.node.getAttribute('id') + '\n'); this.row_count.total = 0; this.row_count.fleshed = 0; - //setTimeout( function() { - obj.exec_on_all_fleshed();// }, 0 ); + obj.exec_on_all_fleshed(); }, '_clear_tree' : function(params) { + var obj = this; + if (obj.error.sdump_levels.D_LIST_DUMP_ON_CLEAR) { + obj.error.sdump('D_LIST_DUMP_ON_CLEAR',obj.dump()); } + if (obj.error.sdump_levels.D_LIST_DUMP_WITH_KEYS_ON_CLEAR) { + obj.error.sdump('D_LIST_DUMP_WITH_KEYS_ON_CLEAR',obj.dump_with_keys()); } + while (obj.treechildren.lastChild) obj.treechildren.removeChild( obj.treechildren.lastChild ); }, '_clear_listbox' : function(params) { + var obj = this; var items = []; var nl = this.node.getElementsByTagName('listitem'); + for (var i = 0; i < nl.length; i++) { + items.push( nl[i] ); } + for (var i = 0; i < items.length; i++) { + this.node.removeChild(items[i]); } }, 'append' : function (params) { + var rnode; var obj = this; + switch (this.node.nodeName) { + 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 (rparams && params.attributes) { + for (var i in params.attributes) { + rparams.treeitem_node.setAttribute(i,params.attributes[i]); } } this.row_count.total++; + if (this.row_count.fleshed == this.row_count.total) { - obj.exec_on_all_fleshed(); + obj.exec_on_all_fleshed(); } + rparams.treeitem_node.setAttribute('unique_row_counter',obj.unique_row_counter); rparams.unique_row_counter = obj.unique_row_counter++; + if (typeof params.on_append == 'function') { + params.on_append(rparams); } + 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.treeitem_node.setAttribute(i,params.attributes[i]); } } + this.row_count.fleshed--; return rparams; }, @@ -579,10 +628,16 @@ util.list.prototype = { var treechildren_node = this.treechildren; if (params.node && params.node.nodeName == 'treeitem') { + params.node.setAttribute('container','true'); /* params.node.setAttribute('open','true'); */ + if (params.node.lastChild.nodeName == 'treechildren') { + treechildren_node = params.node.lastChild; - } else { + } + + else { + treechildren_node = document.createElement('treechildren'); params.node.appendChild(treechildren_node); } @@ -590,47 +645,81 @@ util.list.prototype = { var treeitem = document.createElement('treeitem'); treeitem.setAttribute('retrieve_id',params.retrieve_id); - + if (typeof params.to_bottom != 'undefined') { treechildren_node.appendChild( treeitem ); - + if (typeof params.no_auto_select == 'undefined') { - + if (!obj.auto_select_pending) { - + obj.auto_select_pending = true; + 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_WARN','tree auto select: ' + E + '\n'); } + try { if (typeof params.on_select == 'function') params.on_select(); } catch(E) { obj.error.sdump('D_WARN','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_WARN','tree auto select, flesh: ' + E + '\n'); } - 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_WARN','tree auto select: ' + E + '\n'); } - try { if (typeof params.on_select == 'function') params.on_select(); } catch(E) { obj.error.sdump('D_WARN','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_WARN','tree auto select, flesh: ' + E + '\n'); } } } - } else { + } + + else { if (!params.add_before || params.add_before == null) { if (treechildren_node.firstChild) { treechildren_node.insertBefore( treeitem, treechildren_node.firstChild ); + } + + else { - } else { treechildren_node.appendChild( treeitem ); } + if (typeof params.no_auto_select == 'undefined') { + if (!obj.auto_select_pending) { obj.auto_select_pending = true; - try { obj.node.view.selection.select(0); } - catch(E) { obj.error.sdump('D_WARN','tree auto select: ' + E + '\n'); } - try { if (typeof params.on_select == 'function') params.on_select(); } - catch(E) { obj.error.sdump('D_WARN','tree auto select, on_select: ' + E + '\n'); } + + try { + + obj.node.view.selection.select(0); + } + + catch(E) { + + obj.error.sdump('D_WARN','tree auto select: ' + E + '\n'); + } + + try { + + if (typeof params.on_select == 'function'){ + + params.on_select(); + } + } + + catch(E) { + + obj.error.sdump('D_WARN','tree auto select, on_select: ' + E + '\n'); + } + obj.auto_select_pending = false; - try { util.widgets.dispatch('flesh',obj.node.contentView.getItemAtIndex(0).firstChild); } - catch(E) { obj.error.sdump('D_WARN','tree auto select, flesh: ' + E + '\n'); } + + try { + + util.widgets.dispatch('flesh',obj.node.contentView.getItemAtIndex(0).firstChild); + } + + catch(E) { + + obj.error.sdump('D_WARN','tree auto select, flesh: ' + E + '\n'); + } } } } @@ -640,6 +729,7 @@ util.list.prototype = { treechildren_node.insertBefore( treeitem, params.add_before ); } } + var treerow = document.createElement('treerow'); treeitem.appendChild( treerow ); treerow.setAttribute('retrieve_id',params.retrieve_id); @@ -648,6 +738,8 @@ util.list.prototype = { s += ('tree = ' + this.node + ' treechildren = ' + treechildren_node + '\n'); s += ('treeitem = ' + treeitem + ' treerow = ' + treerow + '\n'); + obj.put_retrieving_label(treerow); + if (typeof params.retrieve_row == 'function' || typeof this.retrieve_row == 'function') { obj.event_listeners.add( treerow, @@ -659,31 +751,40 @@ util.list.prototype = { treerow.setAttribute('retrieved','true'); 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) { - obj.exec_on_all_fleshed(); + if (obj.row_count.fleshed >= obj.row_count.total) { + obj.exec_on_all_fleshed(); } } params.treeitem_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.treeitem_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',obj.node); } - } catch(E) { + } + catch(E) { + + // Let's not alert on this for now. Getting contentView has no properties in record buckets under certain conditions dump('fixme2: ' + E + '\n'); } } @@ -691,23 +792,28 @@ util.list.prototype = { if (typeof params.retrieve_row == 'function') { params.retrieve_row( params ); + } - } else if (typeof obj.retrieve_row == 'function') { + else if (typeof obj.retrieve_row == 'function') { obj.retrieve_row( params ); + } - } else { - + else { + inc_fleshed(); } + obj.refresh_ordinals(); }, false ); + if (typeof params.flesh_immediately != 'undefined') { + if (params.flesh_immediately) { - util.widgets.dispatch('flesh',treerow); + util.widgets.dispatch('flesh',treerow); } } } else { @@ -717,46 +823,66 @@ util.list.prototype = { function() { 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) { - obj.exec_on_all_fleshed(); + obj.exec_on_all_fleshed(); } + obj.refresh_ordinals(); }, + false ); - + if (typeof params.flesh_immediately != 'undefined') { - + if (params.flesh_immediately) { - util.widgets.dispatch('flesh',treerow); + util.widgets.dispatch('flesh',treerow); } } } + this.error.sdump('D_LIST',s); - try { + try { - if (obj.trim_list && obj.row_count.total >= obj.trim_list) { + if (obj.trim_list && obj.row_count.total >= obj.trim_list) { - if (typeof params.to_top == 'undefined') { - if (typeof params.on_delete == 'function') { params.on_delete( treechildren_node.firstChild.getAttribute('unique_row_counter') ); } - treechildren_node.removeChild( treechildren_node.firstChild ); - } else { - if (typeof params.on_delete == 'function') { params.on_delete( treechildren_node.lastChild.getAttribute('unique_row_counter') ); } - treechildren_node.removeChild( treechildren_node.lastChild ); + // Remove oldest row + //if (typeof params.to_bottom != 'undefined') + if (typeof params.to_top == 'undefined') { + + if (typeof params.on_delete == 'function') { + + params.on_delete( treechildren_node.firstChild.getAttribute('unique_row_counter') ); + } + + treechildren_node.removeChild( treechildren_node.firstChild ); + } + + else { + + if (typeof params.on_delete == 'function') { + + params.on_delete( treechildren_node.lastChild.getAttribute('unique_row_counter') ); + } + + treechildren_node.removeChild( treechildren_node.lastChild ); + } } } - } catch(E) { - } - obj.auto_retrieve(); - obj.refresh_ordinals(); + catch(E) { + } + + obj.auto_retrieve(); obj.refresh_ordinals(); params.treeitem_node = treeitem; return params; @@ -774,32 +900,69 @@ util.list.prototype = { var treeitem = params.treeitem_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_WARN','tree auto select: ' + E + '\n'); } - try { if (typeof params.on_select == 'function') params.on_select(); } catch(E) { obj.error.sdump('D_WARN','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_WARN','tree auto select, flesh: ' + E + '\n'); } - //}, 1000); + var idx = Number(obj.node.view.rowCount)-1; + + try { + + obj.node.view.selection.select(idx); + } + + catch(E) { + + obj.error.sdump('D_WARN','tree auto select: ' + E + '\n'); + } + + try { + + if (typeof params.on_select == 'function'){ + + params.on_select(); + } + } + + catch(E) { + + obj.error.sdump('D_WARN','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_WARN','tree auto select, flesh: ' + E + '\n'); + } } } } - //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 prev_treerow = treeitem.firstChild; /* FIXME: worry about hierarchal lists like copy_browser? */ var treerow = document.createElement('treerow'); + while (prev_treerow.firstChild) { + treerow.appendChild( prev_treerow.removeChild( prev_treerow.firstChild ) ); } + treeitem.replaceChild( treerow, prev_treerow ); treerow.setAttribute('retrieve_id',params.retrieve_id); - if (params.row_properties) treerow.setAttribute('properties',params.row_properties); + + if (params.row_properties){ + + treerow.setAttribute('properties',params.row_properties); + } s += ('tree = ' + this.node.nodeName + '\n'); s += ('treeitem = ' + treeitem.nodeName + ' treerow = ' + treerow.nodeName + '\n'); @@ -823,26 +986,35 @@ util.list.prototype = { 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) { - obj.exec_on_all_fleshed(); + obj.exec_on_all_fleshed(); } } params.treeitem_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.treeitem_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',obj.node); } - } catch(E) { + } + + catch(E) { + // Let's not alert on this for now. Getting contentView has no properties in record buckets under certain conditions dump('fixme2: ' + E + '\n'); } @@ -860,11 +1032,14 @@ util.list.prototype = { inc_fleshed(); } + obj.refresh_ordinals(); }, false ); + if (typeof params.flesh_immediately != 'undefined') { + if (params.flesh_immediately) { util.widgets.dispatch('flesh',treerow); @@ -881,19 +1056,24 @@ util.list.prototype = { function() { 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) { - obj.exec_on_all_fleshed(); + obj.exec_on_all_fleshed(); } + obj.refresh_ordinals(); }, false ); + if (typeof params.flesh_immediately != 'undefined') { + if (params.flesh_immediately) { util.widgets.dispatch('flesh',treerow); @@ -902,21 +1082,29 @@ util.list.prototype = { } - try { + try { - if (obj.trim_list && obj.row_count.total >= obj.trim_list) { - // Remove oldest row - if (typeof params.to_top == 'undefined') { - treechildren_node.removeChild( treechildren_node.firstChild ); - } else { - treechildren_node.removeChild( treechildren_node.lastChild ); + 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 { + + treechildren_node.removeChild( treechildren_node.lastChild ); + } } } - } catch(E) { - } - obj.auto_retrieve(); - obj.refresh_ordinals(); + catch(E) { + } + + obj.auto_retrieve(); + obj.refresh_ordinals(); JSAN.use('util.widgets'); util.widgets.dispatch('select',obj.node); @@ -926,36 +1114,51 @@ util.list.prototype = { }, 'refresh_ordinals' : function() { + var obj = this; + try { + if (obj.refresh_ordinals_timeout_id) { return; } function _refresh_ordinals(clear) { + var nl = obj.node.getElementsByAttribute('label','_'); + for (var i = 0; i < nl.length; i++) { + nl[i].setAttribute( 'ord_col', 'true' ); + nl[i].setAttribute( // treecell properties for css styling 'properties', 'ordinal' ); } + nl = obj.node.getElementsByAttribute('ord_col','true'); + for (var i = 0; i < nl.length; i++) { + nl[i].setAttribute( 'label', // we could just use 'i' here if we trust the order of elements 1 + obj.node.contentView.getIndexOfItem(nl[i].parentNode.parentNode) // treeitem ); } - if (clear) { obj.refresh_ordinals_timeout_id = null; } + + if (clear) { + + obj.refresh_ordinals_timeout_id = null; + } } // spamming this to cover race conditions setTimeout(_refresh_ordinals, 500); // for speedy looking UI updates setTimeout(_refresh_ordinals, 2000); // for most uses + obj.refresh_ordinals_timeout_id = setTimeout( function() { _refresh_ordinals(true); @@ -963,173 +1166,274 @@ util.list.prototype = { 4000 // just in case, say with a slow rendering list ); - } catch(E) { + } + + catch(E) { + alert('Error in list.js, refresh_ordinals(): ' + E); } }, 'put_retrieving_label' : function(treerow) { + var obj = this; + try { + for (var i = 0; i < obj.columns.length; i++) { + var treecell; + if (typeof treerow.childNodes[i] == 'undefined') { + treecell = document.createElement('treecell'); treerow.appendChild(treecell); - } else { + } + + else { + treecell = treerow.childNodes[i]; } + treecell.setAttribute('label',document.getElementById('offlineStrings').getString('list.row_retrieving')); } - } catch(E) { + } + + catch(E) { alert('Error in list.js, put_retrieving_label(): ' + E); } }, 'detect_visible' : function() { + var obj = this; + try { - //dump('detect_visible obj.node = ' + obj.node + '\n'); + /* FIXME - this is a hack.. if the implementation of tree changes, this could break */ try { - /*var s = ''; var A = document.getAnonymousNodes(obj.node); - for (var i in A) { - var B = A[i]; - s += '\t' + (typeof B.nodeName != 'undefined' ? B.nodeName : B ) + '\n'; - if (typeof B.childNodes != 'undefined') for (var j = 0; j < B.childNodes.length; j++) { - var C = B.childNodes[j]; - s += '\t\t' + C.nodeName + '\n'; - } - } - obj.error.sdump('D_XULRUNNER','document.getAnonymousNodes(' + obj.node.nodeName + ') = \n' + s + '\n');*/ + var scrollbar = document.getAnonymousNodes(obj.node)[2].firstChild; var curpos = scrollbar.getAttribute('curpos'); var maxpos = scrollbar.getAttribute('maxpos'); - //alert('curpos = ' + curpos + ' maxpos = ' + maxpos + ' obj.curpos = ' + obj.curpos + ' obj.maxpos = ' + obj.maxpos + '\n'); + if ((curpos != obj.curpos) || (maxpos != obj.maxpos)) { + if ( obj.auto_retrieve() > 0 ) { + obj.curpos = curpos; obj.maxpos = maxpos; } } - } catch(E) { + } + + catch(E) { + obj.error.sdump('D_XULRUNNER', 'List implementation changed? ' + E); } - } catch(E) { obj.error.sdump('D_ERROR',E); } + } + + catch(E) { + + obj.error.sdump('D_ERROR',E); + } }, 'detect_visible_polling' : function() { + try { - //alert('detect_visible_polling'); + var obj = this; obj.detect_visible(); - setTimeout(function() { try { obj.detect_visible_polling(); } catch(E) { alert(E); } },2000); - } catch(E) { + setTimeout(function() { + + try { + + obj.detect_visible_polling(); + } + + catch(E) { + + alert(E); + } + }, 2000); + } + + catch(E) { + alert(E); } }, - 'auto_retrieve' : function(params) { + var obj = this; + switch (this.node.nodeName) { + case 'tree' : obj._auto_retrieve_tree(params); break; default: throw('NYI: Need .auto_retrieve() for ' + obj.node.nodeName); break; } }, - '_auto_retrieve_tree' : function (params) { - var obj = this; - if (!obj.auto_retrieve_in_progress) { - obj.auto_retrieve_in_progress = true; - //setTimeout( - //function() { - try { - //alert('auto_retrieve\n'); - var count = 0; - var startpos = obj.node.treeBoxObject.getFirstVisibleRow(); - var endpos = obj.node.treeBoxObject.getLastVisibleRow(); - if (startpos > endpos) endpos = obj.node.treeBoxObject.getPageLength(); - //dump('startpos = ' + startpos + ' endpos = ' + endpos + '\n'); - for (var i = startpos; i < endpos + 4; i++) { - try { - //dump('trying index ' + i + '\n'); - var item = obj.node.contentView.getItemAtIndex(i).firstChild; - if (item && item.getAttribute('retrieved') != 'true' ) { - //dump('\tgot an unfleshed item = ' + item + ' = ' + item.nodeName + '\n'); - util.widgets.dispatch('flesh',item); count++; - } - } catch(E) { - //dump(i + ' : ' + E + '\n'); - } - } - obj.auto_retrieve_in_progress = false; - return count; - } catch(E) { alert(E); } - //}, 1 - //); + '_auto_retrieve_tree' : function (params) { + + var obj = this; + + if (!obj.auto_retrieve_in_progress) { + + obj.auto_retrieve_in_progress = true; + setTimeout( + function() { + try { + + var count = 0; + var startpos = obj.node.treeBoxObject.getFirstVisibleRow(); + var endpos = obj.node.treeBoxObject.getLastVisibleRow(); + if (startpos > endpos) endpos = obj.node.treeBoxObject.getPageLength(); + + for (var i = startpos; i < endpos + 4; i++) { + + try { + + var item = obj.node.contentView.getItemAtIndex(i).firstChild; + + if (item && item.getAttribute('retrieved') != 'true' ) { + + util.widgets.dispatch('flesh',item); count++; + } + } + + catch(E) { + + dump(i + ' : ' + E + '\n'); + } + } + + obj.auto_retrieve_in_progress = false; + return count; + } + + catch(E) { + + alert(E); + } + }, 1 + ); } }, 'exec_on_all_fleshed' : function() { + var obj = this; + try { + if (obj.on_all_fleshed) { + if (typeof obj.on_all_fleshed == 'function') { + dump('exec_on_all_fleshed == function\n'); - //setTimeout( - //function() { - try { obj.on_all_fleshed(); } catch(E) { obj.error.standard_unexpected_error_alert('_full_retrieve_tree callback',obj.on_all_fleshed); } - //}, 0 - //); - } else if (typeof obj.on_all_fleshed.length != 'undefined') { + + try { + + obj.on_all_fleshed(); + } + + catch(E) { + + obj.error.standard_unexpected_error_alert('_full_retrieve_tree callback',obj.on_all_fleshed); + } + + } + + else if (typeof obj.on_all_fleshed.length != 'undefined') { + dump('exec_on_all_fleshed == array\n'); - //setTimeout( - //function() { - try { - dump('exec_on_all_fleshed, processing on_all_fleshed array, length = ' + obj.on_all_fleshed.length + '\n'); - var f = obj.on_all_fleshed.pop(); - if (typeof f == 'function') { - try { f(); } catch(E) { obj.error.standard_unexpected_error_alert('_full_retrieve_tree callback',E); } - } - if (obj.on_all_fleshed.length > 0) arguments.callee(); - } catch(E) { - obj.error.standard_unexpected_error_alert('exec_on_all_fleshed callback error',E); - } - //}, 0 - //); - } else { + + try { + + dump('exec_on_all_fleshed, processing on_all_fleshed array, length = ' + obj.on_all_fleshed.length + '\n'); + var f = obj.on_all_fleshed.pop(); + + if (typeof f == 'function') { + + try { + + f(); + } + + catch(E) { + + obj.error.standard_unexpected_error_alert('_full_retrieve_tree callback',E); + } + } + + if (obj.on_all_fleshed.length > 0){ + + arguments.callee(); + } + } + + catch(E) { + + obj.error.standard_unexpected_error_alert('exec_on_all_fleshed callback error',E); + } + + } + + else { + obj.error.standard_unexpected_error_alert('unexpected on_all_fleshed object: ', obj.on_all_fleshed); } } - } catch(E) { + } + + catch(E) { + obj.error.standard_unexpected_error_alert('exec_on_all-fleshed error',E); } }, 'full_retrieve' : function(params) { + var obj = this; + switch (this.node.nodeName) { + case 'tree' : obj._full_retrieve_tree(params); break; default: throw('NYI: Need .full_retrieve() for ' + obj.node.nodeName); break; } + obj.refresh_ordinals(); }, '_full_retrieve_tree' : function(params) { + var obj = this; + try { + if (obj.row_count.fleshed >= obj.row_count.total) { + dump('Full retrieve... tree seems to be in sync\n' + js2JSON(obj.row_count) + '\n'); obj.exec_on_all_fleshed(); - } else { + } + + else { + dump('Full retrieve... syncing tree' + js2JSON(obj.row_count) + '\n'); JSAN.use('util.widgets'); var nodes = obj.treechildren.childNodes; + for (var i = 0; i < nodes.length; i++) { + util.widgets.dispatch('flesh',nodes[i].firstChild); } } - } catch(E) { + } + + catch(E) { + obj.error.standard_unexpected_error_alert('_full_retrieve_tree',E); } }, @@ -1148,35 +1452,38 @@ util.list.prototype = { if (typeof params.retrieve_row == 'function' || typeof this.retrieve_row == 'function') { - //setTimeout( - //function() { - listitem.setAttribute('retrieve_id',params.retrieve_id); - //FIXME//Make async and fire when row is visible in list - var row; + listitem.setAttribute('retrieve_id',params.retrieve_id); - params.treeitem_node = listitem; - params.on_retrieve = function(row) { - params.row = row; - obj._map_row_to_listcell(params,listitem); - obj.node.appendChild( listitem ); - util.widgets.dispatch('select',obj.node); - } + //FIXME//Make async and fire when row is visible in list + var row; - if (typeof params.retrieve_row == 'function') { + params.treeitem_node = listitem; + params.on_retrieve = function(row) { - row = params.retrieve_row( params ); + params.row = row; + obj._map_row_to_listcell(params,listitem); + obj.node.appendChild( listitem ); + util.widgets.dispatch('select',obj.node); + } + + if (typeof params.retrieve_row == 'function') { - } else { + row = params.retrieve_row( params ); - if (typeof obj.retrieve_row == 'function') { + } - row = obj.retrieve_row( params ); + else { + + if (typeof obj.retrieve_row == 'function') { + + row = obj.retrieve_row( params ); + + } + } + } + + else { - } - } - //}, 0 - //); - } else { this._map_row_to_listcell(params,listitem); this.node.appendChild( listitem ); } @@ -1184,67 +1491,97 @@ util.list.prototype = { this.error.sdump('D_LIST',s); params.treeitem_node = listitem; return params; - }, '_map_row_to_treecell' : function(params,treerow) { + var obj = this; var s = ''; if (typeof params.map_row_to_column == 'function' || typeof this.map_row_to_column == 'function') { for (var i = 0; i < this.columns.length; i++) { + var treecell; + if (typeof treerow.childNodes[i] == 'undefined') { + treecell = document.createElement('treecell'); treerow.appendChild( treecell ); - } else { + } + + else { + treecell = treerow.childNodes[i]; } - if ( this.columns[i].editable == false ) { treecell.setAttribute('editable','false'); } + if ( this.columns[i].editable == false ) { + + treecell.setAttribute('editable','false'); + } + var label = ''; var sort_value = ''; // What skip columns is doing is rendering the treecells as blank/empty if (params.skip_columns && (params.skip_columns.indexOf(i) != -1)) { + treecell.setAttribute('label',label); s += ('treecell = ' + treecell + ' with label = ' + label + '\n'); continue; } + if (params.skip_all_columns_except && (params.skip_all_columns_except.indexOf(i) == -1)) { + treecell.setAttribute('label',label); s += ('treecell = ' + treecell + ' with label = ' + label + '\n'); continue; } if (typeof params.map_row_to_column == 'function') { - if (this.columns[i].id == 'lineno'){ - label = this.count_for_display.toString(); - this.count_for_display++; + if (this.columns[i].id == 'lineno'){ - } else { - - label = params.map_row_to_column(params.row,this.columns[i],this.scratch_data); + label = this.count_for_display.toString(); + this.count_for_display++; + + } + + else { + + label = params.map_row_to_column(params.row,this.columns[i],this.scratch_data); + } + } + + else if (typeof this.map_row_to_column == 'function') { - } - } else if (typeof this.map_row_to_column == 'function') { - if (this.columns[i].id == 'lineno'){ + if (this.columns[i].id == 'lineno'){ - label = this.count_for_display.toString(); - this.count_for_display++; + label = this.count_for_display.toString(); + this.count_for_display++; + } - } else { + else { - label = this.map_row_to_column(params.row,this.columns[i],this.scratch_data); - - } + label = this.map_row_to_column(params.row,this.columns[i],this.scratch_data); + } + } + + if (this.columns[i].type == 'checkbox') { + + treecell.setAttribute('value',label); + } + + else { + + treecell.setAttribute('label',label ? label : ''); } - if (this.columns[i].type == 'checkbox') { treecell.setAttribute('value',label); } else { treecell.setAttribute('label',label ? label : ''); } + s += ('treecell = ' + treecell + ' with label = ' + label + '\n'); } - } else if (typeof params.map_row_to_columns == 'function' || typeof this.map_row_to_columns == 'function') { + } + + else if (typeof params.map_row_to_columns == 'function' || typeof this.map_row_to_columns == 'function') { var labels = []; var sort_values = []; @@ -1252,173 +1589,256 @@ util.list.prototype = { if (typeof params.map_row_to_columns == 'function') { var values = params.map_row_to_columns(params.row,this.columns,this.scratch_data); + if (typeof values.values == 'undefined') { + labels = values; - } else { + } + + else { + labels = values.values; sort_values = values.sort_values; } + } - } else if (typeof this.map_row_to_columns == 'function') { + else if (typeof this.map_row_to_columns == 'function') { var values = this.map_row_to_columns(params.row,this.columns,this.scratch_data); + if (typeof values.values == 'undefined') { + labels = values; - } else { + } + + else { + labels = values.values; sort_values = values.sort_values; } } + for (var i = 0; i < labels.length; i++) { + var treecell; + if (typeof treerow.childNodes[i] == 'undefined') { + treecell = document.createElement('treecell'); treerow.appendChild(treecell); - } else { + } + + else { + treecell = treerow.childNodes[i]; } - if ( this.columns[i].editable == false ) { treecell.setAttribute('editable','false'); } + + if ( this.columns[i].editable == false ) { + + treecell.setAttribute('editable','false'); + } + if ( this.columns[i].type == 'checkbox') { + treecell.setAttribute('value', labels[i]); - } else { + } + + else { + treecell.setAttribute('label',typeof labels[i] == 'string' || typeof labels[i] == 'number' ? labels[i] : ''); } + if (sort_values[i]) { + treecell.setAttribute('sort_value',js2JSON(sort_values[i])); } + s += ('treecell = ' + treecell + ' with label = ' + labels[i] + '\n'); } - } else { + } + + else { throw('No row to column mapping function.'); } + this.error.sdump('D_LIST',s); }, '_map_row_to_listcell' : function(params,listitem) { + var obj = this; var s = ''; + for (var i = 0; i < this.columns.length; i++) { + var value = ''; + if (typeof params.map_row_to_column == 'function') { value = params.map_row_to_column(params.row,this.columns[i],this.scratch_data); + } - } else { + else { if (typeof this.map_row_to_column == 'function') { value = this.map_row_to_column(params.row,this.columns[i],this.scratch_data); } } + if (typeof value == 'string' || typeof value == 'number') { + var listcell = document.createElement('listcell'); listcell.setAttribute('label',value); listitem.appendChild(listcell); s += ('listcell = ' + listcell + ' with label = ' + value + '\n'); - } else { + } + + else { + listitem.appendChild(value); s += ('listcell = ' + value + ' is really a ' + value.nodeName + '\n'); } } + this.error.sdump('D_LIST',s); }, 'select_all' : function(params) { + var obj = this; + switch(this.node.nodeName) { + case 'tree' : return this._select_all_from_tree(params); break; default: throw('NYI: Need ._select_all_from_() for ' + this.node.nodeName); break; } }, '_select_all_from_tree' : function(params) { + var obj = this; this.node.view.selection.selectAll(); }, 'retrieve_selection' : function(params) { + var obj = this; + switch(this.node.nodeName) { + case 'tree' : return this._retrieve_selection_from_tree(params); break; default: throw('NYI: Need ._retrieve_selection_from_() for ' + this.node.nodeName); break; } }, '_retrieve_selection_from_tree' : function(params) { + var obj = this; var list = []; var start = new Object(); var end = new Object(); var numRanges = this.node.view.selection.getRangeCount(); + for (var t=0; t 1) { + process_tree(treeitem.lastChild); } } @@ -1430,8 +1850,11 @@ util.list.prototype = { }, 'dump_csv' : function(params) { + var obj = this; + switch(this.node.nodeName) { + case 'tree' : return this._dump_tree_csv(params); break; default: throw('NYI: Need .dump_csv() for ' + this.node.nodeName); break; } @@ -1439,38 +1862,67 @@ util.list.prototype = { }, '_dump_tree_csv' : function(params) { + var obj = this; var _dump = ''; var ord_cols = []; + for (var j = 0; j < obj.columns.length; j++) { + if (obj.node.treeBoxObject.columns.getColumnAt(j).element.getAttribute('hidden') == 'true') { + /* skip */ - } else { + } + + else { + ord_cols.push( [ obj.node.treeBoxObject.columns.getColumnAt(j).element.getAttribute('ordinal'), j ] ); } } + ord_cols.sort( function(a,b) { - if ( Number( a[0] ) < Number( b[0] ) ) return -1; - if ( Number( a[0] ) > Number( b[0] ) ) return 1; + + if ( Number( a[0] ) < Number( b[0] ) ) return -1; + + if ( Number( a[0] ) > Number( b[0] ) ) return 1; + return 0; } ); + for (var j = 0; j < ord_cols.length; j++) { - if (_dump) _dump += ','; + + if (_dump){ + + _dump += ','; + } + _dump += '"' + obj.columns[ ord_cols[j][1] ].label.replace(/"/g, '""') + '"'; } + _dump += '\r\n'; 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 += ','; + + 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); } } @@ -1482,8 +1934,11 @@ util.list.prototype = { }, 'dump_extended_format' : function(params) { + var obj = this; + switch(this.node.nodeName) { + case 'tree' : return this._dump_tree_extended_format(params); break; default: throw('NYI: Need .dump_extended_format() for ' + this.node.nodeName); break; } @@ -1491,17 +1946,26 @@ util.list.prototype = { }, '_dump_tree_extended_format' : function(params) { + var obj = this; var _dump = ''; var ord_cols = []; + for (var j = 0; j < obj.columns.length; j++) { + if (obj.node.treeBoxObject.columns.getColumnAt(j).element.getAttribute('hidden') == 'true') { + /* skip */ - } else { + } + + else { + ord_cols.push( [ obj.node.treeBoxObject.columns.getColumnAt(j).element.getAttribute('ordinal'), j ] ); } } - ord_cols.sort( function(a,b) { + + ord_cols.sort( function(a,b) { + if ( Number( a[0] ) < Number( b[0] ) ) return -1; if ( Number( a[0] ) > Number( b[0] ) ) return 1; return 0; @@ -2085,15 +2549,15 @@ util.list.prototype = { var def = { 'id' : col_id, 'label' : my_field.label || my_field.name, - 'sort_type' : [ 'int', 'float', 'id', 'number' ].indexOf(my_field.datatype) > -1 ? 'number' : - ( my_field.datatype == 'money' ? 'money' : + 'sort_type' : [ 'int', 'float', 'id', 'number' ].indexOf(my_field.datatype) > -1 ? 'number' : + ( my_field.datatype == 'money' ? 'money' : ( my_field.datatype == 'timestamp' ? 'date' : 'default')), 'hidden' : my_field.virtual || my_field.datatype == 'link', 'flex' : 1 - }; + }; // my_field.datatype => bool float id int interval link money number org_unit text timestamp if (my_field.datatype == 'link') { - def.render = function(my) { + def.render = function(my) { // is the object fleshed? return my[dataobj][datafield]() && typeof my[dataobj][datafield]() == 'object' // yes, show the display field @@ -2111,7 +2575,7 @@ util.list.prototype = { ) // no, just show the raw value : my[dataobj][datafield]() - ); + ); } } else { def.render = function(my) { return my[dataobj][datafield](); } -- 2.11.0