--- loncom/interface/londocs.pm 2006/07/20 01:18:26 1.238 +++ loncom/interface/londocs.pm 2008/11/18 19:14:22 1.316 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.238 2006/07/20 01:18:26 www Exp $ +# $Id: londocs.pm,v 1.316 2008/11/18 19:14:22 jms Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,6 +26,22 @@ # http://www.lon-capa.org/ # + +=head1 NAME + +Apache::londocs.pm + +=head1 SYNOPSIS + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + +=head1 SUBROUTINES + +=over + +=cut + package Apache::londocs; use strict; @@ -33,17 +49,16 @@ use Apache::Constants qw(:common :http); use Apache::imsexport; use Apache::lonnet; use Apache::loncommon; -use Apache::lonratedt; -use Apache::lonratsrv; +use LONCAPA::map(); +use Apache::lonratedt(); use Apache::lonxml; -use Apache::loncreatecourse; +use Apache::lonclonecourse; use Apache::lonnavmaps; use HTML::Entities; use GDBM_File; use Apache::lonlocal; use Cwd; -use lib '/home/httpd/lib/perl/'; -use LONCAPA; +use LONCAPA qw(:DEFAULT :match); my $iconpath; @@ -54,35 +69,54 @@ my %alreadyseen=(); my $hadchanges; -# Available help topics + +=pod + +=item %help=() + + Available help topics + +=cut my %help=(); -# Mapread read maps into lonratedt::global arrays -# @order and @resources, determines status -# sets @order - pointer to resources in right order -# sets @resources - array with the resources with correct idx -# +=pod + +=item mapread() + +Mapread read maps into LONCAPA::map:: global arrays +@order and @resources, determines status +sets @order - pointer to resources in right order +sets @resources - array with the resources with correct idx + +=cut sub mapread { my ($coursenum,$coursedom,$map)=@_; return - &Apache::lonratedt::mapread('/uploaded/'.$coursedom.'/'.$coursenum.'/'. - $map); + &LONCAPA::map::mapread('/uploaded/'.$coursedom.'/'.$coursenum.'/'. + $map); } sub storemap { my ($coursenum,$coursedom,$map)=@_; my ($outtext,$errtext)= - &Apache::lonratedt::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'. - $map,1); + &LONCAPA::map::storemap('/uploaded/'.$coursedom.'/'.$coursenum.'/'. + $map,1); if ($errtext) { return ($errtext,2); } $hadchanges=1; return ($errtext,0); } -# ----------------------------------------- Return hash with valid author names + +=pod + +=item authorhosts() + + Return hash with valid author names + +=cut sub authorhosts { my %outhash=(); @@ -100,7 +134,7 @@ sub authorhosts { $ca=$env{'user.name'}; $cd=$env{'user.domain'}; } else { - ($cd,$ca)=($realm=~/^\/(\w+)\/(\w+)$/); + ($cd,$ca)=($realm=~/^\/($match_domain)\/($match_username)$/); } my $allowed=0; my $myhome=&Apache::lonnet::homeserver($ca,$cd); @@ -117,22 +151,29 @@ sub authorhosts { } return ($home,$other,%outhash); } -# ------------------------------------------------------ Generate "dump" button +=pod + +=item dumpbutton() + + Generate "dump" button + +=cut sub dumpbutton { my ($home,$other,%outhash)=&authorhosts(); my $type = &Apache::loncommon::course_type(); if ($home+$other==0) { return ''; } - my $output='
'. '$url.$cpinfo, - 'title'=>&unescape($foldername), + 'title'=>$name, 'text'=>''. - &unescape($foldername).'' + $name.'', + 'no_mt'=>1, }); - - + $plain.=$name.' > '; + } + $plain=~s/\>\;\s*$//; + return (&Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp', + 'LC_docs_path'),$randompick,$ishidden,$isencrypted,$plain,$is_random_order); +} + +sub log_docs { + return &Apache::lonnet::instructor_log('docslog',@_); +} + +{ + my @oldresources=(); + my @oldorder=(); + my $parmidx; + my %parmaction=(); + my %parmvalue=(); + my $changedflag; + + sub snapshotbefore { + @oldresources=@LONCAPA::map::resources; + @oldorder=@LONCAPA::map::order; + $parmidx=undef; + %parmaction=(); + %parmvalue=(); + $changedflag=0; + } + + sub remember_parms { + my ($idx,$parameter,$action,$value)=@_; + $parmidx=$idx; + $parmaction{$parameter}=$action; + $parmvalue{$parameter}=$value; + $changedflag=1; + } + + sub log_differences { + my ($plain)=@_; + my %storehash=('folder' => $plain, + 'currentfolder' => $env{'form.folder'}); + if ($parmidx) { + $storehash{'parameter_res'}=$oldresources[$parmidx]; + foreach my $parm (keys %parmaction) { + $storehash{'parameter_action_'.$parm}=$parmaction{$parm}; + $storehash{'parameter_value_'.$parm}=$parmvalue{$parm}; + } + } + my $maxidx=$#oldresources; + if ($#LONCAPA::map::resources>$#oldresources) { + $maxidx=$#LONCAPA::map::resources; + } + for (my $idx=0; $idx<=$maxidx; $idx++) { + if ($LONCAPA::map::resources[$idx] ne $oldresources[$idx]) { + $storehash{'before_resources_'.$idx}=$oldresources[$idx]; + $storehash{'after_resources_'.$idx}=$LONCAPA::map::resources[$idx]; + $changedflag=1; + } + if ($LONCAPA::map::order[$idx] ne $oldorder[$idx]) { + $storehash{'before_order_res_'.$idx}=$oldresources[$oldorder[$idx]]; + $storehash{'after_order_res_'.$idx}=$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]; + $changedflag=1; + } + } + $storehash{'maxidx'}=$maxidx; + if ($changedflag) { &log_docs(\%storehash); } } - return &Apache::lonhtmlcommon::breadcrumbs(undef,undef,0,'nohelp', - 'LC_docs_path'); } -sub editor { - my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output)=@_; - my $errtext=''; - my $fatal=0; - my $container='sequence'; - if ($env{'form.pagepath'}) { - $container='page'; - } - ($errtext,$fatal)= - &mapread($coursenum,$coursedom,$folder.'.'.$container); - if ($#Apache::lonratedt::order<1) { - my $idx=&Apache::lonratedt::getresidx(); - if ($idx<=0) { $idx=1; } - $Apache::lonratedt::order[0]=$idx; - $Apache::lonratedt::resources[$idx]=''; +=pod + +=item docs_change_log() + +=cut + +sub docs_change_log { + my ($r)=@_; + my $folder=$env{'form.folder'}; + $r->print(&Apache::loncommon::start_page('Course Document Change Log')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course Document Change Log')); + my %docslog=&Apache::lonnet::dump('nohist_docslog', + $env{'course.'.$env{'request.course.id'}.'.domain'}, + $env{'course.'.$env{'request.course.id'}.'.num'}); + + if ((keys(%docslog))[0]=~/^error\:/) { undef(%docslog); } + + $r->print('
'); + $r->print(&Apache::loncommon::start_data_table().&Apache::loncommon::start_data_table_header_row(). + ''.$errtext.'
'); + my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]); + if (&is_supplemental_title($title)) { + &Apache::lonnet::appenv({'docs.markedcopy_supplemental' => $title}); + ($title) = &parse_supplemental_title($title); + } elsif ($env{'docs.markedcopy_supplemental'}) { + &Apache::lonnet::delenv('docs\\.markedcopy_supplemental'); + } + $url=~s{http(:|:)//https(:|:)//}{https$2//}; + + &Apache::lonnet::appenv({'docs.markedcopy_title' => $title, + 'docs.markedcopy_url' => $url}); + delete($env{'form.markcopy'}); +} + +sub print_paste_buffer { + my ($r,$container) = @_; + return if (!defined($env{'docs.markedcopy_url'})); + + $r->print(<
+ENDPASTE
+ $r->print(' ');
+
+ my $type;
+ if ($env{'docs.markedcopy_url'} =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) {
+ $type = &mt('External Resource');
+ $r->print($type.': '.
+ &LONCAPA::map::qtescape($env{'docs.markedcopy_title'}).' ('.
+ &LONCAPA::map::qtescape($env{'docs.markedcopy_url'}).')');
+ } else {
+ my $extension = (split(/\./,$env{'docs.markedcopy_url'}))[-1];
+ my $icon = &Apache::loncommon::icon($extension);
+ if ($extension eq 'sequence' &&
+ $env{'docs.markedcopy_url'} =~ m{/default_\d+\.sequence$ }x) {
+ $icon = &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));
+ $icon .= '/folder_closed.gif';
+ }
+ $icon = '';
+ $r->print($icon.$type.': '. &parse_supplemental_title(&LONCAPA::map::qtescape($env{'docs.markedcopy_title'})));
+ }
+ if ($container eq 'page') {
+ $r->print('
+
+
+');
+ } else {
+ $r->print('
+
+');
+ }
+ $r->print('
'.$errtext.'
'); - return; + if (&handle_edit_cmd()) { + ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container); + return $errtext if ($fatal); + } +# Group import/search + if ($env{'form.importdetail'}) { + my @imports; + foreach (split(/\&/,$env{'form.importdetail'})) { + if (defined($_)) { + my ($name,$url,$residx)= + map {&unescape($_)} split(/\=/,$_); + push(@imports, [$name, $url, $residx]); } - } - if ($env{'form.pastemarked'}) { -# paste resource to end of list - my $url=$env{'form.markedcopy_url'}; - my $title=$env{'form.markedcopy_title'}; -# Maps need to be copied first - if (($url=~/\.(page|sequence)$/) || ($url=~/^\/uploaded\//)) { - $title=&mt('Copy of').' '.$title; - my $newid=$$.time; - $url=~/^(.+)\.(\w+)$/; - my $newurl=$1.$newid.'.'.$2; - my $storefn=$newurl; - $storefn=~s/^\/\w+\/\w+\/\w+\///; - &Apache::loncreatecourse::writefile - ($env{'request.course.id'},$storefn, - &Apache::lonnet::getfile($url)); - $url=$newurl; - } - $title=~s/\\<\;/g; - $title=~s/\>/\>\;/g; - $title=~s/\:/\:/g; - my $ext='false'; - if ($url=~/^http\:\/\//) { $ext='true'; } - $url=~s/\:/\:/g; -# Now insert the URL at the bottom - my $newidx=&Apache::lonratedt::getresidx($url); - $Apache::lonratedt::resources[$newidx]= - $title.':'.$url.':'.$ext.':normal:res'; - $Apache::lonratedt::order[1+$#Apache::lonratedt::order]=$newidx; -# Store the result - ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container); - if ($fatal) { - $r->print(''.$errtext.'
'); - return; + ($errtext,$fatal)=&group_import($coursenum, $coursedom, $folder, + $container,'londocs',@imports); + return $errtext if ($fatal); + } +# Loading a complete map + if ($env{'form.loadmap'}) { + if ($env{'form.importmap'}=~/\w/) { + foreach my $res (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) { + my ($title,$url,$ext,$type)=split(/\:/,$res); + my $idx=&LONCAPA::map::getresidx($url); + $LONCAPA::map::resources[$idx]=$res; + $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx; } - - } - $r->print($upload_output); - if ($env{'form.cmd'}) { - my ($cmd,$idx)=split(/\_/,$env{'form.cmd'}); - if ($cmd eq 'del') { - my (undef,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]]); - if (($url=~m|/+uploaded/\Q$coursedom\E/\Q$coursenum\E/|) && - ($url!~/\.(page|sequence|problem|exam|quiz|assess|survey|form|library|task)$/)) { - &Apache::lonnet::removeuploadedurl($url); - } else { - &Apache::lonratedt::makezombie($Apache::lonratedt::order[$idx]); - } - for (my $i=$idx;$i<$#Apache::lonratedt::order;$i++) { - $Apache::lonratedt::order[$i]= - $Apache::lonratedt::order[$i+1]; - } - $#Apache::lonratedt::order--; - } elsif ($cmd eq 'cut') { - my (undef,$url)=split(':',$Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]]); - &Apache::lonratedt::makezombie($Apache::lonratedt::order[$idx]); - for (my $i=$idx;$i<$#Apache::lonratedt::order;$i++) { - $Apache::lonratedt::order[$i]= - $Apache::lonratedt::order[$i+1]; - } - $#Apache::lonratedt::order--; - } elsif ($cmd eq 'up') { - if (($idx) && (defined($Apache::lonratedt::order[$idx-1]))) { - my $i=$Apache::lonratedt::order[$idx-1]; - $Apache::lonratedt::order[$idx-1]= - $Apache::lonratedt::order[$idx]; - $Apache::lonratedt::order[$idx]=$i; - } - } elsif ($cmd eq 'down') { - if (defined($Apache::lonratedt::order[$idx+1])) { - my $i=$Apache::lonratedt::order[$idx+1]; - $Apache::lonratedt::order[$idx+1]= - $Apache::lonratedt::order[$idx]; - $Apache::lonratedt::order[$idx]=$i; - } - } elsif ($cmd eq 'rename') { - my $ratstr = $Apache::lonratedt::resources[$Apache::lonratedt::order[$idx]]; - my ($rtitle,@rrest)=split(/\:/, - $Apache::lonratedt::resources[ - $Apache::lonratedt::order[$idx]]); - my $comment= - &HTML::Entities::decode($env{'form.title'}); - $comment=~s/\\<\;/g; - $comment=~s/\>/\>\;/g; - $comment=~s/\:/\:/g; - if ($comment=~/\S/) { - $Apache::lonratedt::resources[ - $Apache::lonratedt::order[$idx]]= - $comment.':'.join(':',@rrest); - } -# Devalidate title cache - &Apache::lonnet::devalidate_title_cache(&Apache::lonnet::unescape($rrest[0])); - } -# Store the changed version ($errtext,$fatal)=&storemap($coursenum,$coursedom, $folder.'.'.$container); - if ($fatal) { - $r->print(''.$errtext.'
'); - return; - } - } -# Group import/search - if ($env{'form.importdetail'}) { - my @imports; - &Apache::lonnet::logthis("imp detail ".$env{'form.importdetail'}); - foreach (split(/\&/,$env{'form.importdetail'})) { - if (defined($_)) { - my ($name,$url)=split(/\=/,$_); - $name=&unescape($name); - $url=&unescape($url); - push @imports, $name, $url; - } - } -# Store the changed version - ($errtext,$fatal)=group_import($coursenum, $coursedom, $folder, - $container,'londocs',@imports); - if ($fatal) { - $r->print(''.$errtext.'
'); - return; - } - } -# Loading a complete map - if ($env{'form.loadmap'}) { - if ($env{'form.importmap'}=~/\w/) { - foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$env{'form.importmap'}))) { - my ($title,$url,$ext,$type)=split(/\:/,$_); - my $idx=&Apache::lonratedt::getresidx($url); - $Apache::lonratedt::resources[$idx]=$_; - $Apache::lonratedt::order - [$#Apache::lonratedt::order+1]=$idx; - } -# Store the changed version - ($errtext,$fatal)=&storemap($coursenum,$coursedom, - $folder.'.'.$container); - if ($fatal) { - $r->print(''.$errtext.'
'); - return; - } - } else { - $r->print(''.&mt('No map selected.').'
'); - } - } - } -# ---------------------------------------------------------------- End commands -# ---------------------------------------------------------------- Print screen - my $idx=0; - my $shown=0; - $r->print(''.&mt('Currently no documents.').' |
'.&mt('Parameters').':
'.&mt('Caution: this folder is set to randomly pick a subset of resources. Adding or removing resources from this folder will change the set of resources that the students see, resulting in spurious or missing credit for completed problems, not limited to ones you modify. Do not modify the contents of this folder if it is in active student use.').'
'); + } + if ($is_random_order) { + $r->print(''.&mt('Caution: this folder is set to randomly order its contents. Adding or removing resources from this folder will change the order of resources shown.').'
'); + } + $r->print(''.&mt('Currently no documents.').' |
'.$errtext.'
'; + $$upload_output .= ''.$errtext.'
'; return 'failed'; } else { if ($parseaction eq 'parse') { my $total_embedded = keys(%{$allfiles}); if ($total_embedded > 0) { my $num = 0; - $$upload_output .= 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.\n"); foreach my $res ($navmap->retrieveResources()) { @@ -1768,15 +2171,21 @@ sub list_symbs { } -# -# -------------------------------------------------------------- Verify Content -# +=pod + +=item verifycontent() + +Verify Content + +=cut + sub verifycontent { my ($r) = @_; my $type = &Apache::loncommon::course_type(); my $loaderror=&Apache::lonnet::overloaderror($r); if ($loaderror) { return $loaderror; } $r->print(&Apache::loncommon::start_page('Verify '.$type.' Documents')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Verify '.$type.' Documents')); $hashtied=0; undef %alreadyseen; %alreadyseen=(); @@ -1784,9 +2193,9 @@ sub verifycontent { foreach (keys %hash) { if ($hash{$_}=~/\.(page|sequence)$/) { if (($_=~/^src_/) && ($alreadyseen{&unescape($hash{$_})})) { - $r->print('
'. + $r->print('
'. &mt('The following sequence or page is included more than once in your '.$type.': '). - &unescape($hash{$_}).'
'. + &unescape($hash{$_}).'
'. &mt('Note that grading records for problems included in this sequence or folder will overlap.
')); } } @@ -1799,8 +2208,13 @@ sub verifycontent { &mt('Return to DOCS').''); } +=pod + +=item devalidateversioncache() & checkversions() -# -------------------------------------------------------------- Check Versions +Check Versions + +=cut sub devalidateversioncache { my $src=shift; @@ -1812,6 +2226,7 @@ sub checkversions { my ($r) = @_; my $type = &Apache::loncommon::course_type(); $r->print(&Apache::loncommon::start_page("Check $type Document Versions")); + $r->print(&Apache::lonhtmlcommon::breadcrumbs("Check $type Document Versions")); my $header=''; my $startsel=''; my $monthsel=''; @@ -1863,9 +2278,9 @@ sub checkversions { if (&Apache::lonnet::put('resourceversions',\%newsetversions, $env{'course.'.$env{'request.course.id'}.'.domain'}, $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') { - $r->print(''.&mt('Your Version Settings have been Stored').'
'); + $r->print(''.&mt('Your Version Settings have been Saved').'
'); } else { - $r->print(''.&mt('An Error Occured while Attempting to Store your Version Settings').'
'); + $r->print(''.&mt('An Error Occured while Attempting to Save your Version Settings').'
'); } &mark_hash_old(); } @@ -1972,10 +2387,10 @@ ENDHEADERS 'lastrevisiondate') ). ''. - 'Most Recent: '. + ' Most Recent: '. ''.$currentversion.''. - ' '. - ''. + ' In '.$type.': '. + ' In '.$type.': '. ''); # Used in course my $usedversion=$hash{'version_'.$linkurl}; @@ -1984,8 +2399,8 @@ ENDHEADERS } else { $r->print($currentversion); } - $r->print(' '. - ' Use: '); + $r->print(' '. + 'Use: '); # Set version $r->print(&Apache::loncommon::select_form($setversions{$linkurl}, 'set_version_'.$linkurl, @@ -1994,7 +2409,7 @@ ENDHEADERS '' => '', 'mostrecent' => 'most recent', map {$_,$_} (1..$currentversion)))); - $r->print(' '); + $r->print(' '); my $lastold=1; for (my $prevvers=1;$prevvers<$currentversion;$prevvers++) { my $url=$root.'.'.$prevvers.'.'.$extension; @@ -2018,7 +2433,7 @@ ENDHEADERS my $cols_output = 1; for (my $prevvers=$lastold;$prevvers<$currentversion;$prevvers++) { my $url=$root.'.'.$prevvers.'.'.$extension; - $r->print(' '.&mt('Version').' '.$prevvers.' ('. &Apache::lonlocal::locallocaltime( &Apache::lonnet::metadata($url, @@ -2031,7 +2446,7 @@ ENDHEADERS '&versionone='.$prevvers. '">'.&mt('Diffs').''); } - $r->print('
'); + $r->print('
'); if (++$entries_count % $entries_per_col == 0) { $r->print(''); if ($cols_output != 4) { @@ -2093,17 +2508,47 @@ sub changewarning { $message='Changes will become active for your current session after [_1], or the next time you log in.'; } $r->print("\n\n". -''."\n". +''."\n". ''."\n\n"); +$help{'Caching'}.''."\n\n"); +} + +=pod + +=item init_breadcrumbs() + +Breadcrumbs for special functions + +=cut + +sub init_breadcrumbs { + my ($form,$text)=@_; + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs", + text=>"Edit ".&Apache::loncommon::course_type(), + faq=>273, + bug=>'Instructor Interface', + help => 'Docs_Adding_Course_Doc'}); + &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs?".$form.'=1', + text=>$text, + faq=>273, + bug=>'Instructor Interface'}); } -# ================================================================ Main Handler + +=pod + +=item handler() + +Main Handler + +=cut + sub handler { my $r = shift; &Apache::loncommon::content_type($r,'text/html'); @@ -2131,20 +2576,28 @@ sub handler { 'Docs_About_Bulletin_Board,Docs_Editing_Templated_Pages'); $help{'My Personal Info'} = &Apache::loncommon::help_open_topic( 'Docs_About_My_Personal_Info,Docs_Editing_Templated_Pages'); + $help{'Group Files'} = &Apache::loncommon::help_open_topic('Docs_About_Group_Files'); $help{'Caching'} = &Apache::loncommon::help_open_topic('Caching'); # does this user have privileges to modify docs my $allowed=&Apache::lonnet::allowed('mdc',$env{'request.course.id'}); - if ($allowed && $env{'form.verify'}) { + &init_breadcrumbs('verify','Verify Content'); &verifycontent($r); } elsif ($allowed && $env{'form.listsymbs'}) { + &init_breadcrumbs('listsymbs','List Symbs'); &list_symbs($r); + } elsif ($allowed && $env{'form.docslog'}) { + &init_breadcrumbs('docslog','Show Log'); + &docs_change_log($r); } elsif ($allowed && $env{'form.versions'}) { + &init_breadcrumbs('versions','Check/Set Resource Versions'); &checkversions($r); } elsif ($allowed && $env{'form.dumpcourse'}) { + &init_breadcrumbs('dumpcourse','Dump '.&Apache::loncommon::course_type().' DOCS to Construction Space'); &dumpcourse($r); } elsif ($allowed && $env{'form.exportcourse'}) { + &init_breadcrumbs('exportcourse','Export '.&Apache::loncommon::course_type().' to IMS'); &exportcourse($r); } else { # is this a standard course? @@ -2158,8 +2611,27 @@ sub handler { my $uploadtag; &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['folderpath','pagepath', - 'pagesymb','markedcopy_url', - 'markedcopy_title']); + 'pagesymb']); +# No folderpath, no pagepath, see if we have something stored + if ((!$env{'form.folderpath'}) && (!$env{'form.pagepath'})) { + &Apache::loncommon::restore_course_settings('docs_folderpath', + {'folderpath' => 'scalar'}); + } + if (!$env{'form.folderpath'}) { + &Apache::loncommon::restore_course_settings('docs_folderpath', + {'pagepath' => 'scalar'}); + } + if ($env{'form.pagepath'}) { + $env{'form.folderpath'}=''; + } + if ($env{'form.folderpath'} =~ /^supplemental_\d+/) { + $env{'form.folderpath'} = 'supplemental&'. + &escape(&mt('Supplemental '.$type.' Documents')).'&'. + $env{'form.folderpath'}; + } + &Apache::loncommon::store_course_settings('docs_folderpath', + {'pagepath' => 'scalar', + 'folderpath' => 'scalar'}); if ($env{'form.folderpath'}) { my (@folderpath)=split('&',$env{'form.folderpath'}); $env{'form.foldername'}=&unescape(pop(@folderpath)); @@ -2171,8 +2643,8 @@ sub handler { $env{'form.folder'}=pop(@pagepath); $containertag = ''. ''; - $uploadtag = ''. - ''; + $uploadtag = ''. + ''; } if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) { $showdoc='/'.$1; @@ -2199,8 +2671,7 @@ sub handler { # get personal data my $uname=$env{'user.name'}; my $udom=$env{'user.domain'}; - my $plainname=&escape( - &Apache::loncommon::plainname($uname,$udom)); + my $plainname=&escape(&Apache::loncommon::plainname($uname,$udom)); # graphics settings @@ -2219,11 +2690,16 @@ sub handler { my %codebase = (); my ($upload_result,$upload_output); if ($allowed) { - if (($env{'form.uploaddoc.filename'}) && ($env{'form.cmd'}=~/^upload_(\w+)/)) { + if (($env{'form.uploaddoc.filename'}) && + ($env{'form.cmd'}=~/^upload_(\w+)/)) { # Process file upload - phase one - upload and parse primary file. + undef($hadchanges); $upload_result = &process_file_upload(\$upload_output,$coursenum, $coursedom,\%allfiles, \%codebase,$1); + if ($hadchanges) { + &mark_hash_old(); + } if ($upload_result eq 'phasetwo') { $r->print($upload_output); } @@ -2324,6 +2800,8 @@ sub handler { 'scuf' => 'Score Upload Form', 'bull' => 'Bulletin Board', 'mypi' => 'My Personal Info', + 'grpo' => 'Group Files', + 'rost' => 'Course Roster', 'abou' => 'About User', 'imsf' => 'Import IMS package', 'file' => 'File', @@ -2333,12 +2811,14 @@ sub handler { ); # ----------------------------------------------------------------------------- if ($allowed) { + &update_paste_buffer($coursenum,$coursedom); my $dumpbut=&dumpbutton(); my $exportbut=&exportbutton(); my %lt=&Apache::lonlocal::texthash( 'vc' => 'Verify Content', 'cv' => 'Check/Set Resource Versions', 'ls' => 'List Symbs', + 'sl' => 'Show Log' ); my $folderpath=$env{'form.folderpath'}; @@ -2351,55 +2831,72 @@ sub handler { } unless ($env{'form.pagepath'}) { $containertag = ''; - $uploadtag = ''; + $uploadtag = ''; } $r->print(<- - - -$containertag + + + + + $containertag + ENDCOURSEVERIFY $r->print(&Apache::loncommon::help_open_topic('Docs_Adding_Course_Doc', &mt('Editing the Table of Contents for your '.$type))); } # --------------------------------------------------------- Standard documents - $r->print(''); + $r->print('
'); } else { unless ($upload_result eq 'phasetwo') { # -------------------------------------------------------- This is showdoc mode $r->print("'); + if (($standard) && ($allowed) && (!$forcesupplement)) { - $r->print('
'); if ($allowed) { - $r->print(''); + $r->print(' +'); } - $r->print(''); + $r->print(' '); # ' '.&mt('Main Course Documents'). # ($allowed?' '.$help{'Main_Course_Documents'}:'').'
'); my $folder=$env{'form.folder'}; if ($folder eq '' || $folder eq 'supplemental') { $folder='default'; $env{'form.folderpath'}='default&'.&escape(&mt('Main '.$type.' Documents')); + $uploadtag = ''; } my $postexec=''; if ($folder eq 'default') { - $r->print(''); + $r->print(''); } else { #$postexec='self.close();'; } $hadchanges=0; - &editor($r,$coursenum,$coursedom,$folder,$allowed,$upload_output); + my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed, + $upload_output,$type); + if ($error) { + $r->print(''.$error.'
'); + } if ($hadchanges) { &mark_hash_old() } @@ -2414,54 +2911,56 @@ ENDCOURSEVERIFY } my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container; $r->print(<- ENDSUPFORM } } + $r->print('$lt{'uplm'} -$lt{'impp'} -$lt{'spec'} ++
+ -$lt{'uplm'} +$lt{'impp'} +$lt{'spec'} + + $lt{'file'}: -
+
@@ -2474,116 +2973,134 @@ ENDFORM
ENDFORM } - $r->print(''); + $r->print(' '); unless ($env{'form.pagepath'}) { + my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); $r->print(<
+
+
ENDFORM } @@ -2591,20 +3108,20 @@ ENDFORM $r->print(<$uploadtag - - + + $help{'Simple Problem'} - +
ENDBLOCK } @@ -2614,7 +3131,7 @@ ENDBLOCK } # ----------------------------------------------------- Supplemental documents if (!$forcestandard) { - $r->print(''); + $r->print(' '); # ' '.&mt('Supplemental Course Documents'). # ($allowed?' '.$help{'Supplemental'}:'').'
'); my $folder=$env{'form.folder'}; @@ -2622,97 +3139,107 @@ ENDBLOCK $folder='supplemental'; } if ($folder =~ /^supplemental$/ && - $env{'form.folderpath'} =~ /^default\&/) { - $env{'form.folderpath'}='supplemental&'. - &escape(&mt('Supplemental '.$type.' Documents')); + (($env{'form.folderpath'} =~ /^default\&/) || ($env{'form.folderpath'} eq ''))) { + $env{'form.folderpath'} = 'supplemental&'. + &escape(&mt('Supplemental '.$type.' Documents')); + } + my $error = &editor($r,$coursenum,$coursedom,$folder,$allowed,'',$type); + if ($error) { + $r->print(''.$error.'
'); } - &editor($r,$coursenum,$coursedom,$folder,$allowed); if ($allowed) { - my $folderseq= - '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time. - '.sequence'; - - $r->print(<- $lt{'upls'} -$lt{'spec'} + my $folderseq= + '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time. + '.sequence'; + + my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); + $r->print(<+ -$lt{'upls'} +$lt{'spec'} + - +
".&mt('Uploaded Document').' - '. &Apache::lonnet::gettitle($r->uri).'
'. -&mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."
". - &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'
'); +&mt('It is recommended that you use an up-to-date virus scanner before handling this file.')."". + &entryline(0,&mt("Click to download or use your browser's Save Link function"),$showdoc).'
'); } } } @@ -2724,10 +3251,33 @@ ENDSUPFORM sub editing_js { my ($udom,$uname) = @_; my $now = time(); + my %lt = &Apache::lonlocal::texthash( + p_mnf => 'Name of New Folder', + t_mnf => 'New Folder', + p_mnp => 'Name of New Page', + t_mnp => 'New Page', + p_mxu => 'Title for the Uploaded Score', + p_msp => 'Title for the Page', + p_msb => 'Title for the Problem', + p_mdb => 'Title for the Drop Box', + p_mbb => 'Title for the Bulletin Board', + p_mab => "Enter user:domain for User's 'About Me' Page", + p_mab2 => "About [_99]", + p_mab_alrt1 => 'Not a valid user:domain', + p_mab_alrt2 => 'Please enter both user and domain in the format user:domain', + p_chn => 'New Title', + p_rmr1 => 'WARNING: Removing a resource makes associated grades and scores inaccessible!', + p_rmr2a => 'Remove[_99]', + p_rmr2b => '?[_99]', + p_ctr1a => 'WARNING: Cutting a resource makes associated grades and scores inaccessible!', + p_ctr1b => 'Grades remain inaccessible if resource is pasted into another folder.', + p_ctr2a => 'Cut[_98]', + p_ctr2b => '?[_98]' + ); return <