--- loncom/interface/lonsearchcat.pm 2007/05/02 01:33:49 1.286
+++ loncom/interface/lonsearchcat.pm 2025/03/19 15:44:44 1.364
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Search Catalog
#
-# $Id: lonsearchcat.pm,v 1.286 2007/05/02 01:33:49 albertel Exp $
+# $Id: lonsearchcat.pm,v 1.364 2025/03/19 15:44:44 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -52,8 +52,6 @@ search (on a server basis) is displayed
=head1 Internals
-=over 4
-
=cut
###############################################################################
@@ -78,7 +76,9 @@ use HTML::Entities();
use Parse::RecDescent;
use Apache::lonnavmaps;
use Apache::lonindexer();
+use Apache::lonwishlist();
use LONCAPA;
+use Time::HiRes qw(sleep);
######################################################################
######################################################################
@@ -118,8 +118,6 @@ sub handler {
# This is set and used in &handler() and is also used in
# &output_results().
- my $loaderror=&Apache::lonnet::overloaderror($r);
- if ($loaderror) { return $loaderror; }
#
my $closebutton; # button that closes the search window
# This button is different for the RAT compared to
@@ -138,7 +136,7 @@ sub handler {
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
['catalogmode','launch','acts','mode','form','element','pause',
'phase','persistent_db_id','table','start','show',
- 'cleargroupsort','titleelement','area']);
+ 'cleargroupsort','titleelement','area','inhibitmenu']);
##
## The following is a trick - we wait a few seconds if asked to so
## the daemon running the search can get ahead of the daemon
@@ -146,14 +144,15 @@ sub handler {
## this once, so the pause indicator is deleted
##
if (exists($env{'form.pause'})) {
- sleep(1);
+ sleep(0.1);
delete($env{'form.pause'});
}
##
## Initialize global variables
##
my $domain = $r->dir_config('lonDefDomain');
- $diropendb= "/home/httpd/perl/tmp/".
+ my $temp_file_dir = LONCAPA::tempdir();
+ $diropendb= $temp_file_dir .
"$env{'user.domain'}_$env{'user.name'}_sel_res.db";
#
# set the name of the persistent database
@@ -164,37 +163,53 @@ sub handler {
$env{'form.persistent_db_id'} = time;
}
- my $persistent_db_file = "/home/httpd/perl/tmp/".
+ my $persistent_db_file = $temp_file_dir .
&escape($domain).
'_'.&escape($env{'user.name'}).
'_'.$env{'form.persistent_db_id'}.'_persistent_search.db';
##
&Apache::lonhtmlcommon::clear_breadcrumbs();
- my @allowed_searches = ('portfolio');
- if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {
+ my $crumb_text;
+ my @allowed_searches;
+ if ($env{'form.catalogmode'} eq 'import') {
+ $env{'form.area'} = 'res';
+ $crumb_text = 'Content Library Search';
+ } else {
+ push(@allowed_searches,'portfolio');
+ }
+ if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'}) eq 'F') {
push(@allowed_searches,'res');
- }
- if (exists($env{'request.course.id'}) && $env{'request.course.id'} ne '') {
- push(@allowed_searches,'course');
+ } else {
+ unless ($env{'form.catalogmode'} eq 'import') {
+ $env{'form.area'} = 'portfolio';
+ $crumb_text = 'Portfolio Search';
+ }
}
- my $crumb_text = 'Portfolio Search';
- if (@allowed_searches == 3) {
- $crumb_text = 'Course, Portfolio and Catalog Search';
- } elsif (@allowed_searches ==2) {
- if (grep(/^res$/,@allowed_searches)) {
- $crumb_text = 'Portfolio and Catalog Search';
- } elsif (grep(/^course$/,@allowed_searches)) {
- $crumb_text = 'Portfolio and Course Search';
+ if (@allowed_searches ==2) {
+ unless (($env{'form.area'} eq 'portfolio') || ($env{'form.area'} eq 'res')) {
+ delete($env{'form.area'});
+ }
+ $crumb_text = 'Portfolio and Content Library Search';
+ }
+ my $target = '_top';
+ if ((($env{'request.lti.login'}) && ($env{'request.lti.target'} eq 'iframe')) ||
+ (($env{'request.deeplink.login'}) && ($env{'request.deeplink.target'} eq '_self'))) {
+ if ($env{'form.phase'} =~ /^(sort|run_search)$/) {
+ $target = '_parent';
+ } else {
+ $target = '_self';
}
}
&Apache::lonhtmlcommon::add_breadcrumb
({href=>'/adm/searchcat?'.
- 'catalogmode='.$env{'form.catalogmode'}.
- '&launch='.$env{'form.launch'}.
- '&mode='.$env{'form.mode'},
+ &Apache::loncommon::inhibit_menu_check().
+ '&catalogmode='.$env{'form.catalogmode'}.
+ '&launch='.$env{'form.launch'}.
+ '&mode='.$env{'form.mode'}.
+ '&area='.$env{'form.area'},
text=>"$crumb_text",
- target=>'_top',
+ target=>$target,
bug=>'Searching',});
#
if ($env{'form.phase'} !~ m/(basic|adv|course)_search/) {
@@ -203,12 +218,15 @@ sub handler {
&Apache::lonnet::logthis('lonsearchcat:'.
'Unable to recover data from '.
$persistent_db_file);
- my $msg =
- 'We were unable to retrieve data describing your search. '.
- 'This is a serious error and has been logged. '.
- 'Please alert your LON-CAPA administrator.';
- &Apache::loncommon::simple_error_page($r,'Search Error',
- $msg);
+ my $msg =
+ &mt('We were unable to retrieve data describing your search.').
+ ' '.&mt('This is a serious error and has been logged.').
+ ' '.
+ &mt('Please alert your LON-CAPA administrator.');
+ &Apache::loncommon::simple_error_page(
+ $r,'Search Error',
+ $msg,
+ {'no_auto_mt_msg' => 1});
return OK;
}
}
@@ -258,28 +276,32 @@ sub handler {
if (exists($env{'form.area'})) {
$hidden_fields .= &hidden_field('area');
}
+ if (exists($env{'form.inhibitmenu'})) {
+ $hidden_fields .= &hidden_field('inhibitmenu');
+ }
##
## Configure dynamic components of interface
##
if ($env{'form.catalogmode'} eq 'interactive') {
- $closebutton="
+
END
} else {
$closebutton = '';
@@ -298,30 +320,34 @@ END
if ($env{'form.phase'} eq 'adv_search' ||
$env{'form.phase'} eq 'disp_adv') {
$env{'form.searchmode'} = 'advanced';
- } elsif ($env{'form.phase'} eq 'course_search') {
- $env{'form.searchmode'} = 'course_search';
}
#
if ($env{'form.searchmode'} eq 'advanced') {
- my $srchtype = 'Catalog';
+ my $srchtype = 'Content Library';
if ($env{'form.area'} eq 'portfolio') {
$srchtype = 'Portfolio';
}
&Apache::lonhtmlcommon::add_breadcrumb
- ({href=>'/adm/searchcat?phase=disp_adv&'.
- 'catalogmode='.$env{'form.catalogmode'}.
- '&launch='.$env{'form.launch'}.
- '&mode='.$env{'form.mode'},
+ ({href=>'/adm/searchcat?'.&Apache::loncommon::inhibit_menu_check().
+ '&phase=disp_adv'.
+ '&catalogmode='.$env{'form.catalogmode'}.
+ '&launch='.$env{'form.launch'}.
+ '&mode='.$env{'form.mode'}.
+ '&area='.$env{'form.area'},
text=>"Advanced $srchtype Search",
bug=>'Searching',});
- } elsif ($env{'form.searchmode'} eq 'course search') {
+ } elsif (($env{'form.phase'} eq 'results') ||
+ ($env{'form.phase'} =~ /^(sort|run_search)$/)) {
&Apache::lonhtmlcommon::add_breadcrumb
- ({href=>'/adm/searchcat?phase=disp_adv&'.
- 'catalogmode='.$env{'form.catalogmode'}.
- '&launch='.$env{'form.launch'}.
- '&mode='.$env{'form.mode'},
- text=>"Course Search",
- bug=>'Searching',});
+ ({href=>'/adm/searchcat?'.&Apache::loncommon::inhibit_menu_check().
+ '&phase=disp_adv'.
+ '&catalogmode='.$env{'form.catalogmode'}.
+ '&launch='.$env{'form.launch'}.
+ '&mode='.$env{'form.mode'}.
+ '&area='.$env{'form.area'}.
+ '&searchmode='.$env{'form.searchmode'},
+ text=>"Search Results",
+ bug=>'Searching',});
}
##
## Switch on the phase
@@ -334,33 +360,31 @@ END
&display_results($r,$importbutton,$closebutton,$diropendb,
$env{'form.area'});
} elsif ($env{'form.phase'} =~ /^(sort|run_search)$/) {
- my ($query,$customquery,$customshow,$libraries,$pretty_string) =
+ my ($query,$customquery,$customshow,$libraries,$pretty_string,$domainsref) =
&get_persistent_data($persistent_db_file,
['query','customquery','customshow',
- 'libraries','pretty_string']);
+ 'libraries','pretty_string','domains']);
if ($env{'form.phase'} eq 'sort') {
- &print_sort_form($r,$pretty_string);
+ &print_sort_form($r,$pretty_string,$target);
} elsif ($env{'form.phase'} eq 'run_search') {
&run_search($r,$query,$customquery,$customshow,
- $libraries,$pretty_string,$env{'form.area'});
+ $libraries,$pretty_string,$env{'form.area'},$domainsref,$target);
}
- } elsif ($env{'form.phase'} eq 'course_search') {
- &course_search($r);
} elsif(($env{'form.phase'} eq 'basic_search') ||
($env{'form.phase'} eq 'adv_search')) {
#
# We are running a search, try to parse it
- my ($query,$customquery,$customshow,$libraries) =
- (undef,undef,undef,undef);
+ my ($query,$customquery,$customshow,$libraries,$domains) =
+ (undef,undef,undef,undef,undef);
my $pretty_string;
if ($env{'form.phase'} eq 'basic_search') {
- ($query,$pretty_string,$libraries) =
+ ($query,$pretty_string,$libraries,$domains) =
&parse_basic_search($r,$closebutton,$hidden_fields);
return OK if (! defined($query));
&make_persistent({ basicexp => $env{'form.basicexp'}},
$persistent_db_file);
} else { # Advanced search
- ($query,$customquery,$customshow,$libraries,$pretty_string)
+ ($query,$customquery,$customshow,$libraries,$pretty_string,$domains)
= &parse_advanced_search($r,$closebutton,$hidden_fields);
return OK if (! defined($query));
}
@@ -368,7 +392,8 @@ END
customquery => $customquery,
customshow => $customshow,
libraries => $libraries,
- pretty_string => $pretty_string },
+ pretty_string => $pretty_string,
+ domains => $domains },
$persistent_db_file);
#
# Set up table
@@ -402,7 +427,7 @@ END
}
}
return OK;
-}
+}
#
# The mechanism used to store values away and retrieve them does not
@@ -440,230 +465,48 @@ sub hidden_field {
return ' '.$/;
}
-######################################################################
-######################################################################
-##
-## Course Search
-##
-######################################################################
-######################################################################
-{ # Scope the course search to avoid global variables
-#
-# Variables For course search
-my %alreadyseen;
-my %hash;
-my $totalfound;
-
-sub make_symb {
- my ($id)=@_;
- my ($mapid,$resid)=split(/\./,$id);
- my $map=$hash{'map_id_'.$mapid};
- my $res=$hash{'src_'.$id};
- my $symb=&Apache::lonnet::encode_symb($map,$resid,$res);
- return $symb;
-}
-
-sub course_search {
- my $r=shift;
- my $pretty_search_string = ''.$env{'form.courseexp'}.' ';
- my $search_string = $env{'form.courseexp'};
- my @New_Words;
- undef(%alreadyseen);
- if ($env{'form.crsrelated'}) {
- ($search_string,@New_Words) = &related_version($env{'form.courseexp'});
- if (@New_Words) {
- $pretty_search_string .= ' '.&mt("with related words").": @New_Words .";
- } else {
- $pretty_search_string .= ' '.&mt('with no related words').".";
- }
- }
- my $fulltext=$env{'form.crsfulltext'};
- my $discuss=$env{'form.crsdiscuss'};
- my @allwords=($search_string,@New_Words);
- $totalfound=0;
- $r->print(&Apache::loncommon::start_page('Course Search').
- '
'.
- $pretty_search_string.' '.
- ''.&mt('Course content').': ');
- $r->rflush();
-# ======================================================= Go through the course
- my $c=$r->connection;
- if (tie(%hash,'GDBM_File',$env{'request.course.fn'}.".db",
- &GDBM_READER(),0640)) {
- foreach (sort(keys(%hash))) {
- if ($c->aborted()) { last; }
- if (($_=~/^src\_(.+)$/)) {
- if ($hash{'randomout_'.$1} & !$env{'request.role.adv'}) {
- next;
- }
- my $symb=&make_symb($1);
- &checkonthis($r,$1,$hash{$_},0,&Apache::lonnet::gettitle($symb),
- $fulltext,$symb,@allwords);
- }
- }
- untie(%hash);
- }
- unless ($totalfound) {
- $r->print(''.&mt('No matches found in resources').'.
');
- }
-
-# Check discussions if requested
- if ($discuss) {
- my $totaldiscussions = 0;
- $r->print(''.&mt('Discussion postings').': ');
- my $navmap = Apache::lonnavmaps::navmap->new();
- my @allres=$navmap->retrieveResources();
- my %discussiontime = &Apache::lonnet::dump('discussiontimes',
- $env{'course.'.$env{'request.course.id'}.'.domain'},
- $env{'course.'.$env{'request.course.id'}.'.num'});
- foreach my $resource (@allres) {
- my $result = '';
- my $applies = 0;
- my $symb = $resource->symb();
- my $ressymb = $symb;
- if ($symb =~ m#(___adm/$LONCAPA::domain_re/$LONCAPA::username_re)/(\d+)/bulletinboard$#) {
- $ressymb = 'bulletin___'.$2.$1.'/'.$2.'/bulletinboard';
- unless ($ressymb =~ m#bulletin___\d+___adm/wrapper#) {
- $ressymb=~s#(bulletin___\d+___)#$1adm/wrapper/#;
- }
- }
- if (defined($discussiontime{$ressymb})) {
- my %contrib = &Apache::lonnet::restore($ressymb,$env{'request.course.id'},
- $env{'course.'.$env{'request.course.id'}.'.domain'},
- $env{'course.'.$env{'request.course.id'}.'.num'});
- if ($contrib{'version'}) {
- for (my $id=1;$id<=$contrib{'version'};$id++) {
- unless (($contrib{'hidden'}=~/\.$id\./) || ($contrib{'deleted'}=~/\.$id\./)) {
- if ($contrib{$id.':subject'}) {
- $result .= $contrib{$id.':subject'};
- }
- if ($contrib{$id.':message'}) {
- $result .= $contrib{$id.':message'};
- }
- if ($contrib{$id,':attachmenturl'}) {
- if ($contrib{$id,':attachmenturl'} =~ m-/([^/]+)$-) {
- $result .= $1;
- }
- }
- $applies = &checkwords($result,$applies,@allwords);
- }
- }
- }
- }
-# Does this discussion apply?
- if ($applies) {
- my ($map,$ind,$url)=&Apache::lonnet::decode_symb($ressymb);
- my $disctype = &mt('resource');
- if ($url =~ m#/bulletinboard$#) {
- if ($url =~m#^adm/wrapper/adm/.*/bulletinboard$#) {
- $url =~s#^adm/wrapper##;
- }
- $disctype = &mt('bulletin board');
- } else {
- $url = '/res/'.$url;
- }
- if ($url =~ /\?/) {
- $url .= '&symb=';
- } else {
- $url .= '?symb=';
- }
- $url .= &escape($resource->symb());
- my $title = $resource->compTitle();
- $r->print(''.
- ($title?$title:$url).' - '.$disctype.' ');
- $totaldiscussions++;
- } else {
- $r->print(' .');
- }
- }
- unless ($totaldiscussions) {
- $r->print(''.&mt('No matches found in postings').'.
');
- }
- }
-
-# =================================================== Done going through course
- $r->print(&Apache::loncommon::end_page());
-}
-
-# =============================== This pulls up a resource and its dependencies
-
-sub checkonthis {
- my ($r,$id,$url,$level,$title,$fulltext,$symb,@allwords)=@_;
- $alreadyseen{$id}=1;
- if (&Apache::loncommon::connection_aborted($r)) { return; }
- $r->rflush();
-
- my $result=$title.' ';
- if ($env{'request.role.adv'} || !$hash{'encrypted_'.$id}) {
- $result.=&Apache::lonnet::metadata($url,'title').' '.
- &Apache::lonnet::metadata($url,'subject').' '.
- &Apache::lonnet::metadata($url,'abstract').' '.
- &Apache::lonnet::metadata($url,'keywords');
- }
- my ($extension)=($url=~/\.(\w+)$/);
- if (&Apache::loncommon::fileembstyle($extension) eq 'ssi' &&
- ($url) && ($fulltext)) {
- $result.=&Apache::lonnet::ssi_body($url.'?symb='.&escape($symb));
- }
- $result=~s/\s+/ /gs;
- my $applies = 0;
- $applies = &checkwords($result,$applies,@allwords);
-# Does this resource apply?
- if ($applies) {
- $r->print(' ');
- for (my $i=0;$i<=$level*5;$i++) {
- $r->print(' ');
- }
- my $href=$url;
- if ($hash{'encrypted_'.$id} && !$env{'request.role.adv'}) {
- $href=&Apache::lonenc::encrypted($href)
- .'?symb='.&Apache::lonenc::encrypted($symb);
- } else {
- $href.='?symb='.&escape($symb);
- }
- $r->print(''.($title?$title:$url).
- ' ');
- $totalfound++;
- } elsif ($fulltext) {
- $r->print(' .');
- }
- $r->rflush();
-# Check also the dependencies of this one
- my $dependencies=
- &Apache::lonnet::metadata($url,'dependencies');
- foreach (split(/\,/,$dependencies)) {
- if (($_=~/^\/res\//) && (!$alreadyseen{$id})) {
- &checkonthis($r,$id,$_,$level+1,'',$fulltext,undef,@allwords);
- }
- }
-}
-
-sub checkwords {
- my ($result,$applies,@allwords) = @_;
- foreach (@allwords) {
- if ($_=~/\w/) {
- if ($result=~/$_/si) {
- $applies++;
- }
+sub start_search_tabs {
+ my $area;
+ my %lt = &Apache::lonlocal::texthash (
+ res => 'Content Library Search',
+ portfolio => 'Portfolio Search',
+ );
+ my $output = '';
+ if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'}) eq 'F') {
+ unless ($env{'form.area'} eq 'portfolio') {
+ $area = 'res';
+ }
+ $output .= "\n".''.
+ ' '.$lt{'res'}.
+ ' ';
+ unless ($env{'form.catalogmode'}) {
+ $output .= ' '.$lt{'portfolio'}.
+ ' ';
}
- }
- return $applies;
+ } else {
+ $area = 'portfolio';
+ $output .= "\n".''.
+ ' '.$lt{'portfolio'}.
+ ' ';
+ }
+ $output .= ''.
+ '
'.
+ '
';
+ return $output;
}
-sub untiehash {
- if (tied(%hash)) {
- untie(%hash);
- }
+sub end_search_tabs {
+ return '
';
}
-} # End of course search scoping
-
-
-######################################################################
######################################################################
-=pod
+=pod
+=over 4
+
=item &print_basic_search_form()
Prints the form for the basic search. Sorry the name is so cryptic.
@@ -674,65 +517,31 @@ Prints the form for the basic search. S
######################################################################
sub print_basic_search_form {
my ($r,$closebutton,$hidden_fields) = @_;
+ my %lt = &Apache::lonlocal::texthash (
+ res => 'Content Library Search',
+ portfolio => 'Portfolio Search',
+ );
my $result = ($env{'form.catalogmode'} ne 'import');
+ my $area;
my $bread_crumb =
&Apache::lonhtmlcommon::breadcrumbs('Searching','Search_Basic',
$env{'form.catalogmode'} ne 'import');
- my $scrout = &Apache::loncommon::start_page('Search').$bread_crumb;
-# Search form for resource space
- if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'})) {
- $scrout .= &setup_basic_search($r,'res',$hidden_fields,$closebutton);
- $scrout .= ' ';
- }
+ my $scrout = &Apache::loncommon::start_page('Content Library').$bread_crumb.
+ ''."\n".
+ &start_search_tabs();
+ if (&Apache::lonnet::allowed('bre',$env{'request.role.domain'}) eq 'F') {
+ if ($env{'form.area'} eq 'portfolio') {
# Search form for accessible portfolio files
- $scrout.= &setup_basic_search($r,'portfolio',$hidden_fields,$closebutton);
- if ($env{'request.course.id'}) {
- my %lt=&Apache::lonlocal::texthash('srch' => 'Search',
- 'header' => 'Course Search',
- 'note' => 'Enter terms or phrases, then press "Search" below',
- 'use' => 'use related words',
- 'full' =>'fulltext search (time consuming)',
- 'disc' => 'search discussion postings (resources and bulletin boards)',
- );
- $scrout.=(<
-
-
-$lt{'header'}
-
-$hidden_fields
-
-$lt{'note'}.
-
-
-
-
-ENDCOURSESEARCH
- $scrout.=' '.
- &Apache::lonhtmlcommon::textbox('courseexp',
- $env{'form.courseexp'},40);
- my $crscheckbox =
- &Apache::lonhtmlcommon::checkbox('crsfulltext',
- $env{'form.crsfulltext'});
- my $relcheckbox =
- &Apache::lonhtmlcommon::checkbox('crsrelated',
- $env{'form.crsrelated'});
- my $discheckbox =
- &Apache::lonhtmlcommon::checkbox('crsdiscuss',
- $env{'form.crsrelated'});
- $scrout.=(<
-$relcheckbox $lt{'use'}
-$crscheckbox $lt{'full'}
-$discheckbox $lt{'disc'}
-
-
-
-
-
-ENDENDCOURSE
+ $scrout .= &setup_basic_search($r,'portfolio',$hidden_fields,$closebutton);
+ } else {
+# Search form for resource space
+ $scrout .= &setup_basic_search($r,'res',$hidden_fields,$closebutton);
+ }
+ } else {
+# Search form for accessible portfolio files
+ $scrout .= &setup_basic_search($r,'portfolio',$hidden_fields,$closebutton);
}
- $scrout .= &Apache::loncommon::end_page();
+ $scrout .= &end_search_tabs().&Apache::loncommon::end_page();
$r->print($scrout);
return;
}
@@ -741,32 +550,57 @@ sub setup_basic_search {
my ($r,$area,$hidden_fields,$closebutton) = @_;
# Define interface components
my %lt = &Apache::lonlocal::texthash (
- res => 'LON-CAPA Catalog Search',
+ res => 'Content Library Search',
portfolio => 'Portfolio Search',
);
my ($userelatedwords,$onlysearchdomain,$inclext,$adv_search_link,$scrout);
- $userelatedwords = ''.&mt('[_1] use related words',
- &Apache::lonhtmlcommon::checkbox('related',$env{'form.related'},'related')).
- ' ';
- $onlysearchdomain = ''.&mt('[_1] only search domain [_2]',
- &Apache::lonhtmlcommon::checkbox('domains',$env{'form.domains'},
- $r->dir_config('lonDefDomain')),
- $r->dir_config('lonDefDomain')).
- ' ';
+
+ $userelatedwords = ''
+ .&Apache::lonhtmlcommon::checkbox(
+ 'related',
+ $env{'form.related'},
+ 'related')
+ .' '
+ .&mt('use related words')
+ .' ';
+
+ my $anydom = 1;
if ($area eq 'res') {
- $inclext= ''.&mt('[_1] include external resources',
- &Apache::lonhtmlcommon::checkbox('inclext',$env{'form.inclext'})).
- ' ';
+ unless (&Apache::lonnet::allowed('bre','/res/') eq 'F') {
+ $anydom = 0;
+ }
}
+ my $singledom;
+ my ($disabled,$checked);
+ if ($anydom) {
+ $singledom = $r->dir_config('lonDefDomain');
+ if ($env{'form.domains'} eq $singledom) {
+ $checked = 1;
+ }
+ } else {
+ $singledom = $env{'user.domain'};
+ $disabled = ' disabled="disabled"';
+ $checked = 1;
+ }
+ $onlysearchdomain = ''
+ .&Apache::lonhtmlcommon::checkbox(
+ 'domains',$checked,
+ $singledom,$disabled)
+ .' '
+ .&mt('only search domain [_1]'
+ ,''.$singledom.' ')
+ .' ';
+
$adv_search_link = ''.&mt('Advanced Search').' ';
#
$scrout.='';
}
#
- $scrout .= ''.$/;
-# if ($env{'request.course.id'}) {
- $scrout .= ''.$lt{$area}.' ';
-# } else {
- # No need to tell them they are searching
-# $scrout.= (' 'x2);
-# }
- $scrout.=''.$/.' '.'';
+ $scrout .= ''.
+ ''.
+ &Apache::lonhtmlcommon::textbox('basicexp',
+ $env{'form.basicexp'},50).
+ ' '.
+ ''.&searchhelp().'
'.
+ ''.
+ ''.(' 'x3).$adv_search_link.' '.' '.
+ ''.(' 'x1).$userelatedwords.' '.' '.
+ ''.(' 'x1).$onlysearchdomain.' '.' '.
+ ''.(' 'x1).$inclext.' '.' '.
+ '
'.$/;
+ #
+ $scrout .= ''
+ .&viewoptions()
+ .'
'
+ .'
'
+ .' '
+ .' '
+ .$closebutton
+ .'
';
+ #
+ $scrout .= '';
return $scrout;
}
@@ -831,15 +660,18 @@ sub print_advanced_search_form{
'reset' => 'Reset',
'help' => 'Help');
my $advanced_buttons=<<"END";
+
$closebutton
+
END
- my $srchtype = 'Catalog';
+ my $srchtype = 'Content Library';
my $jscript;
if ($env{'form.area'} eq 'portfolio') {
$srchtype = 'Portfolio';
$jscript = '';
}
my $scrout= &Apache::loncommon::start_page("Advanced $srchtype Search",
$jscript);
- $scrout .= <<"ENDHEADER";
-$bread_crumb
-".
- &Apache::loncommon::end_page());
+ $r->print(
+ ''
+ .&mt('A MySQL error has occurred.')
+ .'
'
+ .&Apache::loncommon::end_page());
&Apache::lonnet::logthis("lonmysql was unable to determine the status".
" of table ".$table);
return undef;
} elsif (! $table_check) {
- $r->print("The table of results could not be found.");
+ $r->print(
+ ''
+ .&mt('The table of results could not be found.')
+ .'
'
+ );
&Apache::lonnet::logthis("The user requested a table, ".$table.
", that could not be found.");
return undef;
@@ -2194,7 +2178,7 @@ a link to change the search query.
######################################################################
######################################################################
sub print_sort_form {
- my ($r,$pretty_query_string) = @_;
+ my ($r,$pretty_query_string,$target) = @_;
##
my %SortableFields=&Apache::lonlocal::texthash(
@@ -2227,28 +2211,20 @@ sub print_sort_form {
&Apache::lonnet::logthis(&Apache::lonmysql::get_error());
return;
}
- my $js =<
- function change_sort() {
- var newloc = "/adm/searchcat?phase=results";
- newloc += "&persistent_db_id=$env{'form.persistent_db_id'}";
- newloc += "&sortby=";
- newloc += document.forms.statusform.elements.sortby.value;
- parent.resultsframe.location= newloc;
+ my $args;
+ if ($target eq '_parent') {
+ $args = {'links_target' => $target};
}
-
-END
-
- my $start_page = &Apache::loncommon::start_page('Results',$js,
- {'no_title' => 1});
+ my $start_page = &Apache::loncommon::start_page('Results',undef,$args);
my $breadcrumbs=
&Apache::lonhtmlcommon::breadcrumbs('Searching','Searching',
- $env{'form.catalogmode'} ne 'import');
-
+ $env{'form.catalogmode'} ne 'import',
+ '','','','','','',$target);
my $result = <
+
+
END
@@ -2265,15 +2241,12 @@ END
# }
# $result.="\n";
my $revise = &revise_button();
- $result.=<
-There are $total_results matches to your query. $revise
-
-Search: $pretty_query_string
-
-
-END
- $r->print($result.&Apache::loncommon::end_page());
+ $result.='
'
+ .&mt('Total of [quant,_1,match,matches] to your query.',$total_results)
+ .' '.$revise.'
'
+ .'
'.&mt('Search: ').$pretty_query_string
+ .'
';
+ $r->print($result.'
'.&Apache::loncommon::end_page());
return;
}
@@ -2382,21 +2355,47 @@ Returns: Nothing.
sub update_count_status {
my ($r,$text) = @_;
$text =~ s/\'/\\\'/g;
- $r->print
- ("\n");
+ $r->print(<
+SCRIPT
+
$r->rflush();
}
sub update_status {
my ($r,$text) = @_;
$text =~ s/\'/\\\'/g;
- $r->print
- ("\n");
+ $r->print(<
+SCRIPT
+
+ $r->rflush();
+}
+
+sub reload_result_frame {
+ my ($r) = @_;
+ my $newloc = '/adm/searchcat?phase=results&persistent_db_id='.
+ $env{'form.persistent_db_id'}.'&area='.$env{'form.area'}.
+ '&catalogmode='.$env{'form.catalogmode'};
+ $r->print(<
+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;
@@ -2418,9 +2417,14 @@ sub update_seconds {
my ($r) = @_;
my $time = &time_left();
if (($last_time-$time) > 0) {
- $r->print("\n");
+ $r->print(<
+SCRIPT
+
$r->rflush();
}
$last_time = $time;
@@ -2444,14 +2448,17 @@ Returns: html string for a 'revise searc
######################################################################
######################################################################
sub revise_button {
+ my $revisetext = &mt('Revise search');
my $revise_phase = 'disp_basic';
$revise_phase = 'disp_adv' if ($env{'form.searchmode'} eq 'advanced');
my $newloc = '/adm/searchcat'.
'?persistent_db_id='.$env{'form.persistent_db_id'}.
- '&cleargroupsort=1'.
- '&phase='.$revise_phase;
- my $result = qq{ };
+ '&cleargroupsort=1'.
+ '&phase='.$revise_phase.
+ '&area='.$env{'form.area'}.
+ '&catalogmode='.$env{'form.catalogmode'};
+ my $result = qq{ };
return $result;
}
@@ -2471,7 +2478,7 @@ results into MySQL.
######################################################################
sub run_search {
my ($r,$query,$customquery,$customshow,$serverlist,
- $pretty_string,$area) = @_;
+ $pretty_string,$area,$domainsref,$target) = @_;
my $tabletype = 'metadata';
if ($area eq 'portfolio') {
$tabletype = 'portfolio_search';
@@ -2480,16 +2487,19 @@ sub run_search {
#
# Print run_search header
#
- my $start_page = &Apache::loncommon::start_page('Search Status',undef,
- {'no_title' => 1});
+ my $args;
+ if ($target eq '_parent') {
+ $args = {'links_target' => $target};
+ }
+ my $start_page = &Apache::loncommon::start_page('Search Status',undef,$args);
my $breadcrumbs =
&Apache::lonhtmlcommon::breadcrumbs('Searching','Searching',
- $env{'form.catalogmode'} ne 'import');
+ $env{'form.catalogmode'} ne 'import',
+ '','','','','','',$target);
$r->print(<
-
+
END
# Remove leading and trailing
$pretty_string =~ s:^\s*
::i;
@@ -2500,22 +2510,43 @@ END
pop(@Lines);
}
if (@Lines > 2) {
- $pretty_string = join '
',(@Lines[0..2],'....
');
+ $pretty_string = join '
',(@Lines[0..2],'...
');
}
$r->print(&mt("Search: [_1]",$pretty_string));
$r->rflush();
#
# Determine the servers we need to contact.
- my @Servers_to_contact;
+ my (@Servers_to_contact,%domains_by_server);
if (defined($serverlist)) {
if (ref($serverlist) eq 'ARRAY') {
@Servers_to_contact = @$serverlist;
} else {
@Servers_to_contact = ($serverlist);
}
+ if (ref($domainsref) eq 'HASH') {
+ foreach my $server (@Servers_to_contact) {
+ $domains_by_server{$server} = $domainsref->{$server};
+ }
+ }
} else {
- my %all_library_servers = &Apache::lonnet::all_library();
+ my %library_servers = &Apache::lonnet::unique_library();
+ my (%all_library_servers, %older_library_servers);
+ foreach my $key (keys(%library_servers)) {
+ if (&Apache::lonnet::get_server_loncaparev('',$key) =~ /^\'?(\d+)\.(\d+)/) {
+ my $major = $1;
+ my $minor = $2;
+ if (($major < 2) || (($major == 2) && ($minor < 11))) {
+ map { $older_library_servers{$_} = 1; }
+ &Apache::lonnet::machine_ids($library_servers{$key});
+ }
+ }
+ }
+ %all_library_servers = (%library_servers,%older_library_servers);
@Servers_to_contact = sort(keys(%all_library_servers));
+ foreach my $server (@Servers_to_contact) {
+ $domains_by_server{$server} =
+ join(',',sort(&Apache::lonnet::machine_domains($all_library_servers{$server})));
+ }
}
my %Server_status;
#
@@ -2551,22 +2582,28 @@ END
##
## Prepare for the big loop.
my $hitcountsum;
+ my $oldhitcountsum;
+ my $displaycount;
my %matches;
my $server;
my $status;
my $revise = &revise_button();
- $r->print(<
-Status Total Matches Time Remaining
-
-
-
-
-$revise
-
-
-
-END
+ $r->print(''."\n".
+ ' '."\n".
+ ' ');
$r->rflush();
&reset_timing();
&update_seconds($r);
@@ -2581,7 +2618,7 @@ END
my $server = shift(@Servers_to_contact);
&update_status($r,&mt('contacting [_1]',$server));
my $reply=&Apache::lonnet::metadata_query($query,$customquery,
- $customshow,[$server]);
+ $customshow,[$server],\%domains_by_server);
($server) = keys(%$reply);
$Server_status{$server} = $reply->{$server};
} else {
@@ -2593,7 +2630,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
@@ -2607,7 +2644,10 @@ END
next;
}
$status=~s|/||g;
- my $datafile=$r->dir_config('lonDaemons').'/tmp/'.$status;
+
+
+
+ my $datafile=LONCAPA::tempdir().$status;
if (-e $datafile && ! -e "$datafile.end") {
&update_status($r,&mt('Receiving results from [_1]',$server));
next;
@@ -2638,15 +2678,13 @@ END
my %Fields = &parse_raw_result($result,$server,$tabletype);
$Fields{'hostname'} = $server;
#
- # Skip if external and we did not want that
- next if ((! $env{'form.inclext'}) && ($Fields{'url'}=~/^\/ext\//));
# Skip based on copyright
next if (! ©right_check(\%Fields));
if ($area eq 'portfolio') {
next if (defined($matches{$Fields{'url'}}));
- # Skip if inaccessible
- next if (!&Apache::lonnet::portfolio_access($Fields{'url'}));
+ # Skip unless access control set to public or passphrase-protected
+ next unless (($Fields{'scope'} eq 'public') || ($Fields{'scope'} eq 'guest'));
$matches{$Fields{'url'}} = 1;
}
#
@@ -2668,12 +2706,20 @@ 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'}) ||
+ (!$displaycount && $hitcountsum)) {
+ reload_result_frame($r);
+ $displaycount = $hitcountsum;
+ }
+ $oldhitcountsum = $hitcountsum;
+ }
}
last if ($connection->aborted());
&update_seconds($r);
}
- &update_status($r,&mt('Search Complete [_1]',$server));
+ &update_status($r,&mt('Search Complete on Server [_1]',$server));
&update_seconds($r);
#
&Apache::lonmysql::disconnect_from_db(); # This is unneccessary
@@ -2681,13 +2727,13 @@ END
# We have run out of time or run out of servers to talk to and
# results to get, so let the client know the top frame needs to be
# loaded from /adm/searchcat
- $r->print(&Apache::loncommon::end_page());
+ $r->print(' '.&Apache::loncommon::end_page());
# if ($env{'form.catalogmode'} ne 'import') {
- $r->print("");
+ $r->print(<
+SCRIPT
# }
return;
}
@@ -2710,15 +2756,15 @@ sub prev_next_buttons {
return '' if ($show eq 'all'); # No links if you get them all at once.
#
# Create buttons
- my $buttons = ' ';
- $buttons .= ' 'x3;
- $buttons .= ' '
+ .' '
+ .' '
+ .' '
+ .' '
+ .' '
+ .'';
}
######################################################################
@@ -2743,7 +2789,10 @@ sub display_results {
##
my $viewfunction = $Views{$env{'form.viewselect'}};
if (!defined($viewfunction)) {
- $r->print("Internal Error - Bad view selected.\n");
+ $r->print(''
+ .&mt('Internal Error - Bad view selected.')
+ .'
'."\n"
+ .' '.&Apache::loncommon::end_page());
$r->rflush();
return;
}
@@ -2754,17 +2803,27 @@ sub display_results {
##
## Get the catalog controls setup
##
- my $action = "/adm/searchcat?phase=results";
+ my $action = '/adm/searchcat?phase=results&area='.$env{'form.area'}.
+ '&catalogmode='.$env{'form.catalogmode'};
##
## Deal with import by opening the import db file.
if ($env{'form.catalogmode'} eq 'import') {
if (! tie(%groupsearch_db,'GDBM_File',$diropendb,
&GDBM_WRCREAT(),0640)) {
- $r->print('Unable to save import results.'.
+ # 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.').
+ '
'.
+ ''.
&Apache::loncommon::end_page());
$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
@@ -2774,7 +2833,10 @@ sub display_results {
## Get the number of results
my $total_results = &Apache::lonmysql::number_of_rows($table);
if (! defined($total_results)) {
- $r->print("A MySQL error has occurred.".
+ $r->print(''.
+ &mt('A MySQL error has occurred.').
+ '
'.
+ ''.
&Apache::loncommon::end_page());
&Apache::lonnet::logthis("lonmysql was unable to determine the number".
" of rows in table ".$table);
@@ -2879,37 +2941,40 @@ sub display_results {
$env{'form.sortorder'}='asc';
}
}
- my $sortform = &mt('Sort by [_1] [_2]',
- &Apache::loncommon::select_form($env{'form.sortfield'},
- 'sortfield',
- %sort_fields),
- &Apache::loncommon::select_form($env{'form.sortorder'},
- 'sortorder',
- (asc =>&mt('Ascending'),
- desc=>&mt('Descending')
- ))
- );
- ##
- ## Output links (if necessary) for 'prev' and 'next' pages.
- $r->print
- (''.
- ''.$sortform.' '.
- ' '.
- &prev_next_buttons($min,$env{'form.show'},$total_results).
- ' '.
- &viewoptions().'
'
- );
+ my $sortform = ''
+ .&mt('Sort by:').' '
+ .&Apache::loncommon::select_form($env{'form.sortfield'},
+ 'sortfield',
+ \%sort_fields,'','','',
+ 'LC_sortby')
+ .' '
+ .&Apache::loncommon::select_form($env{'form.sortorder'},
+ 'sortorder',
+ {asc =>&mt('Ascending'),
+ desc=>&mt('Descending')
+ },'','','','LC_sortby')
+ .' ';
+ ##
+ ## Display links for 'prev' and 'next' pages (if necessary) and Display Options
+ $r->print(''."\n"
+ .''.&mt('Display Options').' '."\n"
+ .$sortform
+ .' '
+ .&viewoptions()
+ .' '
+ .&prev_next_buttons($min,$env{'form.show'},$total_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;
} else {
- $r->print(''.
+ $r->print(''.
mt('Results [_1] to [_2] out of [_3]',
$min,$max,$total_results).
- " \n");
+ "\n");
}
##
## Get results from MySQL table
@@ -2939,13 +3004,21 @@ sub display_results {
if ($area eq 'portfolio') {
$tabletype = 'portfolio_search';
}
+ $r->print(&Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row().
+ ''.&mt('Data').' ');
+ if (($env{'form.viewselect'} eq 'detailedpreview') ||
+ ($env{'form.viewselect'} eq 'summarypreview')) {
+ $r->print(''.&mt('Preview').' ');
+ }
+ $r->print(&Apache::loncommon::end_data_table_header_row());
foreach my $row (@Results) {
if ($connection->aborted()) {
&cleanup();
return;
}
my %Fields = %{&parse_row($tabletype,@$row)};
- my $output="\n";
+ my $output;
if (! defined($Fields{'title'}) || $Fields{'title'} eq '') {
$Fields{'title'} = 'Untitled';
}
@@ -2954,23 +3027,29 @@ sub display_results {
# Render the result into html
$output.= &$viewfunction($prefix,%Fields);
# Print them out as they come in.
- $r->print($output);
+ $r->print(&Apache::loncommon::start_data_table_row()
+ .'
'
+ .$output
+ .' '
+ .&Apache::loncommon::end_data_table_row()
+ );
$r->rflush();
}
+ $r->print(&Apache::loncommon::end_data_table());
if (@Results < 1) {
- $r->print(&mt("There were no results matching your query"));
+ $r->print(''
+ .&mt('There were no results matching your query.')
+ .'
');
} else {
- $r->print
- (''.
- &prev_next_buttons($min,$env{'form.show'},$total_results,
+ $r->print(
+ &prev_next_buttons($min,$env{'form.show'},$total_results,
"table=".$env{'form.table'}.
- "&phase=results".
- "&persistent_db_id=".
+ "&phase=results".
+ "&persistent_db_id=".
$env{'form.persistent_db_id'})
- ." \n"
- );
+ );
}
- $r->print("".&Apache::loncommon::end_page());
+ $r->print(''.&Apache::loncommon::end_page());
$r->rflush();
untie %groupsearch_db if (tied(%groupsearch_db));
return;
@@ -2997,8 +3076,8 @@ sub catalogmode_output {
$title=~ s/\'/\\\'/g;
if ($env{'form.catalogmode'} eq 'interactive') {
$output.=<
+
END
}
@@ -3007,8 +3086,8 @@ END
$groupsearch_db{"pre_${fnum}_title"}=$title;
$output.=<
-
+
END
}
@@ -3177,6 +3256,7 @@ sub search_results_header {
if (! exists($env{'form.mode'}) || $env{'form.mode'} ne 'edit') {
$js.=<
SCRIPT
} elsif ($env{'form.mode'} eq 'edit') {
@@ -3216,6 +3297,7 @@ END
$js.=<
SCRIPT
}
}
+ my $inhibit_menu = "&".&Apache::loncommon::inhibit_menu_check();
$js.=<
+SCRIPT
+
+ $js.=<
SCRIPT
my $start_page = &Apache::loncommon::start_page(undef,$js,
- {'only_body' =>1});
+ {'only_body' =>1,
+ 'add_wishlist' =>1,
+ 'add_modal' =>1});
my $result=<
$importbutton
END
@@ -3271,10 +3368,12 @@ END
}
sub results_link {
- my $basic_link = "/adm/searchcat?"."&table=".$env{'form.table'}.
- "&persistent_db_id=".$env{'form.persistent_db_id'};
- my $results_link = $basic_link."&phase=results".
- "&pause=1"."&start=1";
+ my $basic_link = "/adm/searchcat?"."&table=".$env{'form.table'}.
+ "&area=".$env{'form.area'}.
+ "&catalogmode=".$env{'form.catalogmode'}.
+ "&persistent_db_id=".$env{'form.persistent_db_id'};
+ my $results_link = $basic_link."&phase=results".
+ "&pause=1"."&start=1";
return $results_link;
}
@@ -3282,14 +3381,38 @@ sub results_link {
######################################################################
sub print_frames_interface {
my $r = shift;
- my $basic_link = "/adm/searchcat?"."&table=".$env{'form.table'}.
- "&persistent_db_id=".$env{'form.persistent_db_id'};
- my $run_search_link = $basic_link."&phase=run_search";
+ my $basic_link = "/adm/searchcat?table=".$env{'form.table'}.
+ "&area=".$env{'form.area'}.
+ "&catalogmode=".$env{'form.catalogmode'}.
+ "&persistent_db_id=".$env{'form.persistent_db_id'};
+ my $run_search_link = $basic_link."&phase=run_search";
my $results_link = &results_link();
my $js = <
+//
JS
@@ -3351,6 +3474,28 @@ sub evalfields {
######################################################################
######################################################################
+sub display_tools {
+ my ($title, $jumpurl) = @_;
+ my $result;
+ # Metadata
+ $result.=
+ &Apache::loncommon::modal_link(
+ $jumpurl.'.meta?inhibitmenu=yes',
+ ' ',
+ 500,500,'_blank',undef,&mt('Metadata'));
+ # Stored Links
+ $result.=
+ ' '.
+ ' ';
+ return $result;
+}
+
+######################################################################
+######################################################################
+
=pod
=item Metadata Viewing Functions
@@ -3375,12 +3520,14 @@ sub detailed_citation_view {
my $result;
my $jumpurl=$values{'url'};
$jumpurl=~s|^/ext/|http://|;
- $result .= ''.$prefix.
- ' '.' '.
- ''.$values{'title'}." \n";
- $result .= "\n";
- $result .= ''.$values{'author'}.' ,'.
+ $result .=
+ ''.$prefix.
+ ' '.' '.
+ ''.$values{'title'}." \n".
+ &display_tools($values{'title'}, $jumpurl).
+ "
\n".
+ ''.$values{'author'}.' ,'.
' '.$values{'owner'}.' ';
foreach my $field
(
@@ -3444,11 +3591,8 @@ sub detailed_citation_view {
if (exists($field->{'type'}) && $field->{'type'} eq 'list') {
$result .= ''.&mt($field->{'translate'}).' ';
foreach my $item (split(',',$values{$field->{'name'}})){
- $result .=
- &Apache::lonhtmlcommon::crumbs(&Apache::lonnet::clutter($item),
- 'preview',
- '',
- (($env{'form.catalogmode'} eq 'import')?'parent.statusframe.document.forms.statusform':''),2,0,1);
+ $item = &Apache::lonnet::clutter($item);
+ $result .= ' '.&display_url($item,1).' ';
}
} elsif (exists($field->{'format'}) && $field->{'format'} ne ''){
$result.= &mt($field->{'translate'},
@@ -3456,15 +3600,7 @@ sub detailed_citation_view {
$values{$field->{'name'}}))." \n";
} else {
if ($field->{'special'} eq 'url link') {
- if ($jumpurl=~/^http\:\/\//) {
- $result.=''.$jumpurl.' ';
- } else {
- $result .=
- &Apache::lonhtmlcommon::crumbs($jumpurl,
- 'preview',
- '',
- (($env{'form.catalogmode'} eq 'import')?'parent.statusframe.document.forms.statusform':''),3,0,1);
- }
+ $result .= ' '.&display_url($jumpurl,1).' ';
} else {
$result.= &mt($field->{'translate'},
$values{$field->{'name'}});
@@ -3479,17 +3615,14 @@ sub detailed_citation_view {
if (exists($values{'shortabstract'}) && $values{'shortabstract'} ne '') {
$result .= '
'.$values{'shortabstract'}.'
';
}
- $result .= ' '."\n";
return $result;
}
sub detailed_citation_preview {
my ($prefix,%values)=@_;
- return ''.
- &detailed_citation_view($prefix,%values).
+ return &detailed_citation_view($prefix,%values).
' '.
- &Apache::lonindexer::showpreview($values{'url'}).
- '
';
+ &Apache::lonindexer::showpreview($values{'url'});
}
@@ -3506,7 +3639,7 @@ sub detailed_citation_preview {
sub summary_view {
my ($prefix,%values) = @_;
my $icon=&Apache::loncommon::icon($values{'url'});
- my $result=qq{$prefix };
+ my $result=qq{$prefix };
if (exists($env{'form.sortfield'}) &&
$env{'form.sortfield'} !~ /^(default|
author|
@@ -3520,35 +3653,26 @@ sub summary_view {
$result .= ' '.$tmp.' ';
}
my $jumpurl=$values{'url'};
- my $link;
- if ($jumpurl=~m|^/ext/|) {
- $jumpurl=~s|^/ext/|http://|;
- $link=''.$jumpurl.' ';
- } else {
- $link=&Apache::lonhtmlcommon::crumbs($jumpurl,
- 'preview',
- '',
- (($env{'form.catalogmode'} eq 'import')?'parent.statusframe.document.forms.statusform':''),2,0,1);
- }
- $result.=<$values{'title'}$link
+ $jumpurl=~s|^/ext/|http://|;
+ my $link = ' '.&display_url($jumpurl,1).' ';
+ $result .=
+ ''.$values{'title'}.' '.
+ &display_tools($values{'title'}, $jumpurl).<
+$link
$values{'author'}, $values{'owner'} -- $values{'lastrevisiondate'}
$values{'copyrighttag'}
$values{'extrashow'}
-
-
END
return $result;
}
sub summary_preview {
my ($prefix,%values)=@_;
- return ''.
- &summary_view($prefix,%values).
+ return &summary_view($prefix,%values).
' '.
- &Apache::lonindexer::showpreview($values{'url'}).
- '
';
+ &Apache::lonindexer::showpreview($values{'url'});
}
######################################################################
@@ -3565,30 +3689,50 @@ sub summary_preview {
sub compact_view {
my ($prefix,%values) = @_;
my $jumpurl=$values{'url'};
- my $link;
- if ($jumpurl=~m|^/ext/|) {
- $jumpurl=~s|^/ext/|http://|;
- $link=''.$jumpurl.' ';
- } else {
- $link=&Apache::lonhtmlcommon::crumbs($jumpurl,
- 'preview',
- '',
- (($env{'form.catalogmode'} eq 'import')?'parent.statusframe.document.forms.statusform':''),1,1,1).' ';
- }
+ $jumpurl=~s|^/ext/|http://|;
+
+ my $link = &display_url($jumpurl,1);
+
my $result =
- $prefix.' ';
+ $prefix.' ';
if (exists($env{'form.sortfield'}) &&
$env{'form.sortfield'} !~ /^(default|author|url|title)$/) {
my $tmp = $values{$env{'form.sortfield'}};
if (! defined($tmp)) { $tmp = 'undefined'; }
$result .= ' '.$tmp.' ';
}
- $result.=' '.
- $values{'title'}.' '.(' 'x2).$link.
- ''.$values{'author'}.' ('.$values{'domain'}.') ';
+ $jumpurl = &HTML::Entities::encode($jumpurl,'<>&"');
+ $result.=' '.
+ ''.
+ &HTML::Entities::encode($values{'title'},'<>&"').' '.
+ &display_tools($values{'title'}, $jumpurl).
+ $link.' '.$values{'author'}.' ('.$values{'domain'}.')';
return $result;
}
+sub display_url {
+ my ($url,$skiplast) = @_;
+ my $link;
+ if ($url=~m|^/ext/|) {
+ $url=~s|^/ext/|http://|;
+ $link=''.$url.' ';
+ } elsif ($url=~m{^(http://|/uploaded/)}) {
+ $link=''.$url.' ';
+ } else {
+ # replace the links to open in a new window
+ # (because the search opens in a new window, it gets
+ # confusing when the links open a tab in the
+ # parent window; ideally we should not force windows)
+ my $onclick = " onclick=\"window.open(this.href, '_blank', 'toolbar=1,location=1,menubar=0');return false;\"";
+ $link=&Apache::lonhtmlcommon::crumbs(
+ $url,
+ 'preview',
+ '',
+ '',
+ $skiplast,$onclick).' ';
+ }
+ return $link;
+}
######################################################################
######################################################################
@@ -3609,12 +3753,15 @@ sub fielded_format_view {
$jumpurl=~s|^/ext/|http://|;
my $result=<
+$prefix
URL:
- $values{'url'}
+ $values{'url'}
END
+ $result .=
+ &display_tools($values{'title'}, $jumpurl).'
+ ';
foreach my $field ('title','author','domain','subject','keywords','notes',
'mimetag','language','creationdate','lastrevisiondate',
'owner','copyrighttag','hostname','abstract') {
@@ -3635,7 +3782,6 @@ END
}
$result .= " \n";
$result .= $values{'extrashow'};
- $result .= ' '."\n";
return $result;
}
@@ -3709,7 +3855,6 @@ $prefix
$xml
$values{'extrashow'}
-
END
return $result;
}
@@ -3749,9 +3894,12 @@ sub output_unparsed_phrase_error {
my ($r,$closebutton,$parms,$hidden_fields,$field)=@_;
my $errorstring;
if ($field eq 'basicexp') {
- $errorstring = &mt('Unable to understand the search phrase [_1] . Please modify your search.',$env{'form.basicexp'});
+ $errorstring = &mt('Unable to understand the search phrase [_1]. Please modify your search.'
+ ,''.$env{'form.basicexp'}.' ');
} else {
- $errorstring = &mt('Unable to understand the search phrase [_1] :[_2] .',$field,$env{'form.'.$field});
+ $errorstring = &mt('Unable to understand the search phrase [_1]: [_2]'
+ ,''.$field.' '
+ ,$env{'form.'.$field});
}
my $heading = &mt('Unparsed Field');
my $revise = &mt('Revise search request');
@@ -3765,11 +3913,11 @@ $hidden_fields
$closebutton
$heading
-
+
$errorstring
-$revise
+$revise
$end_page
ENDPAGE
@@ -3797,23 +3945,32 @@ $parms is extra information to include i
######################################################################
sub output_blank_field_error {
my ($r,$closebutton,$parms,$hidden_fields)=@_;
- my $errormsg = &mt('You did not fill in enough information for the search to be started. You need to fill in relevant fields on the search page in order for a query to be processed.');
+ my $errormsg = &mt('You did not fill in enough information for the search to be started. You need to fill in relevant fields on the search page in order for a query to be processed.');
my $revise = &mt('Revise Search Request');
- my $heading = &mt('Unactionable Search Queary');
+ my $heading = &mt('Unactionable Search Query');
my $start_page = &Apache::loncommon::start_page('Search');
my $end_page = &Apache::loncommon::end_page();
+ if ($closebutton) {
+ $closebutton = ''.$closebutton.'
';
+ } else {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>'',
+ text=>$heading,});
+ $start_page .= &Apache::lonhtmlcommon::breadcrumbs();
+ }
+
$r->print(<
$hidden_fields
$closebutton
-
+
$heading
-
+
$errormsg
-$revise
+$revise
$end_page
ENDPAGE
@@ -3844,16 +4001,18 @@ sub output_date_error {
# make query information persistent to allow for subsequent revision
my $start_page = &Apache::loncommon::start_page('Search');
my $end_page = &Apache::loncommon::end_page();
+ my $heading = &mt('Error');
$r->print(<
$hidden_fields
+onclick='this.form.submit();' />
$closebutton
+
-Error
-
+
$heading
+
$message
$end_page
@@ -3876,7 +4035,7 @@ Cleans the global %groupsearch_db by rem
######################################################################
sub start_fresh_session {
delete $groupsearch_db{'mode_catalog'};
- foreach (keys %groupsearch_db) {
+ foreach (keys(%groupsearch_db)) {
if ($_ =~ /^pre_/) {
delete $groupsearch_db{$_};
}
@@ -3894,7 +4053,6 @@ sub cleanup {
&Apache::lonnet::logthis('Failed cleanup searchcat: groupsearch_db');
}
}
- &untiehash();
&Apache::lonmysql::disconnect_from_db();
return OK;
}