From 696455ad8a70084e330f7e1f6edec973e58cd2f5 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 16 Aug 2009 19:19:36 +0100 Subject: [PATCH] Javascript sorting for query_age --- yarrg/web/query_age | 49 ++++++++++++++++------- yarrg/web/tabsort | 95 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 15 deletions(-) create mode 100644 yarrg/web/tabsort diff --git a/yarrg/web/query_age b/yarrg/web/query_age index 77d750c..28d6a5f 100644 --- a/yarrg/web/query_age +++ b/yarrg/web/query_age @@ -78,27 +78,39 @@ $sth->execute();

Market data age

- +
% my %da_ages; -% $da_ages{'daid_loaded'}= 0; +% my %ts_sortkeys; +% $da_ages{'id_loaded'}= 0; % while ($row=$sth->fetchrow_hashref) { -% my $elid= "daid_$row->{'islandid'}"; +% my $rowid= "id_$row->{'islandid'}"; +% my $cellid= "c$rowid"; % my $age= $now - $row->{'timestamp'}; -% $da_ages{$elid}= $age; - +% $ts_sortkeys{'0'}{$rowid}= $row->{'archipelago'}; +% $ts_sortkeys{'1'}{$rowid}= $row->{'islandname'}; +% $da_ages{$rowid}= $age; + + > % }
Archipelago Island Age
<% $row->{'archipelago'} |h - %> <% $row->{'islandname'} |h - %> <% $prettyprint_age->($age) %>
<% $row->{'archipelago'} |h + %> <% $row->{'islandname'} |h + %> <% $prettyprint_age->($age) %>
+<& tabsort, table => 'ts_table', cols => [ + {}, {}, + { DoReverse => 1, + Numeric => 1, + SortKey => "da_ages[rowid]" }] + &> +

Time since this page loaded: -(not known; times above not updating) +(not known; times above not updating)

@@ -106,25 +118,32 @@ Time since this page loaded:
<&| script &> + ts_sortkeys= <% to_json_protecttags(\%ts_sortkeys) %>; da_ages= <% to_json_protecttags(\%da_ages) %>; function da_Refresh() { var now= Date.now(); debug('updating now='+now); - for (var elid in da_ages) { - var el= document.getElementById(elid); - var oldage= da_ages[elid]; + for (var rowid in da_ages) { + var oldage= da_ages[rowid]; + var cellid= 'c'+rowid; + var el= document.getElementById(cellid); var age= oldage + (now - da_pageload) / 1000; - var newhtml= <% $meta_prettyprint_age->('age','Math.floor','+') %> + var newhtml= <% $meta_prettyprint_age->('age','Math.floor','+') %>; % if ($ARGS{debug}) { - if (elid == 'daid_loaded') - debug('element elid='+elid+' oldage='+oldage+' age='+age+': '+newhtml); + if (cellid == 'cid_loaded') + debug('element rowid='+rowid+' cellid='+cellid + +' oldage='+oldage+' age='+age+': '+newhtml); % } el.innerHTML= newhtml; } } - window.onload= da_Refresh; + function all_onload() { + ts_onload__ts_table(); + da_Refresh(); + } + window.onload= all_onload; window.setInterval(da_Refresh, 10000); diff --git a/yarrg/web/tabsort b/yarrg/web/tabsort new file mode 100644 index 0000000..8f48b25 --- /dev/null +++ b/yarrg/web/tabsort @@ -0,0 +1,95 @@ +<%args> +$table => 'ts_table' +$sortkeys => 'ts_sortkeys' +$cols + + +<%doc> + NoSort + DoReverse + + +<&| script &> + +% my $sortfn= "ts_sort__$table"; +function <% $sortfn %>(compar) { + debug('sorting compar='+compar); + var table= document.getElementById('<% $table %>'); + var firstrow= table.getElementsByTagName('tr').item(0); + var tbody= firstrow.parentNode + var rows= tbody.childNodes + var newrows= new Array; + for (var rowix=0; 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; + newrows.push(row); + } + newrows.sort(compar); + for (var rowix=0; rowix < newrows.length; rowix++) { + var row= newrows[rowix]; + debug('add row '+rowix+' [[ '+row+' ]]'); + tbody.appendChild(row); + } +} + +% my %add_heads; +% foreach my $cix (0..$#$cols) { +% my $col= $cols->[$cix]; +% my $thhtml= ''; +% next if $col->{NoSort}; + +% my $mapfn= "ts_compar${cix}_map__$table"; +function <% $mapfn %>(rowelement) { + var rowid = rowelement.id; +% if ($col->{SortKey}) { + var sk = <% $col->{SortKey} %>; + debug('map rowid='+rowid+' sk='+sk); + return sk; +% } else { + return <% $sortkeys %>[<% $cix %>][rowid]; +% } +} + +% my $comparefn= "ts_compar${cix}_cmp0__$table"; +function <% $comparefn %>(a,b) { + var a_key = <% $mapfn %>(a); + var b_key = <% $mapfn %>(b); +% if ($col->{Numeric}) { + return a_key - b_key +% } else { + if (a_key < b_key) return -1; + if (a_key > b_key) return +1; + return 0; +% } +} + +% foreach my $reverse (qw(0 1)) { +% my $tcomparefn= "ts_compar${cix}_cmp${reverse}__$table"; +% if ($reverse) { +% next unless $col->{DoReverse}; +function <% $tcomparefn %>(a,b) { return -<% $comparefn %>(a,b); } +% } +% $thhtml .= "". +% ($reverse ? '∨' : '∧'). ''; +% } +% if (length $thhtml) { +% $add_heads{$cix}= $thhtml; +% } +% } + +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 thlist= firstth.parentNode.getElementsByTagName('th'); + debug('thlist='+thlist); + debug('thlist.item(2)=' + thlist.item(2)); + for (var cix in ts_add_heads) { + var ah = ts_add_heads[cix]; + debug('appending to cix='+cix+' ah='+ah); + thlist.item(cix).innerHTML += ah; + } +} + -- 2.30.2