X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-test.git;a=blobdiff_plain;f=yarrg%2Fweb%2Ftabsort;h=5031a988382acf63c15cf7f736cb710bce77c379;hp=8f48b25ef4764b4d66ddbb6ce06a121882a9df23;hb=9a4d1b4c8bdd8ef11b1d0102a4eee188c4c4f011;hpb=696455ad8a70084e330f7e1f6edec973e58cd2f5 diff --git a/yarrg/web/tabsort b/yarrg/web/tabsort index 8f48b25..5031a98 100644 --- a/yarrg/web/tabsort +++ b/yarrg/web/tabsort @@ -1,17 +1,62 @@ +<%doc> + + This is part of the YARRG website. YARRG is a tool and website + for assisting players of Yohoho Puzzle Pirates. + + Copyright (C) 2009 Ian Jackson + Copyright (C) 2009 Clare Boothby + + YARRG's client code etc. is covered by the ordinary GNU GPL (v3 or later). + The YARRG website is covered by the GNU Affero GPL v3 or later, which + basically means that every installation of the website will let you + download the source. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + Yohoho and Puzzle Pirates are probably trademarks of Three Rings and + are used without permission. This program is not endorsed or + sponsored by Three Rings. + + + This Mason component generates Javascript for sorting tables in + DHTML. + + + + <%args> $table => 'ts_table' $sortkeys => 'ts_sortkeys' +$throw => undef +$tbrow => undef +$rowclass => undef $cols <%doc> + Numeric + SortKey + MapFn NoSort DoReverse <&| script &> -% my $sortfn= "ts_sort__$table"; +% print $m->content(); + +% my $sortfn= "ts_s_$table"; function <% $sortfn %>(compar) { debug('sorting compar='+compar); var table= document.getElementById('<% $table %>'); @@ -19,14 +64,44 @@ function <% $sortfn %>(compar) { var tbody= firstrow.parentNode var rows= tbody.childNodes var newrows= new Array; - for (var rowix=0; rowix < rows.length; rowix++) { + var finalrows= new Array; + var rowix= 0; +% if (defined $throw) { + for (; rowix < rows.length; rowix++) { var row= rows.item(rowix); - debug('process row '+rowix+' [[ '+row+' ]] id='+row.id) - if (!row.id) continue; - if (row.tagName != 'TR') continue; + if (row.id == '<% $throw %>') break; + debug('skip row '+rowix+' [[ '+row+' ]] id='+row.id); + } + rowix++; +% } + for (; rowix < rows.length; rowix++) { + var row= rows.item(rowix); +% if (defined $tbrow) { + if (row.id == '<% $tbrow %>') break; +% } + if (!row.id) { debug('noid row '+rowix+' [[ '+row+' ]]'); continue; } + if (row.tagName != 'TR') { + debug('no-tr row '+rowix+' tagName='+row.tagName+' [[ '+row+' ]]'); + continue; + } + debug('process row '+rowix+' [[ '+row+' ]] id='+row.id); newrows.push(row); } + for (; rowix < rows.length; rowix++) { + var row= rows.item(rowix); + finalrows.push(row); + debug('final row '+rowix+' [[ '+row+' ]]'); + } newrows.sort(compar); +% if (defined $rowclass) { + for (var rowix=0; rowix < newrows.length; rowix++) { + var row= newrows[rowix]; + var classname= '<% $rowclass %>'+(rowix % 2); + debug('fix row '+rowix+' class '+classname); + row.className= classname; + } +% } + newrows= newrows.concat(finalrows); for (var rowix=0; rowix < newrows.length; rowix++) { var row= newrows[rowix]; debug('add row '+rowix+' [[ '+row+' ]]'); @@ -40,36 +115,40 @@ function <% $sortfn %>(compar) { % my $thhtml= ''; % next if $col->{NoSort}; -% my $mapfn= "ts_compar${cix}_map__$table"; -function <% $mapfn %>(rowelement) { - var rowid = rowelement.id; +% my $mapfn= "ts_${cix}m_$table"; +function <% $mapfn %>(re) { + var rowid = re.id; % if ($col->{SortKey}) { - var sk = <% $col->{SortKey} %>; - debug('map rowid='+rowid+' sk='+sk); - return sk; + return <% $col->{SortKey} %>; % } else { - return <% $sortkeys %>[<% $cix %>][rowid]; +% my $sk= "$sortkeys"."[$cix][rowid]"; +% if ($col->{MapFn}) { + return <% $col->{MapFn} %>(<% $sk %>); +% } else { + return <% $sk %>; +% } % } } -% my $comparefn= "ts_compar${cix}_cmp0__$table"; +% my $comparefn= "ts_${cix}c0_$table"; function <% $comparefn %>(a,b) { - var a_key = <% $mapfn %>(a); - var b_key = <% $mapfn %>(b); + var ak = <% $mapfn %>(a); + var bk = <% $mapfn %>(b); % if ($col->{Numeric}) { - return a_key - b_key + return ak - bk % } else { - if (a_key < b_key) return -1; - if (a_key > b_key) return +1; + if (ak < bk) return -1; + if (ak > bk) return +1; return 0; % } } -% foreach my $reverse (qw(0 1)) { -% my $tcomparefn= "ts_compar${cix}_cmp${reverse}__$table"; +% foreach my $reverse (qw(1 0)) { +% my $tcomparefn= "ts_${cix}c${reverse}_$table"; % if ($reverse) { % next unless $col->{DoReverse}; function <% $tcomparefn %>(a,b) { return -<% $comparefn %>(a,b); } + % } % $thhtml .= "". % ($reverse ? '∨' : '∧'). ''; @@ -81,15 +160,18 @@ function <% $tcomparefn %>(a,b) { return -<% $comparefn %>(a,b); } function ts_onload__<% $table %>() { var ts_add_heads= <% to_json_protecttags(\%add_heads) %>; - var table= document.getElementById('<% $table %>'); - var firstth= table.getElementsByTagName('th').item(0); + var ctr= document.getElementById('<% defined($throw) ? $throw : $table %>'); + var firstth= ctr.getElementsByTagName('th').item(0); var thlist= firstth.parentNode.getElementsByTagName('th'); debug('thlist='+thlist); debug('thlist.item(2)=' + thlist.item(2)); for (var cix in ts_add_heads) { + if (!ts_add_heads.hasOwnProperty(cix)) continue; var ah = ts_add_heads[cix]; debug('appending to cix='+cix+' ah='+ah); thlist.item(cix).innerHTML += ah; } } + +register_onload(ts_onload__<% $table %>);