From dcaca3584b28f741849bc5954f9a89ec2c2486da Mon Sep 17 00:00:00 2001 From: Jason Etheridge Date: Fri, 30 Mar 2012 13:06:44 -0400 Subject: [PATCH] add context menu to xul list column headers for multi-sort options. Also fix ascending vs descending internally (since the distinction is now exposed via labels) Signed-off-by: Jason Etheridge Signed-off-by: Jason Stephenson Signed-off-by: Mike Rylander --- Open-ILS/web/opac/locale/en-US/lang.dtd | 5 + .../staff_client/chrome/content/util/list.js | 151 ++++++++++++++---- .../staff_client/chrome/content/util/sort.js | 21 +++ .../server/OpenILS/util_overlay.xul | 7 + 4 files changed, 155 insertions(+), 29 deletions(-) create mode 100644 Open-ILS/xul/staff_client/chrome/content/util/sort.js diff --git a/Open-ILS/web/opac/locale/en-US/lang.dtd b/Open-ILS/web/opac/locale/en-US/lang.dtd index e42c1a1039..bffcaee60e 100644 --- a/Open-ILS/web/opac/locale/en-US/lang.dtd +++ b/Open-ILS/web/opac/locale/en-US/lang.dtd @@ -77,6 +77,11 @@ + + + + + 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 2083ef5190..b366579318 100644 --- a/Open-ILS/xul/staff_client/chrome/content/util/list.js +++ b/Open-ILS/xul/staff_client/chrome/content/util/list.js @@ -25,6 +25,7 @@ util.list = function (id) { JSAN.use('OpenILS.data'); this.data = new OpenILS.data(); this.data.stash_retrieve(); JSAN.use('util.functional'); + JSAN.use('util.widgets'); return this; }; @@ -100,6 +101,9 @@ util.list.prototype = { var treecols = document.createElement('treecols'); this.node.appendChild(treecols); this.treecols = treecols; + if (document.getElementById('column_sort_menu')) { + treecols.setAttribute('context','column_sort_menu'); + } var check_for_id_collisions = {}; for (var i = 0; i < this.columns.length; i++) { @@ -122,6 +126,7 @@ util.list.prototype = { treecol.setAttribute(j,value); } treecols.appendChild(treecol); + if (this.columns[i].type == 'checkbox') { treecol.addEventListener( 'click', @@ -138,50 +143,138 @@ util.list.prototype = { false ); } else { + treecol.addEventListener( + 'sort_first_asc', + function(ev) { + dump('sort_first_asc\n'); + ev.target.setAttribute('sortDir','asc'); + obj.first_sort = { + 'target' : ev.target, + 'sortDir' : 'asc' + }; + obj.sub_sorts = []; + util.widgets.dispatch('sort',ev.target); + }, + false + ); + treecol.addEventListener( + 'sort_first_desc', + function(ev) { + dump('sort_first_desc\n'); + ev.target.setAttribute('sortDir','desc'); + obj.first_sort = { + 'target' : ev.target, + 'sortDir' : 'desc' + }; + obj.sub_sorts = []; + util.widgets.dispatch('sort',ev.target); + }, + false + ); + treecol.addEventListener( + 'sort_next_asc', + function(ev) { + dump('sort_next_asc\n'); + ev.target.setAttribute('sortDir','asc'); + obj.sub_sorts.push({ + 'target' : ev.target, + 'sortDir' : 'asc' + }); + util.widgets.dispatch('sort',ev.target); + }, + false + ); + treecol.addEventListener( + 'sort_next_desc', + function(ev) { + dump('sort_next_desc\n'); + ev.target.setAttribute('sortDir','desc'); + obj.sub_sorts.push({ + 'target' : ev.target, + 'sortDir' : 'desc' + }); + util.widgets.dispatch('sort',ev.target); + }, + false + ); + treecol.addEventListener( 'click', function(ev) { - if (ev.target.getAttribute('no_sort')) { + dump('click\n'); + if (ev.button == 2 /* context menu click */ || ev.target.getAttribute('no_sort')) { + return; + } + if (document.popupNode + && document.popupNode.nodeName == 'treecol' + && document.popupNode.hasAttribute('locked') + ) { return; } + dump('click2\n'); - function do_it() { - if (ev.ctrlKey) { // sub sort - var sortDir = 'asc'; - if (ev.shiftKey) { - sortDir = 'desc'; - } - obj.sub_sorts.push({ - 'target' : ev.target, - 'sortDir' : sortDir - }); - } else { // first sort - var sortDir = ev.target.getAttribute('sortDir') || 'desc'; - if (sortDir == 'desc') sortDir = 'asc'; else sortDir = 'desc'; - if (ev.shiftKey) { - sortDir = 'desc'; - } - ev.target.setAttribute('sortDir',sortDir); - obj.first_sort = { - 'target' : ev.target, - 'sortDir' : sortDir - }; - obj.sub_sorts = []; + if (ev.ctrlKey) { // sub sort + dump('click3\n'); + var sortDir = 'asc'; + if (ev.shiftKey) { + sortDir = 'desc'; } - if (obj.first_sort) { - obj._sort_tree(); + ev.target.setAttribute('sortDir',sortDir); + obj.sub_sorts.push({ + 'target' : ev.target, + 'sortDir' : sortDir + }); + } else { // first sort + dump('click4\n'); + var sortDir = ev.target.getAttribute('sortDir') || 'desc'; + if (sortDir == 'desc') sortDir = 'asc'; else sortDir = 'desc'; + if (ev.shiftKey) { + sortDir = 'desc'; } + ev.target.setAttribute('sortDir',sortDir); + obj.first_sort = { + 'target' : ev.target, + 'sortDir' : sortDir + }; + obj.sub_sorts = []; + } + util.widgets.dispatch('sort',ev.target); + }, + false + ); + + treecol.addEventListener( + 'sort', + function(ev) { + dump('sort\n'); + if (!obj.first_sort) { + return; + } + dump('sort2\n'); + + function do_it() { + dump('sort3\n'); + obj._sort_tree(); } - if (obj.row_count.total != obj.row_count.fleshed && (obj.row_count.total - obj.row_count.fleshed) > 50) { - var r = window.confirm(document.getElementById('offlineStrings').getFormattedString('list.row_fetch_warning',[obj.row_count.fleshed,obj.row_count.total])); + if (obj.row_count.total != obj.row_count.fleshed + && (obj.row_count.total - obj.row_count.fleshed) > 50 + ) { + var r = window.confirm( + document.getElementById('offlineStrings').getFormattedString( + 'list.row_fetch_warning', + [obj.row_count.fleshed,obj.row_count.total] + ) + ); if (r) { setTimeout( do_it, 0 ); } + } else { setTimeout( do_it, 0 ); } + }, false ); @@ -1706,14 +1799,14 @@ util.list.prototype = { var values; if (sorts[i].sortDir == 'asc') { values = normalize( - B['values'][i]['value'], A['values'][i]['value'], + B['values'][i]['value'], A['values'][i]['position'] ); } else { values = normalize( - A['values'][i]['value'], B['values'][i]['value'], + A['values'][i]['value'], A['values'][i]['position'] ); } diff --git a/Open-ILS/xul/staff_client/chrome/content/util/sort.js b/Open-ILS/xul/staff_client/chrome/content/util/sort.js new file mode 100644 index 0000000000..083c243681 --- /dev/null +++ b/Open-ILS/xul/staff_client/chrome/content/util/sort.js @@ -0,0 +1,21 @@ +dump('entering util/sort.js\n'); + +if (typeof util == 'undefined') var util = {}; +util.sort = {}; + +util.sort.EXPORT_OK = [ + 'dispatch' +]; +util.sort.EXPORT_TAGS = { ':all' : util.sort.EXPORT_OK }; + +util.sort.dispatch = function(what,sortDir) { + try { + dump('util.sort.dispatch('+what+','+sortDir+');\n'); + JSAN.use('util.widgets'); + util.widgets.dispatch('sort_'+what+'_'+sortDir, document.popupNode); + } catch(E) { + alert(E); + } +} + +dump('exiting util/sort.js\n'); diff --git a/Open-ILS/xul/staff_client/server/OpenILS/util_overlay.xul b/Open-ILS/xul/staff_client/server/OpenILS/util_overlay.xul index 323971f17e..3192a907d3 100644 --- a/Open-ILS/xul/staff_client/server/OpenILS/util_overlay.xul +++ b/Open-ILS/xul/staff_client/server/OpenILS/util_overlay.xul @@ -57,6 +57,7 @@