--- loncom/interface/lonindexer.pm 2007/07/11 23:51:19 1.172
+++ loncom/interface/lonindexer.pm 2018/08/07 17:41:40 1.228
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Directory Indexer
#
-# $Id: lonindexer.pm,v 1.172 2007/07/11 23:51:19 albertel Exp $
+# $Id: lonindexer.pm,v 1.228 2018/08/07 17:41:40 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -34,9 +34,8 @@
## 1. Description of functions ##
## 2. Modules used by this module ##
## 3. Choices for different output views (detailed, summary, xml, etc) ##
-## 4. BEGIN block (to be run once after compilation) ##
-## 5. Handling routine called via Apache and mod_perl ##
-## 6. Other subroutines ##
+## 4. Handling routine called via Apache and mod_perl ##
+## 5. Other subroutines ##
## ##
###############################################################################
@@ -60,7 +59,6 @@ use LONCAPA qw(:match);
# ---------------------------------------- variables used throughout the module
my %hash; # global user-specific gdbm file
my %dirs; # keys are directories, values are the open/close status
-my %language; # has the reference information present in language.tab
my %dynhash; # hash of hashes for dynamic metadata
my %dynread; # hash of directories already read for dynamic metadata
my %fieldnames; # Metadata fieldnames
@@ -94,19 +92,13 @@ sub handler {
undef (@Omit);
%fieldnames=&Apache::lonmeta::fieldnames();
-# ------------------------------------- read in machine configuration variables
+# --------------------------------------------------------------- get icon path
my $iconpath= $r->dir_config('lonIconsURL') . "/";
- my $domain = $r->dir_config('lonDefDomain');
- my $role = $r->dir_config('lonRole');
- my $loadlim = $r->dir_config('lonLoadLim');
- my $servadm = $r->dir_config('lonAdmEMail');
- my $sysadm = $r->dir_config('lonSysEMail');
- my $lonhost = $r->dir_config('lonHostID');
- my $tabdir = $r->dir_config('lonTabDir');
+ my $defdom = &Apache::lonnet::default_login_domain();
- my $fileclr='#ffffe6';
+#SB my $fileclr='#ffffe6';
my $line;
- my (@attrchk,@openpath);
+ my (@attrchk,@openpath,$typeselect);
my $uri=$r->uri;
# -------------------------------------- see if called from an interactive mode
@@ -120,8 +112,8 @@ sub handler {
my $colspan='';
$extrafield='';
- my $diropendb =
- "/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_sel_res.db";
+ my $diropendb = LONCAPA::tempdir() .
+ "$env{'user.domain'}_$env{'user.name'}_sel_res.db";
%hash = ();
{
my %dbfile;
@@ -135,6 +127,11 @@ sub handler {
untie(%dbfile);
}
}
+# - Evaluate actions from previous page (both cumulatively and chronologically)
+ if ($env{'form.catalogmode'} eq 'import' || $hash{'form.catalogmode'} eq 'import') {
+ &Apache::groupsort::update_actions_hash(\%hash);
+ }
+
{
#Hijack lonindexer to verify a title and be close down.
if ($env{'form.launch'} eq '2') {
@@ -160,6 +157,8 @@ sub handler {
ENDSUBM
$r->print(&Apache::loncommon::start_page(undef,$js,
{'only_body' =>1,
+ 'add_modal' => 1,
+ 'add_wishlist' => 1,
'add_entries' =>
{'onload' => "load();"},}
).
@@ -172,28 +171,30 @@ ENDSUBM
# --------------------- define extra fields and buttons in case of special mode
if ($env{'form.catalogmode'} eq 'interactive') {
- $extrafield='
'.
+#SB $extrafield='
'.
+ $extrafield='
'.
'
';
$colspan=" colspan='2' ";
my $cl=&mt('Close');
$closebutton=<
+
END
}
elsif ($env{'form.catalogmode'} eq 'import') {
- $extrafield='
'.
+#SB $extrafield='
'.
+ $extrafield='
'.
'
';
$colspan=" colspan='2' ";
my $cl=&mt('Close');
my $gi=&mt('Import');
$closebutton=<
+
END
$groupimportbutton=<
+onclick="javascript:select_group()" />
END
}
# Additions made by Matthew to make the browser a little easier to deal
@@ -269,6 +270,9 @@ END
function select_data(url) {
var location = "/res/?launch=2&form=$form&element=$element&titleelement=$titleelement&acts=" + url;
window.location=location;
+ if (window.opener.document.forms["$form"].elements["$element"].value != url) {
+ window.opener.unClean();
+ }
}
function select_group() {
window.location="$location"+document.forms.fileattr.acts.value;
@@ -311,10 +315,8 @@ function select_group() {
function changeURL(val) {
if (window.opener.document) {
- var elementname = "$element"+"_value";
- var checkboxname = "$element"+"_setparmval";
+ var elementname = "$element";
window.opener.document.forms["$form"].elements[elementname].value=val;
- window.opener.document.forms["$form"].elements[checkboxname].checked=true;
} else {
alert("The file you selected is: "+val);
}
@@ -351,7 +353,11 @@ END
my $js = <<"ENDHEADER";
ENDHEADER
my ($headerdom)=($uri=~m{^/res/($match_domain)/});
- $r->print(&Apache::loncommon::start_page('Browse Resources',$js,
- {'domain' => $headerdom,}));
-# - Evaluate actions from previous page (both cumulatively and chronologically)
- if ($env{'form.catalogmode'} eq 'import') {
- &Apache::groupsort::update_actions_hash(\%hash);
+
+ if ($env{'form.catalogmode'}) {
+ # "Popup mode"
+ $r->print(&Apache::loncommon::start_page('Browse published resources',$js,
+ {'only_body' => 1, 'add_wishlist'=>1, 'add_modal' =>1,
+ 'domain' => $headerdom,}));
+ } else {
+ # Only display page header and breadcrumbs in non-popup mode
+ &Apache::lonhtmlcommon::clear_breadcrumbs();
+ &Apache::lonhtmlcommon::add_breadcrumb({
+ 'text' => 'Browse published resources',
+ 'href' => '/res/'.$headerdom.'/?launch=1',
+ });
+ $r->print(&Apache::loncommon::start_page('Browse published resources',$js,
+ {'domain' => $headerdom,})
+ .&Apache::lonhtmlcommon::breadcrumbs()
+ );
+ }
+
+# ---------------------------------- get state of file types to be showing
+ if ($env{'form.only'}) {
+ $typeselect = $env{'form.only'};
+ } else {
+ $typeselect = '';
}
-
+
# ---------------------------------- get state of file attributes to be showing
if ($env{'form.attrs'}) {
- for (my $i=0; $i<=11; $i++) {
+ for (my $i=0; $i<=16; $i++) {
delete $hash{'display_attrs_'.$i};
if ($env{'form.attr'.$i} == 1) {
$attrchk[$i] = 'checked';
@@ -413,79 +441,132 @@ ENDHEADER
}
}
} else {
- for (my $i=0; $i<=11; $i++) {
- $attrchk[$i] = 'checked' if $hash{'display_attrs_'.$i} == 1;
+ for (my $i=0; $i<=16; $i++) {
+ $attrchk[$i] = 'checked="checked"' if $hash{'display_attrs_'.$i} == 1;
}
}
+ my @file_categories = &Apache::loncommon::filecategories();
+ my %select_file_categories;
+ my @select_form_order = ('');
+ $select_file_categories{''} = &mt('All file types');
+ foreach my $cat (@file_categories) {
+ my $types = join(",",&Apache::loncommon::filecategorytypes($cat));
+ $select_file_categories{$types} = &mt($cat);
+ push(@select_form_order,$types);
+ }
+ $select_file_categories{'select_form_order'} = \@select_form_order;
+ my $onchange = 'this.form.submit();';
+ my $type_element=
+ &Apache::loncommon::select_form(
+ $typeselect,
+ 'only',
+ \%select_file_categories,$onchange);
+ my $type_selector = '';
+
# ------------------------------- output state of file attributes to be showing
# All versions has to the last item
# since it does not take an extra col
my %lt=&Apache::lonlocal::texthash(
- 'ti' => 'Title',
- 'si' => 'Size',
- 'la' => 'Last access',
- 'lm' => 'Last modified',
- 'st' => 'Statistics',
- 'au' => 'Author',
- 'kw' => 'Keywords',
- 'ln' => 'Language',
- 'sa' => 'Source Available',
- 'sr' => 'Show resource',
- 'li' => 'Linked/Related Resources',
'av' => 'All versions',
- 'ud' => 'Update Display'
+ 'ud' => 'Update Display',
+ 'pr' => 'Problems',
+ 'gr' => 'Graphics',
+ 'at' => 'All types',
+ 'hd' => 'Display Options'
);
- $r->print(<
-
-
');
}
# ----------------- output starting row to the indexed file/directory hierarchy
- my $titleclr="#ddffff";
#$r->print(&initdebug());
#$r->print(&writedebug("Omit:@Omit")) if (@Omit);
#$r->print(&writedebug("Only:@Only")) if (@Only);
- $r->print('
\n")
if ($hash{'display_attrs_8'} == 1);
- $r->print("
".&mt("Source Available")."
\n")
+ $r->print("
".&mt("Source Available")."
\n")
if ($hash{'display_attrs_10'} == 1);
- $r->print("
".&mt("Linked/Related Resources")."
\n")
+ $r->print("
".&mt("Linked/Related Resources")."
\n")
if ($hash{'display_attrs_11'} == 1);
- $r->print("
".&mt("Resource")."
\n")
+ $r->print("
".&mt("Resource")."
\n")
if ($hash{'display_attrs_7'} == 1);
- $r->print('
');
+ $r->print("
".&mt("Subject")."
\n")
+ if ($hash{'display_attrs_12'} == 1);
+ $r->print("
".&mt("Notes")."
\n")
+ if ($hash{'display_attrs_13'} == 1);
+ $r->print("
".&mt("Abstract")."
\n")
+ if ($hash{'display_attrs_14'} == 1);
+ $r->print("
".&mt("Grade Level")."
\n")
+ if ($hash{'display_attrs_15'} == 1);
+ $r->print("
".&mt("Standards")."
\n")
+ if ($hash{'display_attrs_16'} == 1);
+
+ $r->print(&Apache::loncommon::end_data_table_header_row());
+
+
# ----------------- read in what directories have previously been set to "open"
- foreach (keys %hash) {
+ foreach (keys(%hash)) {
if ($_ =~ /^diropen_status_/) {
my $key = $_;
$key =~ s/^diropen_status_//;
@@ -571,21 +665,19 @@ END
pop @uri_com;
my $upone = join('/',@uri_com);
my @list = qw (0);
- &display_line ($r,'opened',$upone.'&viewOneUp',0,$upone,@list);
+ &display_line ($r,$defdom,'opened',$upone.'&viewOneUp',0,$upone,@list);
$indent = 1;
}
# -------- recursively go through all the directories and output as appropriate
- &scanDir ($r,$toplevel,$indent,\%hash);
-
+ &scanDir ($r,$toplevel,$indent,\%hash,$defdom);
# -------------------------------------------------------------- end the tables
- $r->print('
');
+ $r->print(&Apache::loncommon::end_data_table());
+
# ---------------------------- embed hidden information useful for group import
$r->print("");
-# -------------------------------------------------------------- end the tables
- $r->print('
');
# --------------------------------------------------- end the output and return
$r->print(&Apache::loncommon::end_page()."\n");
@@ -606,7 +698,7 @@ END
# ----------------------------------------------- recursive scan of a directory
sub scanDir {
- my ($r,$startdir,$indent,$hashref)=@_;
+ my ($r,$startdir,$indent,$hashref,$defdom)=@_;
my $c = $r->connection();
my ($compuri,$curdir);
my $dirptr=16384;
@@ -618,10 +710,23 @@ sub scanDir {
return if ($c->aborted());
#This is a kludge, sorry aboot this
my ($strip,$dom,undef,$testdir,undef,undef,undef,undef,undef,undef,undef,undef,undef,undef,$obs,undef)=split(/\&/,$line,16);
- next if($strip =~ /.*\.meta$/ | $obs eq '1');
+ next if (($strip =~ /\.meta$/) || ($obs));
+ if ($dom ne 'domain') {
+ my ($udom,$uname);
+ if ($dom eq 'user') {
+ ($udom) = ($startdir =~ m{^/res/($match_domain)});
+ $uname = $strip;
+ } else {
+ ($udom,$uname) = ($startdir =~ m{^/res/($match_domain)/($match_courseid)});
+ }
+ if ($udom ne '' && $uname ne '') {
+ # Don't display "course author" directory.
+ next if (&Apache::lonnet::is_course($udom.'_'.$uname));
+ }
+ }
my (@fileparts) = split(/\./,$strip);
if ($hash{'display_attrs_9'} != 1) {
-# if not all versions to be shown
+ # if not all versions to be shown
if (scalar(@fileparts) >= 3) {
my $fext = pop @fileparts;
my $ov = pop @fileparts;
@@ -649,8 +754,8 @@ sub scanDir {
}
}
}
- &display_line($r,$diropen,$line,$indent,$curdir,$hashref,@list);
- &scanDir ($r,$compuri,$indent) if $diropen eq 'opened';
+ &display_line($r,$defdom,$diropen,$line,$indent,$curdir,$hashref,@list);
+ &scanDir ($r,$compuri,$indent,undef,$defdom) if $diropen eq 'opened';
}
$indent--;
}
@@ -659,9 +764,11 @@ sub scanDir {
sub get_list {
my ($r,$uri)=@_;
my @list=();
+ my $listerror;
+
(my $luri = $uri) =~ s/\//_/g;
if ($env{'form.updatedisplay'}) {
- foreach (keys %hash) {
+ foreach (keys(%hash)) {
delete $hash{$_} if ($_ =~ /^dirlist_files_/);
delete $hash{$_} if ($_ =~ /^dirlist_timestamp_files_/);
}
@@ -682,10 +789,20 @@ sub get_list {
$hash{'dirlist_files_'.$luri} = join("\n",@list);
} else {
# is really a directory
- @list = &Apache::lonnet::dirlist($uri);
+ (my $listref,$listerror) = &Apache::lonnet::dirlist($uri);
+ if (ref($listref) eq 'ARRAY') {
+ @list = @{$listref};
+ }
$hash{'dirlist_files_'.$luri} = join("\n",@list);
$hash{'dirlist_timestamp_files_'.$luri} = time;
}
+#Checking for error messages associated with empty directories or inaccessible servers (See Bug 4984)
+ if (($listerror eq 'no_such_dir') || ($listerror eq 'no_such_host') || ($listerror eq 'no_host')) {
+ $r->print("
" . &mt("Directory temporarily not accessible."). "
");
+ }
+
return @list=&match_ext($r,@list);
}
@@ -768,7 +885,7 @@ sub match_ext {
# ------------------------------- displays one line in appropriate table format
sub display_line {
- my ($r,$diropen,$line,$indent,$startdir,$hashref,@list)=@_;
+ my ($r,$defdom,$diropen,$line,$indent,$startdir,$hashref,@list)=@_;
my (@pathfn, $fndir);
# there could be relative paths (files actually belonging into this directory)
# or absolute paths (for example, from sequences)
@@ -782,7 +899,7 @@ sub display_line {
$pathprefix=$startdir;
}
my $dirptr=16384;
- my $fileclr="#ffffe6";
+#SB my $fileclr="#ffffe6";
my $iconpath= $r->dir_config('lonIconsURL') . '/';
my @filecom = split (/\&/,$line);
@@ -791,10 +908,11 @@ sub display_line {
my $fnptr = $filecom[3]&$dirptr;
my $msg = &mt('View').' '.$filecom[0].' '.&mt('resources');
$msg = &mt('Close').' '.$filecom[0].' '.&mt('directory') if $diropen eq 'opened';
+ my $nowOpen = ($diropen eq 'opened' ? 1 : 0);
my $tabtag='';
my $i=0;
- while ($i<=11) {
+ while ($i<=16) {
$tabtag=join('',$tabtag,"
")
if ($i != 9 &&
$hash{'display_attrs_'.$i} == 1);
@@ -809,106 +927,144 @@ sub display_line {
$updir='/'.(split(/\.(page|sequence)\/\//,$startdir))[-1];
$updir=~s/\/+/\//g;
- $r->print("
'.
+ ''.$tabtag);
+ $r->print(&Apache::loncommon::end_data_table_row());
+ return OK;
}
# display file
- if (($fnptr == 0 and $filecom[3] ne '') or $absolute) {
- my $title;
- my $filelink = $pathprefix.$filecom[0];
- if ($hash{'display_attrs_0'} == 1) {
- $title = &Apache::lonnet::gettitle($filelink);
- }
- my @file_ext = split (/\./,$listname);
- my $curfext = $file_ext[-1];
- if (@Omit) {
- foreach (@Omit) { return OK if ($curfext eq $_); }
- }
- if (@Only) {
- my $skip = 1;
- foreach (@Only) { $skip = 0 if ($curfext eq $_); }
- return OK if ($skip > 0);
- }
- # Set the icon for the file
- my $iconname = &Apache::loncommon::icon($listname);
- $r->print("
");
+ if (($fnptr == 0 and $filecom[3] ne '') or $absolute) {
+ my $title;
+ my $filelink = $pathprefix.$filecom[0];
+ if ($hash{'display_attrs_0'} == 1) {
+ $title = &Apache::lonnet::gettitle($filelink);
+ }
+ my @file_ext = split (/\./,$listname);
+ my $curfext = $file_ext[-1];
+ if (@Omit) {
+ foreach (@Omit) { return OK if (lc($curfext) eq $_); }
+ }
+ if (@Only) {
+ my $skip = 1;
+ foreach (@Only) { $skip = 0 if (lc($curfext) eq $_); }
+ return OK if ($skip > 0);
+ }
+ # Set the icon for the file
+ my $iconname = &Apache::loncommon::icon($listname);
+#SB $r->print("