From: Ian Jackson Date: Sat, 15 Aug 2009 23:49:45 +0000 (+0100) Subject: Split lookup options into separate query_ components X-Git-Tag: 3.4~187 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-live.git;a=commitdiff_plain;h=aed32e2dcb952bcfc9678eef4125e269f538edf2;hp=734c62d8185e721a576750ce5aa1182f04d1de9e Split lookup options into separate query_ components --- diff --git a/yarrg/web/lookup b/yarrg/web/lookup index 931594a..38d87d6 100755 --- a/yarrg/web/lookup +++ b/yarrg/web/lookup @@ -39,11 +39,6 @@ my %a; my %ahtml; my @vars; -# for output: -my @archipelagoes; -my @islandids; -my %islandid2; - #---------- "mode" argument parsing and mode menu at top of page ---------- # for debugging, invoke as @@ -151,7 +146,6 @@ dbw_connect($a{Ocean}); <%args> $debug => 0 -$routestring => ''
@@ -159,234 +153,12 @@ $routestring => '' %########### query `route' ########## % if ($a{Query} eq 'route') { -

Specify route

-
- -%#---------- textbox, user enters route as string ---------- -% if (!$a{Dropdowns}) { - -Enter route (islands, or archipelagoes, separated by |s or commas; - abbreviations are OK):
- -<&| script &> -tr_uri= "routetextstring?format=json&type=text/xml" - + "&ocean=<% uri_escape($a{Ocean}) %>"; - -tr_timeout=false; -tr_request=false; -tr_done=''; -tr_needed=''; -function tr_Later(){ - window.clearTimeout(tr_timeout); - tr_timeout = window.setTimeout(tr_Needed, 500); -} -function tr_Needed(){ - window.clearTimeout(tr_timeout); - tr_element= document.getElementById('routestring'); - tr_needed= tr_element.value; - tr_Request(); -} -function tr_Request(){ - if (tr_request || tr_needed==tr_done) return; - tr_done= tr_needed; - tr_request= new XMLHttpRequest(); - uri= tr_uri+'&string='+encodeURIComponent(tr_needed); - tr_request.open('GET', uri); - tr_request.onreadystatechange= tr_Ready; - tr_request.send(null); -} -function tr_Ready() { - if (tr_request.readyState != 4) return; - if (tr_request.status == 200) { - response= tr_request.responseText; - eval('results='+response); - toedit= document.getElementById('routeresults'); - toedit.innerHTML= results.show; - } - tr_request= false; - tr_Request(); -} -window.onload= tr_Needed; - - -
-
 

- -% } else { #---------- dropdowns, user selects from menus ---------- - -<%perl> -my ($sth,$row);; -my @archlistdata; -my %islandlistdata; -$islandlistdata{'none'}= [ [ "none", "Select island..." ] ]; - -my $optionlistmap= sub { - my ($optlist, $selected) = @_; - my $out=''; - foreach my $entry (@$optlist) { - $out.= sprintf('', - encode_entities($entry->[0]), - defined $selected && $entry->[0] eq $selected - ? 'selected' : '', - encode_entities($entry->[1])); - } - return $out; -}; - -my $dbh= dbw_connect($a{Ocean}); - -$sth= $dbh->prepare("SELECT DISTINCT archipelago FROM islands - ORDER BY archipelago;"); -$sth->execute(); - -while ($row=$sth->fetchrow_arrayref) { - my ($arch)= @$row; - push @archlistdata, [ $arch, $arch ]; - $islandlistdata{$arch}= [ [ "none", "Whole arch" ] ]; -} - -$sth= $dbh->prepare("SELECT islandid,islandname,archipelago - FROM islands - ORDER BY islandname;"); -$sth->execute(); - -while ($row=$sth->fetchrow_arrayref) { - my $arch= $row->[2]; - push @{ $islandlistdata{'none'} }, [ @$row ]; - push @{ $islandlistdata{$arch} }, [ @$row ]; - $islandid2{$row->[0]}= { Name => $row->[1], Arch => $arch }; -} - -my %resetislandlistdata; -foreach my $arch (keys %islandlistdata) { - $resetislandlistdata{$arch}= - $optionlistmap->($islandlistdata{$arch}, ''); -} - - - - - -<&| script &> -ms_lists= <% to_json_protecttags(\%resetislandlistdata) %>; -function ms_Setarch(dd) { - debug('ms_SetArch '+dd+' arch='+arch); - var arch= document.getElementsByName('archipelago'+dd).item(0).value; - var got= ms_lists[arch]; - if (got == undefined) return; // unknown arch ? hrm - debug('ms_SetArch '+dd+' arch='+arch+' got ok'); - var select= document.getElementsByName('islandid'+dd).item(0); - select.innerHTML= got; - debug('ms_SetArch '+dd+' arch='+arch+' innerHTML set'); -} - - - - - -% for my $dd (0..$a{Dropdowns}-1) { - -% } - - - -% for my $dd (0..$a{Dropdowns}-1) { -% my $arch= $ARGS{"archipelago$dd"}; -% $arch= 'none' if !defined $arch; - -% } - - -
-
-
- -% } #---------- end of dropdowns, now common middle of page code ---------- - - -
- -<%perl> -#========== result computations ========== - -my $results_head; -$results_head= sub { - print "

Results

\n"; - $results_head= sub { }; -}; - -#---------- result computation - textstring ---------- -if (!$a{Dropdowns}) { - if (length $routestring) { - $results_head->(); - my $rsr= $m->comp('routetextstring', - ocean => $a{Ocean}, - string => $routestring, - format => 'return' - ); - if (length $rsr->{Error}) { - print encode_entities($rsr->{Error}); - } else { - foreach my $entry (@{ $rsr->{Results} }) { - push @archipelagoes, - defined $entry->[1] ? undef : $entry->[0]; - push @islandids, $entry->[1]; - } - } - } - -} else { #---------- results - dropdowns ---------- - -my $argorundef= sub { - my ($dd,$base) = @_; - my $thing= $ARGS{"${base}${dd}"}; - $thing= undef if defined $thing and $thing eq 'none'; - return $thing; -}; - -for my $dd (0..$a{Dropdowns}-1) { - my $arch= $argorundef->($dd,'archipelago'); - my $island= $argorundef->($dd,'islandid'); - next unless defined $arch or defined $island; - if (defined $island and defined $arch) { - my $ii= $islandid2{$island}; - my $iarch= $ii->{Arch}; - if ($iarch ne $arch) { - $results_head->(); - - Specified archipelago <% $arch %> but - island <% $ii->{Name} %> - which is in <% $iarch %>; using the island.
-<%perl> - } - $arch= undef; - } - push @archipelagoes, $arch; - push @islandids, $island; -} - -}#---------- result processing, common stuff - - -% if (@islandids) { -% $results_head->(); - -<& routetrade, islandids => \@islandids, archipelagoes => \@archipelagoes &> - -% } +<& query_route, %baseqf, %queryqf, quri => $quri, a => \%a &> % } elsif ($a{Query} eq 'age') { % ########### query `age' ########## -

Market data age

-<& dataage, %baseqf, %queryqf &> +<& query_age, %baseqf, %queryqf &> % } ########## end of `age' query ########## diff --git a/yarrg/web/dataage b/yarrg/web/query_age similarity index 99% rename from yarrg/web/dataage rename to yarrg/web/query_age index 851e5d8..c5009d3 100644 --- a/yarrg/web/dataage +++ b/yarrg/web/query_age @@ -71,6 +71,8 @@ $sth->execute(); da_pageload= Date.now(); +

Market data age

+
Archipelago diff --git a/yarrg/web/query_route b/yarrg/web/query_route new file mode 100644 index 0000000..4344e1d --- /dev/null +++ b/yarrg/web/query_route @@ -0,0 +1,237 @@ +<%args> +$quri +$a +$routestring => ''; + +<%perl> +#my $routestring= $queryqf{'routestring'}; +# +# for output: +my @archipelagoes; +my @islandids; +my %islandid2; + + + +

Specify route

+
+ +%#---------- textbox, user enters route as string ---------- +% if (!$a->{Dropdowns}) { + +Enter route (islands, or archipelagoes, separated by |s or commas; + abbreviations are OK):
+ +<&| script &> +tr_uri= "routetextstring?format=json&type=text/xml" + + "&ocean=<% uri_escape($a->{Ocean}) %>"; + +tr_timeout=false; +tr_request=false; +tr_done=''; +tr_needed=''; +function tr_Later(){ + window.clearTimeout(tr_timeout); + tr_timeout = window.setTimeout(tr_Needed, 500); +} +function tr_Needed(){ + window.clearTimeout(tr_timeout); + tr_element= document.getElementById('routestring'); + tr_needed= tr_element.value; + tr_Request(); +} +function tr_Request(){ + if (tr_request || tr_needed==tr_done) return; + tr_done= tr_needed; + tr_request= new XMLHttpRequest(); + uri= tr_uri+'&string='+encodeURIComponent(tr_needed); + tr_request.open('GET', uri); + tr_request.onreadystatechange= tr_Ready; + tr_request.send(null); +} +function tr_Ready() { + if (tr_request.readyState != 4) return; + if (tr_request.status == 200) { + response= tr_request.responseText; + eval('results='+response); + toedit= document.getElementById('routeresults'); + toedit.innerHTML= results.show; + } + tr_request= false; + tr_Request(); +} +window.onload= tr_Needed; + + +
+
 

+ +% } else { #---------- dropdowns, user selects from menus ---------- + +<%perl> +my ($sth,$row);; +my @archlistdata; +my %islandlistdata; +$islandlistdata{'none'}= [ [ "none", "Select island..." ] ]; + +my $optionlistmap= sub { + my ($optlist, $selected) = @_; + my $out=''; + foreach my $entry (@$optlist) { + $out.= sprintf('', + encode_entities($entry->[0]), + defined $selected && $entry->[0] eq $selected + ? 'selected' : '', + encode_entities($entry->[1])); + } + return $out; +}; + +my $dbh= dbw_connect($a->{Ocean}); + +$sth= $dbh->prepare("SELECT DISTINCT archipelago FROM islands + ORDER BY archipelago;"); +$sth->execute(); + +while ($row=$sth->fetchrow_arrayref) { + my ($arch)= @$row; + push @archlistdata, [ $arch, $arch ]; + $islandlistdata{$arch}= [ [ "none", "Whole arch" ] ]; +} + +$sth= $dbh->prepare("SELECT islandid,islandname,archipelago + FROM islands + ORDER BY islandname;"); +$sth->execute(); + +while ($row=$sth->fetchrow_arrayref) { + my $arch= $row->[2]; + push @{ $islandlistdata{'none'} }, [ @$row ]; + push @{ $islandlistdata{$arch} }, [ @$row ]; + $islandid2{$row->[0]}= { Name => $row->[1], Arch => $arch }; +} + +my %resetislandlistdata; +foreach my $arch (keys %islandlistdata) { + $resetislandlistdata{$arch}= + $optionlistmap->($islandlistdata{$arch}, ''); +} + + + + + +<&| script &> +ms_lists= <% to_json_protecttags(\%resetislandlistdata) %>; +function ms_Setarch(dd) { + debug('ms_SetArch '+dd+' arch='+arch); + var arch= document.getElementsByName('archipelago'+dd).item(0).value; + var got= ms_lists[arch]; + if (got == undefined) return; // unknown arch ? hrm + debug('ms_SetArch '+dd+' arch='+arch+' got ok'); + var select= document.getElementsByName('islandid'+dd).item(0); + select.innerHTML= got; + debug('ms_SetArch '+dd+' arch='+arch+' innerHTML set'); +} + + + + + +% for my $dd (0..$a->{Dropdowns}-1) { + +% } + + + +% for my $dd (0..$a->{Dropdowns}-1) { +% my $arch= $ARGS{"archipelago$dd"}; +% $arch= 'none' if !defined $arch; + +% } + + +
+
+
+ +% } #---------- end of dropdowns, now common middle of page code ---------- + + +
+ +<%perl> +#========== result computations ========== + +my $results_head; +$results_head= sub { + print "

Results

\n"; + $results_head= sub { }; +}; + +#---------- result computation - textstring ---------- +if (!$a->{Dropdowns}) { + if (length $routestring) { + $results_head->(); + my $rsr= $m->comp('routetextstring', + ocean => $a->{Ocean}, + string => $routestring, + format => 'return' + ); + if (length $rsr->{Error}) { + print encode_entities($rsr->{Error}); + } else { + foreach my $entry (@{ $rsr->{Results} }) { + push @archipelagoes, + defined $entry->[1] ? undef : $entry->[0]; + push @islandids, $entry->[1]; + } + } + } + +} else { #---------- results - dropdowns ---------- + +my $argorundef= sub { + my ($dd,$base) = @_; + my $thing= $ARGS{"${base}${dd}"}; + $thing= undef if defined $thing and $thing eq 'none'; + return $thing; +}; + +for my $dd (0..$a->{Dropdowns}-1) { + my $arch= $argorundef->($dd,'archipelago'); + my $island= $argorundef->($dd,'islandid'); + next unless defined $arch or defined $island; + if (defined $island and defined $arch) { + my $ii= $islandid2{$island}; + my $iarch= $ii->{Arch}; + if ($iarch ne $arch) { + $results_head->(); + + Specified archipelago <% $arch %> but + island <% $ii->{Name} %> + which is in <% $iarch %>; using the island.
+<%perl> + } + $arch= undef; + } + push @archipelagoes, $arch; + push @islandids, $island; +} + +}#---------- result processing, common stuff + + +% if (@islandids) { +% $results_head->(); + +<& routetrade, islandids => \@islandids, archipelagoes => \@archipelagoes &> + +% }