--- loncom/interface/londocs.pm 2007/06/28 23:26:46 1.278.2.1 +++ loncom/interface/londocs.pm 2008/12/11 14:55:15 1.319 @@ -1,7 +1,7 @@ # The LearningOnline Network # Documents # -# $Id: londocs.pm,v 1.278.2.1 2007/06/28 23:26:46 albertel Exp $ +# $Id: londocs.pm,v 1.319 2008/12/11 14:55:15 bisitz Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,6 +26,8 @@ # http://www.lon-capa.org/ # + + package Apache::londocs; use strict; @@ -53,15 +55,10 @@ my %alreadyseen=(); my $hadchanges; -# Available help topics my %help=(); -# 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 -# + sub mapread { my ($coursenum,$coursedom,$map)=@_; @@ -81,7 +78,7 @@ sub storemap { return ($errtext,0); } -# ----------------------------------------- Return hash with valid author names + sub authorhosts { my %outhash=(); @@ -116,22 +113,23 @@ sub authorhosts { } return ($home,$other,%outhash); } -# ------------------------------------------------------ Generate "dump" button + sub dumpbutton { my ($home,$other,%outhash)=&authorhosts(); my $type = &Apache::loncommon::course_type(); if ($home+$other==0) { return ''; } - my $output=''; if ($home) { - return ''. + return '
'. ''. - &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs'); + &Apache::loncommon::help_open_topic('Docs_Dump_Course_Docs'). + '
'; } else { - return''. + return '
'. &mt('Dump '.$type. - ' DOCS to Construction Space: available on other servers'); + ' DOCS to Construction Space: available on other servers'). + '
'; } } @@ -140,7 +138,8 @@ sub clean { $title=~s/[^\w\/\!\$\%\^\*\-\_\=\+\;\:\,\\\|\`\~]+/\_/gs; return $title; } -# -------------------------------------------------------- Actually dump course + + sub dumpcourse { my ($r) = @_; @@ -199,9 +198,9 @@ sub dumpcourse { $fail=1; } if ($fail) { - $r->print('fail'); + $r->print(''.&mt('fail').''); } else { - $r->print('ok'); + $r->print(''.&mt('ok').''); } } } else { @@ -227,11 +226,19 @@ sub dumpcourse { my $title=$origcrsdata{'description'}; $title=~s/[\/\s]+/\_/gs; $title=&clean($title); - $r->print('

'.&mt('Folder in Construction Space').'


'); + $r->print('

'.&mt('Folder in Construction Space').'

' + .'
'); &tiehash(); - $r->print('

'.&mt('Filenames in Construction Space').'

'); + $r->print('

'.&mt('Filenames in Construction Space').'

' + .&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .'' + .'' + .'' + .&Apache::loncommon::end_data_table_header_row()); foreach (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) { - $r->print(''); + $r->print(&Apache::loncommon::start_data_table_row() + .''); my ($ext)=($_=~/\.(\w+)$/); my $title=$hash{'title_'.$hash{ 'ids_/uploaded/'.$origcrsdata{'domain'}.'/'.$origcrsdata{'num'}.'/'.$_}}; @@ -244,25 +251,28 @@ sub dumpcourse { $title=~s/\.(\w+)$//; $title=&clean($title); $title.='.'.$ext; - $r->print("\n\n"); + $r->print("\n" + .&Apache::loncommon::end_data_table_row()); } - $r->print("
'.&mt('Internal Filename').''.&mt('Title').''.&mt('Save as ...').'
'.&mt('Internal Filename').''.&mt('Title').''.&mt('Save as ...').'
'.$_.''.$_.'
\n"); + $r->print(&Apache::loncommon::end_data_table()); &untiehash(); $r->print( - '

'); + '

'); } } -# ------------------------------------------------------ Generate "export" button + sub exportbutton { my $type = &Apache::loncommon::course_type(); - return ''. + return '
'. ''. - &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs'); + &Apache::loncommon::help_open_topic('Docs_Export_Course_Docs').'
'; } + + sub exportcourse { my $r=shift; my $type = &Apache::loncommon::course_type(); @@ -308,10 +318,10 @@ sub exportcourse { chdir $cwd; $outcome .= &mt('Download the zip file from IMS '.lc($type).' archive
',$imszipfile,); if ($copyresult) { - $outcome .= 'The following errors occurred during export - '.$copyresult; + $outcome .= &mt('The following errors occurred during export - [_1]',$copyresult); } } else { - $outcome = '
Unfortunately you will not be able to retrieve an IMS archive of this posts at this time, because there was a problem creating a manifest file.
'; + $outcome = '
'.&mt('Unfortunately you will not be able to retrieve an IMS archive of this posts at this time, because there was a problem creating a manifest file.').'
'; } } $r->print(&Apache::loncommon::start_page('Export '.lc($type).' to IMS content package')); @@ -379,7 +389,7 @@ sub exportcourse { } $display .= ' />'."\n"; for (my $i=0; $i<$depth; $i++) { - $display .= ''."\n"; + $display .= ''."\n"; } if ($curRes->is_sequence()) { $display .= ' '."\n"; @@ -817,7 +827,7 @@ sub extract_media { $dirpath = $url; $container = ''; } - &Apache::lonnet::extract_embedded_items(undef,undef,\%allfiles,\%codebase,$content); + &Apache::lonnet::extract_embedded_items(undef,\%allfiles,\%codebase,$content); foreach my $embed_file (keys(%allfiles)) { my $filename; if ($embed_file =~ m#([^/]+)$#) { @@ -901,15 +911,12 @@ sub store_template { } } -# Imports the given (name, url) resources into the course -# coursenum, coursedom, and folder must precede the list + sub group_import { my ($coursenum, $coursedom, $folder, $container, $caller, @files) = @_; while (@files) { - my $name = shift(@files); - my $url = shift(@files); - #FIXME check if file exists before overwriting, might be restoring it + my ($name, $url, $residx) = @{ shift(@files) }; if (($url =~ m{^/uploaded/\Q$coursedom\E/\Q$coursenum\E/(default_\d+\.)(page|sequence)$}) && ($caller eq 'londocs') && (!&Apache::lonnet::stat_file($url))) { @@ -925,7 +932,7 @@ sub group_import { my $result=&Apache::lonnet::finishuserfileupload($coursenum,$coursedom, 'output',$1.$2); if ($result != m|^/uploaded/|) { - $errtext.='Map not saved: A network error occured when trying to save the new map. '; + $errtext.='Map not saved: A network error occurred when trying to save the new map. '; $fatal = 2; } if ($fatal) { @@ -933,21 +940,24 @@ sub group_import { } } if ($url) { - my $idx = &LONCAPA::map::getresidx($url); - $LONCAPA::map::order[$#LONCAPA::map::order+1]=$idx; + if (!$residx + || defined($LONCAPA::map::zombies[$residx])) { + $residx = &LONCAPA::map::getresidx($url,$residx); + push(@LONCAPA::map::order, $residx); + } my $ext = 'false'; if ($url=~m{^http://} || $url=~m{^https://}) { $ext = 'true'; } $url = &LONCAPA::map::qtunescape($url); $name = &LONCAPA::map::qtunescape($name); - $LONCAPA::map::resources[$idx] = - join ':', ($name, $url, $ext, 'normal', 'res'); + $LONCAPA::map::resources[$residx] = + join(':', ($name, $url, $ext, 'normal', 'res')); } } return &storemap($coursenum, $coursedom, $folder.'.'.$container); } sub breadcrumbs { - my ($where)=@_; + my ($where,$allowed,$type)=@_; &Apache::lonhtmlcommon::clear_breadcrumbs(); my (@folders); if ($env{'form.pagepath'}) { @@ -958,34 +968,35 @@ sub breadcrumbs { my $folderpath; my $cpinfo=''; my $plain=''; - if ($env{'form.markedcopy_url'}) { - $cpinfo='&markedcopy_url='. - &escape($env{'form.markedcopy_url'}). - '&markedcopy_title='. - &escape($env{'form.markedcopy_title'}); - } my $randompick=-1; my $isencrypted=0; my $ishidden=0; my $is_random_order=0; while (@folders) { my $folder=shift(@folders); - my $foldername=shift(@folders); + my $foldername=shift(@folders); if ($folderpath) {$folderpath.='&';} $folderpath.=$folder.'&'.$foldername; my $url='/adm/coursedocs?folderpath='. &escape($folderpath); - my $name=&unescape($foldername); -# randompick number, hidden, encrypted is appended with ":"s to the foldername - $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)$//; - if ($1 ne '') { + my $name=&unescape($foldername); +# randompick number, hidden, encrypted, random order, is appended with ":"s to the foldername + $name=~s/\:(\d*)\:(\w*)\:(\w*):(\d*)$//; + if ($1 ne '') { $randompick=$1; } else { $randompick=-1; } if ($2) { $ishidden=1; } if ($3) { $isencrypted=1; } - if ($4 ne '') { $is_random_order = 1; } + if ($4 ne '') { $is_random_order = 1; } + if ($folder eq 'supplemental') { + if ($allowed) { + $name = &mt('Supplemental '.$type.' Documents'); + } else { + $name = &mt($type.' Documents'); + } + } &Apache::lonhtmlcommon::add_breadcrumb( {'href'=>$url.$cpinfo, 'title'=>$name, @@ -1062,9 +1073,9 @@ sub log_docs { } -# -# Docs Change Log -# + + + sub docs_change_log { my ($r)=@_; my $folder=$env{'form.folder'}; @@ -1158,7 +1169,7 @@ sub docs_change_log { for (my $idx=0;$idx<=$docslog{$id}{'logentry'}{'maxidx'};$idx++) { my $oldname=(split(/\:/,$docslog{$id}{'logentry'}{'before_resources_'.$idx}))[0]; my $newname=(split(/\:/,$docslog{$id}{'logentry'}{'after_resources_'.$idx}))[0]; - if ($oldname ne $newname) { + if ($oldname ne '' && $oldname ne $newname) { $r->print(&LONCAPA::map::qtescape($newname)); } } @@ -1188,328 +1199,332 @@ sub docs_change_log { || $shown<=$env{'form.show'})) { last; } } $r->print(&Apache::loncommon::end_data_table()); - $r->print(&Apache::loncommon::end_page()); } -sub editor { - my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output)=@_; - my $errtext=''; - my $fatal=0; - my $container='sequence'; - if ($env{'form.pagepath'}) { - $container='page'; +sub update_paste_buffer { + my ($coursenum,$coursedom) = @_; + + return if (!defined($env{'form.markcopy'})); + return if (!defined($env{'form.copyfolder'})); + return if ($env{'form.markcopy'} < 0); + + my ($errtext,$fatal) = &mapread($coursenum,$coursedom, + $env{'form.copyfolder'}); + + return if ($fatal); + +# Mark for copying + 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(' + +'); } - ($errtext,$fatal)= - &mapread($coursenum,$coursedom,$folder.'.'.$container); + $r->print('

'); +} + +sub do_paste_from_buffer { + my ($coursenum,$coursedom,$folder) = @_; + + return 0 if (!$env{'form.pastemarked'}); + +# paste resource to end of list + my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url'}); + my $title=&LONCAPA::map::qtescape($env{'docs.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+/$match_domain/$match_username/}{}; + &Apache::lonclonecourse::writefile($env{'request.course.id'},$storefn, + &Apache::lonnet::getfile($url)); + $url = $newurl; + } +# published maps can only exists once, so remove it from paste buffer when done + if (($url=~/\.(page|sequence)$/) && ($url=~m {^/res/})) { + &Apache::lonnet::delenv('docs\\.markedcopy'); + } + if ($url=~ m{/smppg$}) { + my $db_name = &Apache::lonsimplepage::get_db_name($url); + if ($db_name =~ /^smppage_/) { + #simple pages, need to copy the db contents to a new one. + my %contents=&Apache::lonnet::dump($db_name,$coursedom,$coursenum); + my $now = time(); + $db_name =~ s{_\d*$ }{_$now}x; + my $result=&Apache::lonnet::put($db_name,\%contents, + $coursedom,$coursenum); + $url =~ s{/(\d*)/smppg$ }{/$now/smppg}x; + $title=&mt('Copy of').' '.$title; + } + } + $title = &LONCAPA::map::qtunescape($title); + my $ext='false'; + if ($url=~m{^http(|s)://}) { $ext='true'; } + $url = &LONCAPA::map::qtunescape($url); +# Now insert the URL at the bottom + my $newidx = &LONCAPA::map::getresidx($url); + if ($env{'docs.markedcopy_supplemental'}) { + if ($folder =~ /^supplemental/) { + $title = $env{'docs.markedcopy_supplemental'}; + } else { + (undef,undef,$title) = + &parse_supplemental_title($env{'docs.markedcopy_supplemental'}); + } + } else { + if ($folder=~/^supplemental/) { + $title=time.'___&&&___'.$env{'user.name'}.'___&&&___'. + $env{'user.domain'}.'___&&&___'.$title; + } + } + + $LONCAPA::map::resources[$newidx]= $title.':'.$url.':'.$ext.':normal:res'; + push(@LONCAPA::map::order, $newidx); +# Store the result +} + +my %parameter_type = ( 'randompick' => 'int_pos', + 'hiddenresource' => 'string_yesno', + 'encrypturl' => 'string_yesno', + 'randomorder' => 'string_yesno',); +my $valid_parameters_re = join('|',keys(%parameter_type)); +# set parameters +sub update_parameter { + + return 0 if ($env{'form.changeparms'} !~ /^($valid_parameters_re)$/); + + my $which = $env{'form.changeparms'}; + my $idx = $env{'form.setparms'}; + if ($env{'form.'.$which.'_'.$idx}) { + my $value = ($which eq 'randompick') ? $env{'form.'.$which.'_'.$idx} + : 'yes'; + &LONCAPA::map::storeparameter($idx, 'parameter_'.$which, $value, + $parameter_type{$which}); + &remember_parms($idx,$which,'set',$value); + } else { + &LONCAPA::map::delparameter($idx,'parameter_'.$which); + + &remember_parms($idx,$which,'del'); + } + return 1; +} + + +sub handle_edit_cmd { + my ($coursenum,$coursedom) =@_; + + my ($cmd,$idx)=split('_',$env{'form.cmd'}); + + my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]; + my ($title, $url, @rrest) = split(':', $ratstr); + + if ($cmd eq 'del') { + 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 { + &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]); + } + splice(@LONCAPA::map::order, $idx, 1); + + } elsif ($cmd eq 'cut') { + &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]); + splice(@LONCAPA::map::order, $idx, 1); + + } elsif ($cmd eq 'up' + && ($idx) && (defined($LONCAPA::map::order[$idx-1]))) { + @LONCAPA::map::order[$idx-1,$idx] = @LONCAPA::map::order[$idx,$idx-1]; + + } elsif ($cmd eq 'down' + && defined($LONCAPA::map::order[$idx+1])) { + @LONCAPA::map::order[$idx+1,$idx] = @LONCAPA::map::order[$idx,$idx+1]; + + } elsif ($cmd eq 'rename') { + + my $comment = &LONCAPA::map::qtunescape($env{'form.title'}); + if ($comment=~/\S/) { + $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]= + $comment.':'.join(':', $url, @rrest); + } +# Devalidate title cache + my $renamed_url=&LONCAPA::map::qtescape($url); + &Apache::lonnet::devalidate_title_cache($renamed_url); + } else { + return 0; + } + return 1; +} + +sub editor { + my ($r,$coursenum,$coursedom,$folder,$allowed,$upload_output,$type)=@_; + + my $container= ($env{'form.pagepath'}) ? 'page' + : 'sequence'; + + my ($errtext,$fatal) = &mapread($coursenum,$coursedom, + $folder.'.'.$container); + return $errtext if ($fatal); + if ($#LONCAPA::map::order<1) { my $idx=&LONCAPA::map::getresidx(); if ($idx<=0) { $idx=1; } $LONCAPA::map::order[0]=$idx; $LONCAPA::map::resources[$idx]=''; } - if (defined($env{'form.markcopy'})) { -# Mark for copying - my ($title,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$env{'form.markcopy'}]]); - $env{'form.markedcopy_title'}=$title; - $env{'form.markedcopy_url'}=$url; - } - my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order)=&breadcrumbs($folder); + + my ($breadcrumbtrail,$randompick,$ishidden,$isencrypted,$plain,$is_random_order)= + &breadcrumbs($folder,$allowed,$type); $r->print($breadcrumbtrail); - if ($fatal) { - $r->print('

'.$errtext.'

'); - } else { + # ------------------------------------------------------------ Process commands # ---------------- if they are for this folder and user allowed to make changes - if (($allowed) && ($env{'form.folder'} eq $folder)) { + if (($allowed) && ($env{'form.folder'} eq $folder)) { # set parameters and change order - &snapshotbefore(); - if ($env{'form.changeparms'}) { - my $idx=$env{'form.setparms'}; -# set parameters - if ($env{'form.changeparms'} eq 'randompick') { - if ($env{'form.randpick_'.$idx}) { - &LONCAPA::map::storeparameter($idx,'parameter_randompick',$env{'form.randpick_'.$idx},'int_pos'); - &remember_parms($idx,'randompick','set',$env{'form.randpick_'.$idx}); - } else { - &LONCAPA::map::delparameter($idx,'parameter_randompick'); - &remember_parms($idx,'randompick','del'); - } - } - if ($env{'form.changeparms'} eq 'hiddenresource') { - if ($env{'form.hidprs_'.$idx}) { - &LONCAPA::map::storeparameter($idx,'parameter_hiddenresource','yes','string_yesno'); - &remember_parms($idx,'hiddenresource','set',$env{'form.hidprs_'.$idx}); - } else { - &LONCAPA::map::delparameter($idx,'parameter_hiddenresource'); - &remember_parms($idx,'hiddenresource','del'); - } - } - if ($env{'form.changeparms'} eq 'encrypturl') { - if ($env{'form.encprs_'.$idx}) { - &LONCAPA::map::storeparameter($idx,'parameter_encrypturl','yes','string_yesno'); - &remember_parms($idx,'encrypturl','set',$env{'form.encprs_'.$idx}); - } else { - &LONCAPA::map::delparameter($idx,'parameter_encrypturl'); - &remember_parms($idx,'encrypturl','del'); - } - } - if ($env{'form.changeparms'} eq 'randomorder') { - if ($env{'form.randorder_'.$idx}) { - &LONCAPA::map::storeparameter($idx,'parameter_randomorder','yes','string_yesno'); - &remember_parms($idx,'randomorder','set',$env{'form.randorder_'.$idx}); - } else { - &LONCAPA::map::delparameter($idx,'parameter_randomorder'); - &remember_parms($idx,'randomorder','del'); - } - } -# store the changed version - ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container); - if ($fatal) { - $r->print('

'.$errtext.'

'); - return; - } - } + &snapshotbefore(); - if ($env{'form.newpos'}) { + if (&update_parameter()) { + ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container); + return $errtext if ($fatal); + } + + if ($env{'form.newpos'} && $env{'form.currentpos'}) { # change order - my $newpos=$env{'form.newpos'}-1; - my $currentpos=$env{'form.currentpos'}-1; - my $i; - my @neworder=(); - if ($newpos>$currentpos) { -# moving stuff up - for ($i=0;$i<$currentpos;$i++) { - $neworder[$i]=$LONCAPA::map::order[$i]; - } - for ($i=$currentpos;$i<$newpos;$i++) { - $neworder[$i]=$LONCAPA::map::order[$i+1]; - } - $neworder[$newpos]=$LONCAPA::map::order[$currentpos]; - for ($i=$newpos+1;$i<=$#LONCAPA::map::order;$i++) { - $neworder[$i]=$LONCAPA::map::order[$i]; - } - } else { -# moving stuff down - for ($i=0;$i<$newpos;$i++) { - $neworder[$i]=$LONCAPA::map::order[$i]; - } - $neworder[$newpos]=$LONCAPA::map::order[$currentpos]; - for ($i=$newpos+1;$i<$currentpos+1;$i++) { - $neworder[$i]=$LONCAPA::map::order[$i-1]; - } - for ($i=$currentpos+1;$i<=$#LONCAPA::map::order;$i++) { - $neworder[$i]=$LONCAPA::map::order[$i]; - } - } - @LONCAPA::map::order=@neworder; -# store the changed version - ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container); - if ($fatal) { - $r->print('

'.$errtext.'

'); - return; + my $res = splice(@LONCAPA::map::order,$env{'form.currentpos'}-1,1); + splice(@LONCAPA::map::order,$env{'form.newpos'}-1,0,$res); + + ($errtext,$fatal)=&storemap($coursenum,$coursedom,$folder.'.'.$container); + return $errtext if ($fatal); + } + + if ($env{'form.pastemarked'}) { + &do_paste_from_buffer($coursenum,$coursedom,$folder); + ($errtext,$fatal) = &storemap($coursenum,$coursedom,$folder.'.'.$container); + return $errtext if ($fatal); + } + + $r->print($upload_output); + + 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+/$match_domain/$match_username/}{}; - &Apache::lonclonecourse::writefile - ($env{'request.course.id'},$storefn, - &Apache::lonnet::getfile($url)); - $url=$newurl; - } - $title = &LONCAPA::map::qtunescape($title); - my $ext='false'; - if ($url=~/^http\:\/\//) { $ext='true'; } - $url = &LONCAPA::map::qtunescape($url); -# Now insert the URL at the bottom - my $newidx=&LONCAPA::map::getresidx($url); - $LONCAPA::map::resources[$newidx]= - $title.':'.$url.':'.$ext.':normal:res'; - $LONCAPA::map::order[1+$#LONCAPA::map::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(':',$LONCAPA::map::resources[$LONCAPA::map::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 { - &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]); - } - for (my $i=$idx;$i<$#LONCAPA::map::order;$i++) { - $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1]; - } - $#LONCAPA::map::order--; - } elsif ($cmd eq 'cut') { - my (undef,$url)=split(':',$LONCAPA::map::resources[$LONCAPA::map::order[$idx]]); - &LONCAPA::map::makezombie($LONCAPA::map::order[$idx]); - for (my $i=$idx;$i<$#LONCAPA::map::order;$i++) { - $LONCAPA::map::order[$i] = $LONCAPA::map::order[$i+1]; - } - $#LONCAPA::map::order--; - } elsif ($cmd eq 'up') { - if (($idx) && (defined($LONCAPA::map::order[$idx-1]))) { - my $i=$LONCAPA::map::order[$idx-1]; - $LONCAPA::map::order[$idx-1] = $LONCAPA::map::order[$idx]; - $LONCAPA::map::order[$idx] = $i; - } - } elsif ($cmd eq 'down') { - if (defined($LONCAPA::map::order[$idx+1])) { - my $i=$LONCAPA::map::order[$idx+1]; - $LONCAPA::map::order[$idx+1] = $LONCAPA::map::order[$idx]; - $LONCAPA::map::order[$idx] = $i; - } - } elsif ($cmd eq 'rename') { - my $ratstr = $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]; - my ($rtitle,@rrest)=split(/\:/, - $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]); - my $comment=$env{'form.title'}; - $comment = &LONCAPA::map::qtunescape($comment); - if ($comment=~/\S/) { - $LONCAPA::map::resources[$LONCAPA::map::order[$idx]]= - $comment.':'.join(':',@rrest); - } -# Devalidate title cache - my $renamed_url=&LONCAPA::map::qtescape($rrest[0]); - &Apache::lonnet::devalidate_title_cache($renamed_url); - } -# 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=&LONCAPA::map::getresidx($url); - $LONCAPA::map::resources[$idx]=$_; - $LONCAPA::map::order[$#LONCAPA::map::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.').'

'); - } - } - &log_differences($plain); - } -# ---------------------------------------------------------------- End commands -# ---------------------------------------------------------------- Print screen - my $idx=0; - my $shown=0; - if (($ishidden) || ($isencrypted) || ($randompick>=0) - || ($is_random_order)) { - $r->print('

'.&mt('Parameters').':

'); - } - if ($randompick>=0) { - $r->print('

'.&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. Do not modify the contents of this folder if it is in active student use.').'

'); - } - $r->print(''); - foreach my $res (@LONCAPA::map::order) { - my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]); - $name=&LONCAPA::map::qtescape($name); - $url=&LONCAPA::map::qtescape($url); - unless ($name) { $name=(split(/\//,$url))[-1]; } - unless ($name) { $idx++; next; } - $r->print(&entryline($idx,$name,$url,$folder,$allowed,$res, - $coursenum)); - $idx++; - $shown++; - } - unless ($shown) { - $r->print(''); - } - $r->print("\n
'.&mt('Currently no documents.').'
\n"); - if ($env{'form.markedcopy_url'}) { - $r->print(<
- - -ENDPASTE - $r->print(' '); - - my $type; - if ($env{'form.markedcopy_url'} =~ m{^/adm/wrapper/ext}) { - $type = &mt('External Resource'); - $r->print($type.': '. $env{'form.markedcopy_title'}); - } else { - my $extension = (split(/\./,$env{'form.markedcopy_url'}))[-1]; - my $type = &Apache::loncommon::filedescription($extension); - my $icon = ''; - $r->print($icon.$type.': '. $env{'form.markedcopy_title'}); - } - if ($container eq 'page') { - $r->print(< - -PAGEINFO - } else { - $r->print(< -FOLDERINFO + return $errtext if ($fatal); + } else { + $r->print('

'.&mt('No map selected.').'

'); + } - $r->print('

'); } + &log_differences($plain); + } +# ---------------------------------------------------------------- End commands +# ---------------------------------------------------------------- Print screen + my $idx=0; + my $shown=0; + if (($ishidden) || ($isencrypted) || ($randompick>=0) || ($is_random_order)) { + $r->print('

'.&mt('Parameters').':

    '. + ($randompick>=0?'
  • '.&mt('randomly pick [_1] resources',$randompick).'
  • ':''). + ($ishidden?'
  • '.&mt('contents hidden').'
  • ':''). + ($isencrypted?'
  • '.&mt('URLs hidden').'
  • ':''). + '

'); + } + if ($randompick>=0) { + $r->print('

'.&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(''); + foreach my $res (@LONCAPA::map::order) { + my ($name,$url)=split(/\:/,$LONCAPA::map::resources[$res]); + $name=&LONCAPA::map::qtescape($name); + $url=&LONCAPA::map::qtescape($url); + unless ($name) { $name=(split(/\//,$url))[-1]; } + unless ($name) { $idx++; next; } + $r->print(&entryline($idx,$name,$url,$folder,$allowed,$res, + $coursenum)); + $idx++; + $shown++; + } + unless ($shown) { + $r->print(''); + } + $r->print("\n
'.&mt('Currently no documents.').'
\n"); + if ($allowed) { + &print_paste_buffer($r,$container); } + return; } sub process_file_upload { @@ -1557,7 +1572,7 @@ sub process_file_upload { $parseaction,$allfiles, $codebase); my $ext='false'; - if ($url=~/^http\:\/\//) { $ext='true'; } + if ($url=~m{^http://}) { $ext='true'; } $url = &LONCAPA::map::qtunescape($url); my $comment=$env{'form.comment'}; $comment = &LONCAPA::map::qtunescape($comment); @@ -1572,7 +1587,7 @@ sub process_file_upload { ($errtext,$fatal)=&storemap($coursenum,$coursedom, $folder.'.'.$container); if ($fatal) { - $$upload_output .= '

'.$errtext.'

'; + $$upload_output .= '

'.$errtext.'

'; return 'failed'; } else { if ($parseaction eq 'parse') { @@ -1580,7 +1595,7 @@ sub process_file_upload { if ($total_embedded > 0) { my $num = 0; my $state = ' - + @@ -1589,8 +1604,8 @@ sub process_file_upload { $$upload_output .= 'This file contains embedded multimedia objects, which need to be uploaded to LON-CAPA.
'. - &ask_for_embedded_content('/adm/coursedocs', - $state,$allfiles,$codebase); + &Apache::loncommon::ask_for_embedded_content( + '/adm/coursedocs',$state,$allfiles,$codebase); } else { $$upload_output .= 'No embedded items identified
'; } @@ -1600,55 +1615,6 @@ sub process_file_upload { return $phase_status; } -sub ask_for_embedded_content { - my ($actionurl,$state,$allfiles,$codebase,$args)=@_; - my $upload_output = ' -
'; - $upload_output .= $state; - $upload_output .= 'Upload embedded files:
'. - &Apache::loncommon::start_data_table(); - - my $num = 0; - foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%{$allfiles})) { - $upload_output .= &Apache::loncommon::start_data_table_row(). - ''.$embed_file.''; - if ($args->{'ignore_remote_references'} - && $embed_file =~ m{^\w+://}) { - $upload_output.=''.&mt("URL points to other server.").''; - } elsif ($args->{'error_on_invalid_names'} - && $embed_file ne &Apache::lonnet::clean_filename($embed_file,{'keep_path' => 1,})) { - - $upload_output.=''.&mt("Invalid characters").''; - - } else { - - $upload_output .=' - - '; - my $attrib = join(':',@{$$allfiles{$embed_file}}); - $upload_output .= - "\n\t\t". - ''; - if (exists($$codebase{$embed_file})) { - $upload_output .= - "\n\t\t". - ''; - } - } - $upload_output .= ''.&Apache::loncommon::end_data_table_row(); - $num++; - } - $upload_output .= &Apache::loncommon::end_data_table().'
- - - '.&mt('(only files for which a location has been provided will be uploaded)').' -
'; - return $upload_output; -} - sub process_secondary_uploads { my ($upload_output,$coursedom,$coursenum,$formname,$num,$newidx) = @_; my $folder=$env{'form.folder'}; @@ -1668,46 +1634,73 @@ sub process_secondary_uploads { return $filename; } +sub is_supplemental_title { + my ($title) = @_; + return scalar($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/); +} + +sub parse_supplemental_title { + my ($title) = @_; + + my ($foldertitle,$renametitle); + if ($title =~ /&&&/) { + $title = &HTML::Entites::decode($title); + } + if ($title =~ m/^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/) { + $renametitle=$4; + my ($time,$uname,$udom) = ($1,$2,$3); + $foldertitle=&Apache::lontexconvert::msgtexconverted($4); + my $name = &Apache::loncommon::plainname($uname,$udom); + $name = &HTML::Entities::encode($name,'"<>&\''); + $title=''.&Apache::lonlocal::locallocaltime($time).' '. + $name.':
'.$foldertitle; + } + if (wantarray) { + return ($title,$foldertitle,$renametitle); + } + return $title; +} + # --------------------------------------------------------------- An entry line sub entryline { my ($index,$title,$url,$folder,$allowed,$residx,$coursenum)=@_; - $title=&HTML::Entities::encode($title,'"<>&\''); - my $renametitle=$title; - my $foldertitle=$title; - my $pagetitle=$title; - my $orderidx=$LONCAPA::map::order[$index]; - if ($title=~ /^(\d+)___&&&___($match_username)___&&&___($match_domain)___&&&___(.*)$/ ) { - $foldertitle=&Apache::lontexconvert::msgtexconverted($4); - $renametitle=$4; - $title=''.&Apache::lonlocal::locallocaltime($1).' '. - &Apache::loncommon::plainname($2,$3).':
'. - $foldertitle; + + my ($foldertitle,$pagetitle,$renametitle); + if (&is_supplemental_title($title)) { + ($title,$foldertitle,$renametitle) = &parse_supplemental_title($title); + $pagetitle = $foldertitle; + } else { + $title=&HTML::Entities::encode($title,'"<>&\''); + $renametitle=$title; + $foldertitle=$title; + $pagetitle=$title; } + + my $orderidx=$LONCAPA::map::order[$index]; + + $renametitle=~s/\\/\\\\/g; $renametitle=~s/\"\;/\\\"/g; + $renametitle=~s/ /%20/g; my $line=''; + my ($form_start,$form_end); # Edit commands - my $container; - my $folderpath; + my ($container, $type, $esc_path, $path, $symb); if ($env{'form.folderpath'}) { + $type = 'folder'; $container = 'sequence'; - $folderpath=&escape($env{'form.folderpath'}); + $esc_path=&escape($env{'form.folderpath'}); + $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); # $htmlfoldername=&HTML::Entities::encode($env{'form.foldername'},'<>&"'); } - my ($pagepath,$pagesymb); if ($env{'form.pagepath'}) { - $container = 'page'; - $pagepath=&escape($env{'form.pagepath'}); - $pagesymb=&escape($env{'form.pagesymb'}); + $type = $container = 'page'; + $esc_path=&escape($path = $env{'form.pagepath'}); + $path = &HTML::Entities::encode($env{'form.pagepath'},'<>&"'); + $symb=&escape($env{'form.pagesymb'}); } my $cpinfo=''; - if ($env{'form.markedcopy_url'}) { - $cpinfo='&markedcopy_url='. - &escape($env{'form.markedcopy_url'}). - '&markedcopy_title='. - &escape($env{'form.markedcopy_title'}); - } if ($allowed) { my $incindex=$index+1; my $selectbox=''; @@ -1741,11 +1734,16 @@ sub entryline { my $nocopy=0; my $nocut=0; if ($url=~/\.(page|sequence)$/) { - foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url))) { - my ($title,$url,$ext,$type)=split(/\:/,$_); - if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) { - $nocopy=1; - last; + if ($url =~ m{/res/}) { + # no copy for published maps + $nocopy = 1; + } else { + foreach (&Apache::lonsequence::attemptread(&Apache::lonnet::filelocation('',$url),1)) { + my ($title,$url,$ext,$type)=split(/\:/,$_); + if (($url=~/\.(page|sequence)/) && ($type ne 'zombie')) { + $nocopy=1; + last; + } } } } @@ -1755,82 +1753,65 @@ sub entryline { } my $copylink=' '; my $cutlink=' '; - if ($env{'form.pagepath'}) { - if (!$nocopy) { - $copylink=(< -$lt{'cp'} + + my $skip_confirm = 0; + if ( $folder =~ /^supplemental/ + || ($url =~ m{( /smppg$ + |/syllabus$ + |/aboutme$ + |/navmaps$ + |/bulletinboard$ + |\.html$ + |^/adm/wrapper/ext)}x)) { + $skip_confirm = 1; + } + + if (!$nocopy) { + $copylink=(<$lt{'cp'} ENDCOPY - } - if (!$nocut) { - $cutlink=(< -$lt{'ct'} + } + if (!$nocut) { + $cutlink=(<$lt{'ct'} ENDCUT - } - $line.=(< - - - - - - - - - -
- -$lt{
- -$lt{
-$selectbox - - -$lt{'rm'} -$cutlink - -$lt{'rn'} -$copylink + } + $form_start = (< + + + + END - } else { - if (!$nocopy) { - $copylink=(< -$lt{'cp'} -ENDCOPY - } - if (!$nocut) { - $cutlink=(< -$lt{'ct'} -ENDCUT - } - $line.=(< - - - - - - - - -
- -$lt{
- -$lt{
-$selectbox - - -$lt{'rm'} + $form_end = ''; + $line.=(< + + + + + + + +
+ $lt{ +
+ $lt{ +
+ + + $form_start + $selectbox + $form_end + + + $lt{'rm'} $cutlink - -$lt{'rn'} + $lt{'rn'} $copylink + END - } + } # Figure out what kind of a resource this is my ($extension)=($url=~/\.(\w+)$/); @@ -1858,7 +1839,9 @@ END &Apache::lonnet::allowuploaded('/adm/coursedoc',$url); } } - $url=~s-^http(\&colon\;|:)//-/adm/wrapper/ext/-; + + my $orig_url = $url; + my $external = ($url=~s{^http(|s)(:|:)//}{/adm/wrapper/ext/}); if ((!$isfolder) && ($residx) && ($folder!~/supplemental/) && (!$ispage)) { my $symb=&Apache::lonnet::symbclean( &Apache::lonnet::declutter('uploaded/'. @@ -1881,6 +1864,7 @@ END } } elsif ($url=~m|^/ext/|) { $url='/adm/wrapper'.$url; + $external = 1; } if (&Apache::lonnet::symbverify($symb,$url)) { $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb); @@ -1894,7 +1878,7 @@ END $url.=(($url=~/\?/)?'&':'?').'symb='.&escape($symb); } } - my $parameterset=' '; + my ($parameterset,$rand_order_text) = (' ', ' '); if ($isfolder || $extension eq 'sequence') { my $foldername=&escape($foldertitle); my $folderpath=$env{'form.folderpath'}; @@ -1911,12 +1895,15 @@ END 'parameter_randomorder'))[0]=~/^yes$/i); $url.='folderpath='.&escape($folderpath).$cpinfo; $parameterset=''; - +''.&mt('Save').''; + my $ro_set= + ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':''); + $rand_order_text =' +'; } if ($ispage) { my $pagename=&escape($pagetitle); @@ -1934,38 +1921,55 @@ END $path.$pagearg.'.page'); } $url.='pagepath='.&escape($pagepath). - '&pagesymb='.&escape($symb).$cpinfo; + '&pagesymb='.&escape($symb).$cpinfo; + } + if ($external) { + my $form = ($folder =~ /^default/)? 'newext' : 'supnewext'; + $external = ' '.&mt('Edit').''; + } else { + undef($external); } - $line.=''. - "".($url?"":'').$title. - ($url?'':' '.&mt('(re-initialize course to access)').'').""; + $line.=' + + '.($url?'':'').''.($url?'':'').' + + + '.($url?"":'').$title.($url?'':' '.&mt('(re-initialize course to access)').'').$external." + "; if (($allowed) && ($folder!~/^supplemental/)) { my %lt=&Apache::lonlocal::texthash( 'hd' => 'Hidden', - 'ec' => 'URL hidden', - 'ro' => 'Random Order',); + 'ec' => 'URL hidden'); my $enctext= - ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="checked"':''); + ((&LONCAPA::map::getparameter($orderidx,'parameter_encrypturl'))[0]=~/^yes$/i?' checked="1"':''); my $hidtext= - ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="checked"':''); - my $rotext= - ((&LONCAPA::map::getparameter($orderidx,'parameter_randomorder'))[0]=~/^yes$/i?' checked="checked"':''); + ((&LONCAPA::map::getparameter($orderidx,'parameter_hiddenresource'))[0]=~/^yes$/i?' checked="1"':''); $line.=(< - - - - - -$parameterset + + $form_start + + $form_end + + + $form_start + + $form_end + + $form_start $rand_order_text $form_end + $form_start $parameterset $form_end ENDPARMS } - $line.=""; + $line.=""; return $line; } -# ---------------------------------------------------------------- tie the hash +=pod + +=item tiehash() + +tie the hash + +=cut sub tiehash { my ($mode)=@_; @@ -1991,7 +1995,8 @@ sub untiehash { return OK; } -# --------------------------------------------------------------- check on this + + sub checkonthis { my ($r,$url,$level,$title)=@_; @@ -2000,6 +2005,9 @@ sub checkonthis { $r->rflush(); if (($url) && ($url!~/^\/uploaded\//) && ($url!~/\*$/)) { $r->print("\n
"); + if ($level==0) { + $r->print("
"); + } for (my $i=0;$i<=$level*5;$i++) { $r->print(' '); } @@ -2009,7 +2017,7 @@ sub checkonthis { my $result=&Apache::lonnet::repcopy( &Apache::lonnet::filelocation('',$url)); if ($result eq 'ok') { - $r->print(''.&mt('ok').''); + $r->print(''.&mt('ok').''); $r->rflush(); &Apache::lonnet::countacc($url); $url=~/\.(\w+)$/; @@ -2019,7 +2027,7 @@ sub checkonthis { for (my $i=0;$i<=$level*5;$i++) { $r->print(' '); } - $r->print('- '.&mt('Rendering').': '); + $r->print('- '.&mt('Rendering:').' '); my ($errorcount,$warningcount)=split(/:/, &Apache::lonnet::ssi_body($url, ('grade_target'=>'web', @@ -2027,17 +2035,15 @@ sub checkonthis { if (($errorcount) || ($warningcount)) { if ($errorcount) { - $r->print(''. - $errorcount.' '. - &mt('error(s)').' '); + $r->print(''. + &mt('[quant,_1,error]',$errorcount).''); } if ($warningcount) { - $r->print(''. - $warningcount.' '. - &mt('warning(s)').''); + $r->print(''. + &mt('[quant,_1,warning]',$warningcount).''); } } else { - $r->print(''.&mt('ok').''); + $r->print(''.&mt('ok').''); } $r->rflush(); } @@ -2049,24 +2055,30 @@ sub checkonthis { } } } elsif ($result eq 'unavailable') { - $r->print(''.&mt('connection down').''); + $r->print(''.&mt('connection down').''); } elsif ($result eq 'not_found') { unless ($url=~/\$/) { - $r->print(''.&mt('not found').''); + $r->print(''.&mt('not found').''); } else { - $r->print(''.&mt('unable to verify variable URL').''); + $r->print(''.&mt('unable to verify variable URL').''); } } else { - $r->print(''.&mt('access denied').''); + $r->print(''.&mt('access denied').''); } - } - } + } + } } -# -# ----------------------------------------------------------------- List Symbs -# + +=pod + +=item list_symbs() + +List Symbs + +=cut + sub list_symbs { my ($r) = @_; @@ -2082,9 +2094,7 @@ sub list_symbs { } -# -# -------------------------------------------------------------- Verify Content -# + sub verifycontent { my ($r) = @_; my $type = &Apache::loncommon::course_type(); @@ -2099,9 +2109,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.
')); } } @@ -2115,8 +2125,6 @@ sub verifycontent { } -# -------------------------------------------------------------- Check Versions - sub devalidateversioncache { my $src=shift; &Apache::lonnet::devalidate_cache_new('courseresversion',$env{'request.course.id'}.'_'. @@ -2181,7 +2189,7 @@ sub checkversions { $env{'course.'.$env{'request.course.id'}.'.num'}) eq 'ok') { $r->print('

'.&mt('Your Version Settings have been Saved').'

'); } else { - $r->print('

'.&mt('An Error Occured while Attempting to Save your Version Settings').'

'); + $r->print('

'.&mt('An Error Occured while Attempting to Save your Version Settings').'

'); } &mark_hash_old(); } @@ -2288,10 +2296,10 @@ ENDHEADERS 'lastrevisiondate') ). ''. - 'Most Recent: '. + 'Most Recent: '. ''.$currentversion.''. - ''. - 'In '.$type.': '. + ''. + 'In '.$type.': '. ''); # Used in course my $usedversion=$hash{'version_'.$linkurl}; @@ -2300,8 +2308,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, @@ -2310,7 +2318,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; @@ -2334,7 +2342,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, @@ -2347,7 +2355,7 @@ ENDHEADERS '&versionone='.$prevvers. '">'.&mt('Diffs').''); } - $r->print('
'); + $r->print('
'); if (++$entries_count % $entries_per_col == 0) { $r->print('
'); if ($cols_output != 4) { @@ -2409,23 +2417,22 @@ 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". '
'. '

'. +'" />

'. &mt($message,' '). -$help{'Caching'}.'

'."\n\n"); +$help{'Caching'}.'

'."\n\n"); } -# =========================================== Breadcrumbs for special functions sub init_breadcrumbs { my ($form,$text)=@_; &Apache::lonhtmlcommon::clear_breadcrumbs(); &Apache::lonhtmlcommon::add_breadcrumb({href=>"/adm/coursedocs", - text=>&Apache::loncommon::course_type()." Documents", + text=>"Edit ".&Apache::loncommon::course_type(), faq=>273, bug=>'Instructor Interface', help => 'Docs_Adding_Course_Doc'}); @@ -2435,7 +2442,9 @@ sub init_breadcrumbs { bug=>'Instructor Interface'}); } -# ================================================================ Main Handler + + + sub handler { my $r = shift; &Apache::loncommon::content_type($r,'text/html'); @@ -2498,8 +2507,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)); @@ -2511,8 +2539,8 @@ sub handler { $env{'form.folder'}=pop(@pagepath); $containertag = ''. ''; - $uploadtag = ''. - ''; + $uploadtag = ''. + ''; } if ($r->uri=~/^\/adm\/coursedocs\/showdoc\/(.*)$/) { $showdoc='/'.$1; @@ -2550,8 +2578,9 @@ sub handler { } # -------------------------------------------------------------------- Body tag $script = ''; + my @brcrum = [{href=>"/adm/createuser",text=>"$type Documents"}]; $r->print(&Apache::loncommon::start_page("$type Documents", $script, - {'force_register' => $showdoc,}). + {'force_register' => $showdoc, bread_crumbs => @brcrum}). &Apache::loncommon::help_open_menu('','',273,'RAT')); my %allfiles = (); @@ -2561,9 +2590,13 @@ sub handler { 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); } @@ -2665,6 +2698,7 @@ sub handler { 'bull' => 'Bulletin Board', 'mypi' => 'My Personal Info', 'grpo' => 'Group Files', + 'rost' => 'Course Roster', 'abou' => 'About User', 'imsf' => 'Import IMS package', 'file' => 'File', @@ -2674,6 +2708,7 @@ sub handler { ); # ----------------------------------------------------------------------------- if ($allowed) { + &update_paste_buffer($coursenum,$coursedom); my $dumpbut=&dumpbutton(); my $exportbut=&exportbutton(); my %lt=&Apache::lonlocal::texthash( @@ -2693,58 +2728,72 @@ sub handler { } unless ($env{'form.pagepath'}) { $containertag = ''; - $uploadtag = ''; + $uploadtag = ''; } $r->print(< - - - -$containertag + + + + + $containertag
- -$uploadtag + + $uploadtag
- -
-$help{'Verify_Content'} - - $help{'Check_Resource_Versions'} -$dumpbut -$exportbut - - - - - -
+
+ +
+ $help{'Verify_Content'} +
+
+ $help{'Check_Resource_Versions'} +
+ $dumpbut + $exportbut +
+ +
+
+ + +
+
+
 
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('
'); + if (($standard) && ($allowed) && (!$forcesupplement)) { - $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() } @@ -2759,54 +2808,56 @@ ENDCOURSEVERIFY } my $readfile='/uploaded/'.$coursedom.'/'.$coursenum.'/'.$folder.'.'.$container; $r->print(<
$lt{'uplm'}$lt{'impp'}$lt{'spec'}
+ + + + - + - - - + my $folderseq= + '/uploaded/'.$coursedom.'/'.$coursenum.'/supplemental_'.time. + '.sequence'; + + my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); + $r->print(< + + - -
$lt{'uplm'}$lt{'impp'}$lt{'spec'}
+
$lt{'file'}:
- +
$lt{'title'}:
- + $uploadtag - +
- + - +

- - + + $help{'Uploading_From_Harddrive'} - +
+
$lt{'pubd'}
$uploadtag - +
- - + + $help{'Importing_LON-CAPA_Resource'} - +
- -

+


+

$lt{'copm'}
-
-
+ -$help{'Load_Map'}
+value="$lt{'selm'}" /> +$help{'Load_Map'}


@@ -2820,124 +2871,133 @@ ENDFORM
$uploadtag - + $help{'Adding_External_Resource'} - +

-
ENDFORM } - $r->print('
'); + $r->print(''); unless ($env{'form.pagepath'}) { + my $path = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); $r->print(<
- + - + $help{'Adding_Folders'} - +

- + - + $help{'Adding_Pages'} - +

$uploadtag - +value="$lt{'syll'}=/public/$coursedom/$coursenum/syllabus" /> + $help{'Syllabus'} - +

$uploadtag - +value="$lt{'navc'}=/adm/navmaps" /> + $help{'Navigate_Content'} - +

$uploadtag - + $help{'Simple Page'} - +

$uploadtag - + $help{'Simple Problem'} - +

$uploadtag - + - +

$uploadtag - + $help{'Score_Upload_Form'} - +

$uploadtag - + $help{'Bulletin Board'} - +

$uploadtag - + $help{'My Personal Info'} - +

$uploadtag - + - +

$uploadtag - +value="$lt{'grpo'}=/adm/$coursedom/$coursenum/aboutme" /> + $help{'Group Files'} - + +
+
+$uploadtag + + + +$help{'Course Roster'} +
ENDFORM } @@ -2946,19 +3006,19 @@ ENDFORM
$uploadtag - + $help{'Simple Problem'} - +

$uploadtag - + $help{'Score_Upload_Form'} - +
ENDBLOCK } @@ -2968,7 +3028,7 @@ ENDBLOCK } # ----------------------------------------------------- Supplemental documents if (!$forcestandard) { - $r->print('
'); + $r->print('
'); # '

'.&mt('Supplemental Course Documents'). # ($allowed?' '.$help{'Supplemental'}:'').'

'); my $folder=$env{'form.folder'}; @@ -2976,97 +3036,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'}
$lt{'upls'}$lt{'spec'}
+
- +

- + - +

$lt{'comment'}:

- - - - + + + + $help{'Uploading_From_Harddrive'} - +
+
- + - + $help{'Adding_Folders'} - +

- + - + $help{'Adding_External_Resource'} - +

- + - + $help{'Syllabus'} - +

- + - + $help{'My Personal Info'} - +
ENDSUPFORM } } + $r->print(''); if ($allowed) { - $r->print('
'); + $r->print(' +
+ + + + +
'); } - $r->print(''); } else { unless ($upload_result eq 'phasetwo') { # -------------------------------------------------------- This is showdoc mode $r->print("

".&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).'
'); } } } @@ -3078,10 +3148,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 <