--- loncom/interface/lonsearchcat.pm 2015/03/12 03:04:45 1.331.4.11 +++ loncom/interface/lonsearchcat.pm 2015/06/16 20:24:39 1.346 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Search Catalog # -# $Id: lonsearchcat.pm,v 1.331.4.11 2015/03/12 03:04:45 raeburn Exp $ +# $Id: lonsearchcat.pm,v 1.346 2015/06/16 20:24:39 damieng Exp $ # # Copyright Michigan State University Board of Trustees # @@ -78,6 +78,7 @@ use Apache::lonnavmaps; use Apache::lonindexer(); use Apache::lonwishlist(); use LONCAPA; +use Time::HiRes qw(sleep); ###################################################################### ###################################################################### @@ -143,7 +144,7 @@ sub handler { ## this once, so the pause indicator is deleted ## if (exists($env{'form.pause'})) { - sleep(1); + sleep(0.1); delete($env{'form.pause'}); } ## @@ -432,7 +433,7 @@ sub hidden_field { =pod =over 4 - + =item &print_basic_search_form() Prints the form for the basic search. Sorry the name is so cryptic. @@ -2050,21 +2051,7 @@ sub print_sort_form { &Apache::lonnet::logthis(&Apache::lonmysql::get_error()); return; } - my $js =< -// - -END - - my $start_page = &Apache::loncommon::start_page('Results',$js); + my $start_page = &Apache::loncommon::start_page('Results',undef); my $breadcrumbs= &Apache::lonhtmlcommon::breadcrumbs('Searching','Searching', $env{'form.catalogmode'} ne 'import'); @@ -2228,8 +2215,21 @@ SCRIPT $r->rflush(); } +sub reload_result_frame { + my ($r) = @_; + my $newloc = '/adm/searchcat?phase=results&persistent_db_id='. + $env{'form.persistent_db_id'}; + $r->print(< + parent.update_results("$newloc"); + +SCRIPT + + $r->rflush(); +} + { - my $max_time = 300; # seconds for the search to complete + my $max_time = 60; # seconds for the search to complete my $start_time = 0; my $last_time = 0; @@ -2410,6 +2410,7 @@ END ## ## Prepare for the big loop. my $hitcountsum; + my $oldhitcountsum; my %matches; my $server; my $status; @@ -2456,7 +2457,7 @@ END &update_status($r, &mt('waiting on [_1]',join(' ',keys(%Server_status)))); } - sleep(1); + sleep(0.1); } # # Loop through the servers we have contacted but do not @@ -2532,7 +2533,13 @@ END delete($Server_status{$server}); } last if ($connection->aborted()); - &update_count_status($r,$hitcountsum); + if ($oldhitcountsum < $hitcountsum) { + &update_count_status($r,$hitcountsum); + if ($hitcountsum <= $env{'form.show'}) { + reload_result_frame($r); + } + $oldhitcountsum = $hitcountsum; + } } last if ($connection->aborted()); &update_seconds($r); @@ -2626,6 +2633,8 @@ sub display_results { if ($env{'form.catalogmode'} eq 'import') { if (! tie(%groupsearch_db,'GDBM_File',$diropendb, &GDBM_WRCREAT(),0640)) { + # NOTE: this can happen when a previous request to searchcat?phase=results gets interrupted + # (%groupsearch_db is not untied) $r->print('

'. &mt('Unable to save import results.'). '

'. @@ -2634,6 +2643,10 @@ sub display_results { $r->rflush(); return; } + # untie %groupsearch_db if the connection gets aborted before the end + $r->register_cleanup(sub { + untie %groupsearch_db if (tied(%groupsearch_db)); + }); } ## ## Prepare the table for querying @@ -2775,8 +2788,7 @@ sub display_results { ); if ($total_results == 0) { - $r->print(''. - '

'.&mt('There are currently no results.').'

'. + $r->print('

'.&mt('There are currently no results.').'

'. "". &Apache::loncommon::end_page()); return; @@ -3149,6 +3161,14 @@ SCRIPT SCRIPT + $js.=< + \$(document).ready(function() { + parent.done_loading_results(); + }); + +SCRIPT + my $start_page = &Apache::loncommon::start_page(undef,$js, {'only_body' =>1, 'add_wishlist' =>1, @@ -3179,10 +3199,28 @@ sub print_frames_interface { my $results_link = &results_link(); my $js = < -// + +var loading_results = true; +var need_reloading = false; +var new_location; +function update_results(newloc) { + if (loading_results) { + need_reloading = true; + new_location = newloc; + } else { + loading_results = true; + resultsframe.location = newloc; + } +} +function done_loading_results() { + loading_results = false; + if (need_reloading) { + need_reloading = false; + update_results(new_location); + } +} JS