--- loncom/interface/lonindexer.pm 2000/08/28 21:07:32 1.1 +++ loncom/interface/lonindexer.pm 2007/08/17 18:14:37 1.176 @@ -1,23 +1,101 @@ # The LearningOnline Network with CAPA # Directory Indexer -# (Login Screen -# 5/21/99,5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14 Gerd Kortemeyer) -# 11/23 Gerd Kortemeyer -# 07/20-08/04 H.K. Ng # +# $Id: lonindexer.pm,v 1.176 2007/08/17 18:14:37 banghart Exp $ +# +# Copyright Michigan State University Board of Trustees +# +# This file is part of the LearningOnline Network with CAPA (LON-CAPA). +# +# LON-CAPA is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# LON-CAPA is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LON-CAPA; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# /home/httpd/html/adm/gpl.txt +# +# http://www.lon-capa.org/ +# +### + +############################################################################### +## ## +## ORGANIZATION OF THIS PERL MODULE ## +## ## +## 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 ## +## ## +############################################################################### + package Apache::lonindexer; +# ------------------------------------------------- modules used by this module use strict; -use Apache::lonnet(); +use Apache::lonnet; +use Apache::loncommon(); +use Apache::lonhtmlcommon(); +use Apache::lonsequence(); use Apache::Constants qw(:common); +use Apache::lonmeta; +use Apache::File; +use Apache::lonlocal; +use Apache::lonsource(); +use Apache::groupsort(); +use GDBM_File; +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 +# ----- Values which are set by the handler subroutine and are accessible to +# ----- other methods. +my $extrafield; # default extra table cell +my $fnum; # file counter +my $dnum; # directory counter + +# ----- Used to include or exclude files with certain extensions. +my @Only = (); +my @Omit = (); + + + +# ----------------------------- Handling routine called via Apache and mod_perl sub handler { my $r = shift; - $r->content_type('text/html'); + my $c = $r->connection(); + &Apache::loncommon::content_type($r,'text/html'); + &Apache::loncommon::no_cache($r); $r->send_http_header; return OK if $r->header_only; + $fnum=0; + $dnum=0; + + # Deal with stupid global variables (is there a way around making + # these global to this package? It is just so wrong....) + undef (@Only); + undef (@Omit); + %fieldnames=&Apache::lonmeta::fieldnames(); - my $iconpath= $r->dir_config('lonIconsURL'); +# ------------------------------------- read in machine configuration variables + my $iconpath= $r->dir_config('lonIconsURL') . "/"; my $domain = $r->dir_config('lonDefDomain'); my $role = $r->dir_config('lonRole'); my $loadlim = $r->dir_config('lonLoadLim'); @@ -26,331 +104,1343 @@ sub handler { my $lonhost = $r->dir_config('lonHostID'); my $tabdir = $r->dir_config('lonTabDir'); -# ---------------------------------------------------------------- Print Header - $r->print(< - -The LearningOnline Network Directory Browser - - -ENDHEADER - + my $fileclr='#ffffe6'; my $line; - my (@attrchk,@openpath); + my (@attrchk,@openpath,$typeselect); my $uri=$r->uri; - my $iconpath="/res/adm/pages/indexericons/"; - $r->print("

The LearningOnline Network Directory Browser

\n"); +# -------------------------------------- see if called from an interactive mode + # Get the parameters from the query string + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['catalogmode','launch','acts','mode','form','element', + 'only','omit','titleelement']); + #------------------------------------------------------------------- + my $closebutton=''; + my $groupimportbutton=''; + my $colspan=''; + + $extrafield=''; + my $diropendb = + "/home/httpd/perl/tmp/$env{'user.domain'}_$env{'user.name'}_sel_res.db"; + %hash = (); + { + my %dbfile; + if (tie(%dbfile,'GDBM_File',$diropendb,&GDBM_WRITER(),0640)) { + if ($env{'form.launch'} eq '1') { + &start_fresh_session(\%dbfile); + } + while(my($key,$value)=each(%dbfile)) { + $hash{$key}=$value; + } + 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') { + &Apache::loncommon::content_type($r,'text/html'); + my $extra=''; + if (defined($env{'form.titleelement'}) && + $env{'form.titleelement'} ne '') { + my $verify_title = &Apache::lonnet::gettitle($env{'form.acts'}); +# &Apache::lonnet::logthis("Hrrm $env{'form.acts'} -- $verify_title"); + $verify_title=~s/'/\\'/g; + $extra='window.opener.document.forms["'.$env{'form.form'}.'"].elements["'.$env{'form.titleelement'}.'"].value=\''.$verify_title.'\';'; + } + my $js = < + function load() { + window.opener.document.forms["$env{'form.form'}"] + .elements["$env{'form.element'}"] + .value='$env{'form.acts'}'; + $extra + window.close(); + } + +ENDSUBM + $r->print(&Apache::loncommon::start_page(undef,$js, + {'only_body' =>1, + 'add_entries' => + {'onload' => "load();"},} + ). + &Apache::loncommon::end_page()); + return OK; + } + +# -------------------- refresh environment with user database values (in %hash) + &setvalues(\%hash,'form.catalogmode',\%env,'form.catalogmode' ); + +# --------------------- define extra fields and buttons in case of special mode + if ($env{'form.catalogmode'} eq 'interactive') { + $extrafield=''. + ''; + $colspan=" colspan='2' "; + my $cl=&mt('Close'); + $closebutton=< +END + } + elsif ($env{'form.catalogmode'} eq 'import') { + $extrafield=''. + ''; + $colspan=" colspan='2' "; + my $cl=&mt('Close'); + my $gi=&mt('Import'); + $closebutton=< +END + $groupimportbutton=< +END + } + # Additions made by Matthew to make the browser a little easier to deal + # with in the future. + # + # $mode (at this time) indicates if we are in edit mode. + # $form is the name of the form that the URL is placed when the + # selection is made. + # $element is the name of the element in $formname which receives + # the URL. + #&Apache::lonxml::debug('Checking mode, form, element'); + &setvalues(\%hash,'form.mode' ,\%env,'form.mode' ); + &setvalues(\%hash,'form.form' ,\%env,'form.form' ); + &setvalues(\%hash,'form.element' ,\%env,'form.element'); + &setvalues(\%hash,'form.titleelement',\%env,'form.titleelement'); + &setvalues(\%hash,'form.only' ,\%env,'form.only' ); + &setvalues(\%hash,'form.omit' ,\%env,'form.omit' ); + + # Deal with 'omit' and 'only' + if (exists $env{'form.omit'}) { + @Omit = split(',',$env{'form.omit'}); + } + if (exists $env{'form.only'}) { + @Only = split(',',$env{'form.only'}); + } + + my $mode = $env{'form.mode'}; + my ($form,$element,$titleelement); + if ($mode eq 'edit' || $mode eq 'parmset') { + $form = $env{'form.form'}; + $element = $env{'form.element'}; + $titleelement = $env{'form.titleelement'}; + } + #&Apache::lonxml::debug("mode=$mode form=$form element=$element titleelement=$titleelement"); +# ------ set catalogmodefunctions to have extra needed javascript functionality + my $catalogmodefunctions=''; + if ($env{'form.catalogmode'} eq 'interactive' or + $env{'form.catalogmode'} eq 'import') { + # The if statement below sets us up to use the old version + # by default (ie. if $mode is undefined). This is the easy + # way out. Hopefully in the future I'll find a way to get + # the calls dealt with in a more comprehensive manner. + +# +# There is now also mode "simple", which is for the simple version of the rat +# +# + if (!defined($mode) || ($mode ne 'edit' && $mode ne 'parmset')) { + my $location = "/adm/groupsort?&inhibitmenu=yes&catalogmode=import&"; + $location .= "mode=".$mode."&"; + $location .= "acts="; + $catalogmodefunctions=<<"END"; +function select_data(url) { + changeURL(url); + self.close(); +} +function select_group() { + window.location="$location"+document.forms.fileattr.acts.value; +} +function changeURL(val) { + if (opener.inf) { + if (opener.inf.document.forms.resinfo.elements.u) { + opener.inf.document.forms.resinfo.elements.u.value=val; + } + } +} +END + } elsif ($mode eq 'edit') { # we are in 'edit' mode + my $location = "/adm/groupsort?catalogmode=interactive&"; + $location .= "form=$form&element=$element&mode=edit&acts="; + $catalogmodefunctions=< +$catalogmodefunctions; +function update_only(field) { + alert(field.name); +} +function checkAll() { + var numForms = document.forms.length; + for (i=0;iprint(<Display file attributes
-
- - - - - - - - -
SizeLast accessLast modified
AuthorKeywordsLanguage
- - - -
-END - my $titleclr="#ddffff"; - my $fileclr="#ffffdd"; - - $r->print("
\n"); - $r->print("\n"); - $r->print("\n"); - $r->print("\n") if ($ENV{'form.attr0'} == 1); - $r->print("\n") if ($ENV{'form.attr1'} == 1); - $r->print("\n") if ($ENV{'form.attr2'} == 1); - $r->print(""); - - if ($ENV{'form.openuri'} =~ /$uri\&/) { - my @pathcom = split(/\//,$uri); - pop @pathcom; - my $splituri = join ('/',@pathcom); - $uri = join ('',$splituri,"/"); +} +function uncheckAll() { + var numForms = document.forms.length; + for (i=0;i +ENDHEADER + my ($headerdom)=($uri=~m{^/res/($match_domain)/}); + $r->print(&Apache::loncommon::start_page('Browse Resources',$js, + {'domain' => $headerdom,})); +# ---------------------------------- get state of file types to be showing + if ($env{'form.only'}) { + $typeselect = $env{'form.only'}; + } else { + $typeselect = ''; + } - my $openuri = $ENV{'form.openuri'}; -# $r->print ("
openuri=$openuri
"); - $openuri =~ s/$uri(.*)\&//g; -# $r->print ("
parsed openuri=$openuri
"); - @openpath = split(/\&/,$openuri); -# $r->print ("
open path=@openpath
"); - push @openpath, $uri; -# $r->print ("
append current uri to open path=@openpath
"); - @openpath = sort @openpath; -# $r->print ("
sorted open path=@openpath
"); - - - my $indent = -1; - &display_line ($r,1,"/res/".$domain."&domain"); - &branch ($r,"/res/".$domain."/",$indent,@openpath); - - $r->print("
NameSize (bytes) Last accessedLast modified
"); - $r->print("
"); - $r->print("\n"); -# &display_env($r); +# ---------------------------------- get state of file attributes to be showing + if ($env{'form.attrs'}) { + for (my $i=0; $i<=11; $i++) { + delete $hash{'display_attrs_'.$i}; + if ($env{'form.attr'.$i} == 1) { + $attrchk[$i] = 'checked'; + $hash{'display_attrs_'.$i} = 1; + } + } + } else { + for (my $i=0; $i<=11; $i++) { + $attrchk[$i] = 'checked' if $hash{'display_attrs_'.$i} == 1; + } + } + +# ------------------------------- 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', + 'pr' => 'Problems', + 'gr' => 'Graphics', + 'at' => 'All types' + ); + $r->print(< + + + + + + + + + + + + + + + + + + + + +
 
+ +